簇剔除着色
此着色器类型具有类似于计算着色器的执行环境,其中一组着色器调用形成一个工作组,并协作执行粗略级别的几何体剔除和 LOD 选择。着色器调用可以通过新的内置函数发出一组内置输出变量。簇剔除着色器将这些发出的变量组织成后续渲染管线使用的绘制命令。
簇剔除着色器输出
如果一个簇在簇剔除着色器调用中剔除后幸存下来,则应由该着色器调用发出一个绘制此簇的绘制命令,以便进行进一步的渲染处理。有两种类型的绘制命令:索引模式和非索引模式。两种类型的绘制命令都包含一组内置输出变量,这些变量的定义类似于 VkDrawIndexedIndirectCommand 和 VkDrawIndirectCommand 成员。
簇剔除着色器具有以下内置输出变量
-
内置变量
IndexCountHUAWEI
是要绘制的顶点数。 -
内置变量
VertexCountHUAWEI
是要绘制的顶点数。 -
内置变量
InstanceCountHUAWEI
是要绘制的实例数。 -
内置变量
FirstIndexHUAWEI
是索引缓冲区内的基本索引。 -
内置变量
FirstVertexHUAWEI
是要绘制的第一个顶点的索引。 -
内置变量
VertexOffsetHUAWEI
是在索引到顶点缓冲区之前添加到顶点索引的值。 -
内置变量
FirstInstanceHUAWEI
是要绘制的第一个实例的实例 ID。 -
内置变量
ClusterIDHUAWEI
是此绘制命令渲染的簇的索引。启用簇剔除着色器后,ClusterIDHUAWEI
将替换传递给顶点着色器的gl_DrawID
。 -
内置变量
ClusterShadingRate
是此绘制命令渲染的簇的着色率。
簇剔除着色器簇排序
-
当使用簇剔除着色器时,给定工作组中
DispatchClusterHUAWEI
() 生成的所有输出簇在来自后续工作组的任何簇生成之前都会传递到后续管线阶段。 -
在一个工作组中,
DispatchClusterHUAWEI
() 生成的输出簇的顺序由本地调用 ID 指定,从较低的值到较高的值。 -
如果工作组中的任何簇剔除调用不调用
DispatchClusterHUAWEI
(),则不会将任何簇发送到后续渲染管线。 -
任何簇剔除着色器调用也可以多次调用
DispatchClusterHUAWEI
(),如下所示
// Cluster Culling Shader sample code:
......
DispatchClusterHUAWEI(); // dispatch 0
......
DispatchClusterHUAWEI(); // dispatch 1
......
DispatchClusterHUAWEI(); // dispatch 2
......
在这种情况下,工作组中簇的输出序列如下所示(在工作组中有 32 个着色器调用的情况下)
1. shader invocation0.dispatch0
2. shader invocation1.dispatch0,
..........
32. shader invocation31.dispatch0
33. shader invocation0.dispatch1
34. shader invocation1.dispatch1
..........
64. shader invocation31.dispatch1
65. shader invocation0.dispatch2
66. shader invocation1.dispatch2
..........
96. shader Invocation31.dispatch2
簇剔除着色器图元排序
对于簇剔除着色器生成的图元的相对排序,提供了以下保证,因为它们与 图元顺序 相关。
-
对于簇剔除着色器生成的图元的相对排序,仅提供有限的保证,因为它们与图元顺序相关。
-
给定簇中图元的顺序由以下内容指定:
-
DispatchClusterHUAWEI
() 使用索引输出内置变量,顶点来源于从较低索引缓冲区地址到较高地址。 -
DispatchClusterHUAWEI
() 使用非索引输出内置变量,从具有较低编号的 vertexIndex 的顶点到具有较高编号的 vertexIndex 的顶点。
-