【渲染流水线】[几何阶段]-[图元装配]以UnityURP为例

【从UnityURP开始探索游戏渲染】专栏-直达

前情提要

【渲染流水线】主线索引-从数据到图像以UnityURP为例-CSDN博客

  • 图元装配负责将离散顶点组装成完整几何图元(如点、线、三角形、三角形条带)

对渲染的探索是个持续不断完善的过程,记录这个过程将零散的内容整理起来,其中肯定会有理解偏差和问题,如果哪里有问题,欢迎在评论区探讨和指出)

输入数据

接收‌顶点着色器输出的离散顶点数据‌,包括:

  • 变换后的空间坐标(如裁剪空间位置)
  • 顶点属性(颜色、法线、纹理坐标等

输出数据

生成‌完整几何图元‌(Primitive),例如:

  • 三角形(GL_TRIANGLES
  • 线段(GL_LINES
  • 点(GL_POINTS)‌

在Unity中,图元装配的实现

主要通过‌**网格拓扑(Mesh Topology)‌和‌索引缓冲区(Index Buffer)**‌完成。

顶点分组模式‌

  1. 索引分组模式‌通过索引数组(如Mesh.trianglesMesh.GetIndices())定义顶点连接顺序,每个索引指向顶点缓冲区中的位置,按预设拓扑规则分组‌。例如:

    text
    索引数组 [0,1,2,3,4,5]
    三角形拓扑 → 分组为△(0,1,2)和△(3,4,5)
    
  2. 顺序分组模式‌无索引时直接按顶点提交顺序分组(如连续3顶点构成一个三角形)‌。


‌Unity支持的图元类型‌

图元类型描述
三角形(Triangles每3个独立顶点构成一个三角形,默认用于3D模型渲染‌。
三角形条带(TriangleStrip复用前2顶点与当前顶点生成新三角形,减少顶点重复提交‌。
四边形(Quads每4顶点构成一个四边形(实际渲染时拆分为2个三角形)。
线段(Lines每2顶点构成一条线段,用于线框渲染‌。
点(Points每个顶点独立渲染为屏幕上的点‌。

‌拓扑连接规则‌

  1. 缠绕顺序(Winding Order)‌Unity默认使用‌顺时针顺序‌判定三角形正面,逆时针面会被剔除‌。例如:
    • 顶点顺序(v1,v2,v3)为顺时针 → 可见
    • 顺序(v1,v3,v2)为逆时针 → 剔除‌。
  2. 共享顶点优化‌索引数组可复用顶点(如[0,1,2,1,2,3]生成两个共享边(1,2)的三角形)。

‌关键实现接口‌

  1. 设置拓扑类型‌通过MeshTopology枚举指定图元类型(如MeshTopology.Triangles)‌。
  2. 索引缓冲区操作
    • Mesh.SetIndices():自定义索引分组规则
    • Mesh.triangles:直接设置三角形索引(旧API,效率较低)‌

URP中对图元装配的调用位置与示例

在Unity URP (Universal Render Pipeline) 中,几何阶段的图元装配是由底层渲染管线自动处理的,主要通过ScriptableRenderContextCommandBuffer系统完成。

‌核心类与调用流程‌

  • UniversalRenderPipeline.RenderSingleCamera‌入口点,通过ScriptableRenderContext提交绘制命令
  • ScriptableRenderContext.DrawRenderers‌触发几何处理,最终调用底层图形API (如OpenGL/D3D)
  • CommandBuffer.DrawProcedural‌直接控制图元装配(手动模式)

图元装配示例代码‌

以下是不同图元类型的装配方式示例:

三角形 (Triangles)‌

csharp
// 通过MeshFilter自动装配var meshFilter = GetComponent<MeshFilter>();
Graphics.DrawMesh(meshFilter.sharedMesh, transform.position, transform.rotation, material, 0);

三角形带 (Triangle Strip)‌

csharp
// 手动通过CommandBuffer装配
CommandBuffer cmd = new CommandBuffer();
cmd.DrawProcedural(Matrix4x4.identity,material,0,MeshTopology.TriangleStrip,vertexCount: 4// 需要至少4个顶点形成2个三角形
);
context.ExecuteCommandBuffer(cmd);

四边形 (Quads)‌

csharp
// URP中四边形会被拆分为三角形处理
Mesh quadMesh = new Mesh();
quadMesh.vertices = new Vector3[] {/* 4个顶点 */ };
quadMesh.SetIndices(new int[] {0,1,2, 0,2,3}, MeshTopology.Triangles, 0);
Graphics.DrawMesh(quadMesh, Matrix4x4.identity, material, 0);

线段 (Lines)‌

csharp
// 使用GL.LINES或LineRenderer组件
CommandBuffer cmd = new CommandBuffer();
cmd.DrawProcedural(Matrix4x4.identity,lineMaterial,0,MeshTopology.Lines,vertexCount: 2
);

点 (Points)‌

csharp
// 使用MeshTopology.Points
CommandBuffer cmd = new CommandBuffer();
cmd.DrawProcedural(Matrix4x4.identity,pointMaterial,0,MeshTopology.Points,vertexCount: 1
);

底层实现位置‌

  • URP源码关键文件‌:UniversalRenderPipelineCore.cs → ExecuteRenderPass方法ScriptableRenderer.cs → EnqueuePass提交绘制命令
  • Shader支持‌:在Shader中需声明正确的#pragma target和几何着色器(如需要)

调试

  1. 使用Frame Debugger查看实际提交的图元类型
  2. 在URP设置中启用Native Rendering Debugger
  3. 检查材质的Render QueueShader Pass设置

更深入的管线定制,可继承ScriptableRendererFeature实现自定义几何处理。


【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/2742.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3的简单学习

一、创建应用&#xff08;createApp&#xff09;Vue3 中通过 createApp 函数创建应用实例&#xff0c;替代了 Vue2 的 new Vue()。知识点&#xff1a;createApp(App) 创建应用实例&#xff0c;mount(#app) 挂载到 DOM。应用实例可链式调用配置&#xff08;如全局组件、指令等&a…

v-model双向绑定指令

文章目录前言v-model.lazy 延迟同步v-model.trim 去掉空格前言 v-model指令是Vue.js中实现双向数据绑定的一种重要机制。它可以将表单控件的值与Vue.js实例中的数据进行双向绑定&#xff0c;即当表单控件的值发生变化时&#xff0c;Vue.js实例中的数据也会随之更新&#xff0c…

使用Prometheus + Grafana + node_exporter实现Linux服务器性能监控

监控与告警系统部署&#xff1a;项目示例: "使用Prometheus Grafana node_exporter实现Linux服务器性能监控"描述: 在目标服务器部署node_exporter采集系统指标(CPU, 内存, 磁盘, 网络)。部署配置Prometheus Server&#xff0c;抓取node_exporter数据。部署配置Gra…

2025 蓝桥杯C/C++国B 部分题解

P12836 [蓝桥杯 2025 国 B] 翻倍 题目描述 给定 nnn 个正整数 A1,A2,…,AnA_1, A_2, \ldots, A_nA1​,A2​,…,An​&#xff0c;每次操作可以选择任意一个数翻倍。 请输出让序列单调不下降&#xff0c;也就是每个数都不小于上一个数&#xff0c;最少需要操作多少次&#xff1f;…

在 Mac 上安装 IntelliJ IDEA

在 Mac 上安装 IntelliJ IDEA 步骤。下面我将提供两种最主流的安装方法&#xff0c;并附上详细的图文解说式步骤。 安装前的准备&#xff1a;选择版本 首先&#xff0c;你需要决定安装哪个版本的 IntelliJ IDEA。 版本Ultimate (旗舰版)Community (社区版)价格付费 (提供 30…

云原生时代的 Linux:容器、虚拟化与分布式的基石

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 在云计算与容器化快速发展的今天&#xff0c;Linux 已经不再只是服务器上的操作系统&#xff0c;而是整个云原生生态的底层基石。无论是运…

【普中STM32精灵开发攻略】--第 14 章 动态数码管实验

(1)实验平台&#xff1a; 普中STM32精灵开发板​​​https://item.taobao.com/item.htm?id739076227953(2)资料下载&#xff1a;普中科技-各型号产品资料下载链接 前面章节我们已经介绍了如何使用 STM32 单片机控制IO 输出。本章将介绍数码管显示&#xff0c;在实际应用中通常…

Bitmap 裁剪和拉伸

Drawable 转换成 bitmp fun drawableToBitmap(drawable: Drawable): Bitmap? {if (drawable is BitmapDrawable) {return drawable.bitmap}val width drawable.intrinsicWidthval height drawable.intrinsicHeightval bitmap Bitmap.createBitmap(width, height, Bitmap.Co…

计算机视觉(opencv)——图像本质、数字矩阵、RGB + 基本操作(实战一)

OpenCV 入门教程&#xff1a; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;广泛应用于图像处理、视频分析、机器学习等领域。 在 Python 中&#xff0c;cv2 是 OpenCV 的主要接口模块。本文将带你一步步掌握 cv2…

初识C++类的6个默认成员函数

目录 一、初始化和清理 二、拷贝复制 三、取地址重载 四、重要说明 五、注意事项 六、示例代码 在C中&#xff0c;当一个类没有显式定义某些成员函数时&#xff0c;编译器会自动生成6个默认成员函数。这些函数可以分为以下几类&#xff1a; 一、初始化和清理 1、构造函数…

【tips】css模仿矢量图透明背景

就像棋盘格background-image: linear-gradient(45deg, #f0f0f0 25%, transparent 25%), linear-gradient(-45deg, #f0f0f0 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #f0f0f0 75%), linear-gradient(-45deg, transparent 75%, #f0f0f0 75%);background-…

【高等数学】第八章 向量代数与空间解析几何——第二节 数量积 向量积 混合积

上一节&#xff1a;【高等数学】第八章 向量代数与空间解析几何——第一节 向量及其线性运算 总目录&#xff1a;【高等数学】 目录 文章目录1. 两向量的数量积2. 两向量的向量积3. 向量的混合积1. 两向量的数量积 定义向量a\boldsymbol{a}a和向量b\boldsymbol{b}b的数量积&am…