时间:2025-08-15 22:20
人气:
作者:admin
图元装配负责将离散顶点组装成完整几何图元(如点、线、三角形、三角形条带)
【从UnityURP开始探索游戏渲染】专栏-直达
接收顶点着色器输出的离散顶点数据,包括:
生成完整几何图元(Primitive),例如:
GL_TRIANGLES)GL_LINES)GL_POINTS)主要通过网格拓扑(Mesh Topology)和索引缓冲区(Index Buffer)完成。
索引分组模式通过索引数组(如Mesh.triangles或Mesh.GetIndices())定义顶点连接顺序,每个索引指向顶点缓冲区中的位置,按预设拓扑规则分组。例如:
text
索引数组 [0,1,2,3,4,5]
三角形拓扑 → 分组为△(0,1,2)和△(3,4,5)
顺序分组模式无索引时直接按顶点提交顺序分组(如连续3顶点构成一个三角形)。
| 图元类型 | 描述 |
|---|---|
三角形(Triangles) |
每3个独立顶点构成一个三角形,默认用于3D模型渲染。 |
三角形条带(TriangleStrip) |
复用前2顶点与当前顶点生成新三角形,减少顶点重复提交。 |
四边形(Quads) |
每4顶点构成一个四边形(实际渲染时拆分为2个三角形)。 |
线段(Lines) |
每2顶点构成一条线段,用于线框渲染。 |
点(Points) |
每个顶点独立渲染为屏幕上的点。 |
(v1,v2,v3)为顺时针 → 可见(v1,v3,v2)为逆时针 → 剔除。[0,1,2,1,2,3]生成两个共享边(1,2)的三角形)。MeshTopology枚举指定图元类型(如MeshTopology.Triangles)。Mesh.SetIndices():自定义索引分组规则Mesh.triangles:直接设置三角形索引(旧API,效率较低)在Unity URP (Universal Render Pipeline) 中,几何阶段的图元装配是由底层渲染管线自动处理的,主要通过ScriptableRenderContext和CommandBuffer系统完成。
ScriptableRenderContext提交绘制命令以下是不同图元类型的装配方式示例:
csharp
// 通过MeshFilter自动装配var meshFilter = GetComponent<MeshFilter>();
Graphics.DrawMesh(meshFilter.sharedMesh, transform.position, transform.rotation, material, 0);
csharp
// 手动通过CommandBuffer装配
CommandBuffer cmd = new CommandBuffer();
cmd.DrawProcedural(
Matrix4x4.identity,
material,
0,
MeshTopology.TriangleStrip,
vertexCount: 4// 需要至少4个顶点形成2个三角形
);
context.ExecuteCommandBuffer(cmd);
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);
csharp
// 使用GL.LINES或LineRenderer组件
CommandBuffer cmd = new CommandBuffer();
cmd.DrawProcedural(
Matrix4x4.identity,
lineMaterial,
0,
MeshTopology.Lines,
vertexCount: 2
);
csharp
// 使用MeshTopology.Points
CommandBuffer cmd = new CommandBuffer();
cmd.DrawProcedural(
Matrix4x4.identity,
pointMaterial,
0,
MeshTopology.Points,
vertexCount: 1
);
UniversalRenderPipelineCore.cs → ExecuteRenderPass方法ScriptableRenderer.cs → EnqueuePass提交绘制命令#pragma target和几何着色器(如需要)Frame Debugger查看实际提交的图元类型Native Rendering DebuggerRender Queue和Shader Pass设置更深入的管线定制,可继承ScriptableRendererFeature实现自定义几何处理。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,????)