顶点着色器 Vertex Shaders
顶点属性(Vertex Attributes)
在图形编程中,尤其是在OpenGL等图形API中,顶点属性(Vertex Attributes)是图形管线处理过程中用于描述每个顶点特征的数据。这些数据通过绘制命令从应用程序传递给图形处理器,并与顶点着色器中的命名属性变量绑定。
-
属性绑定:
- 顶点着色器可以通过location限定符(在GLSL源码中)或SPIR-V着色器的Location装饰指定属性变量到通用顶点属性索引的绑定。
- 应用程序也可以在程序链接前使用
BindAttribLocation
函数明确指定绑定关系。
-
数据类型和组件布局:
- 根据表11.3中列举的标量或向量数据类型声明的属性变量,当其绑定到通用属性索引i时,它的值将来自通用属性i的相应组件。使用的通用属性组件取决于变量的类型以及声明中可能指定的组件布局限定符(参照表11.1)。
- 当矩阵类型的属性变量绑定到通用属性索引i时,其值会来自从i开始连续的通用属性。这样的矩阵被视为一列列向量数组,其中向量的值按照表11.2所示的方式由相应的通用属性成分提供。
- 数组类型的属性变量绑定到通用属性索引i时,活跃的数组元素会被分配到从i开始的连续通用属性上,分配的属性数量和每个元素的组件数根据数组元素的数据类型及其声明中可能指定的组件布局限定符决定。
-
64位双精度类型:
- 对于表11.3中列出的64位双精度类型,如果顶点属性变量的值指定的组件少于该变量所需的组件数量,则不会提供默认值。例如,若一个dvec4类型的变量第四分量通过VertexAttribL3dv或其他只指定三个分量的方法来指定,则该分量将是未定义的。
-
自动绑定:
- 如果在链接程序时,有活动的属性没有通过
BindAttribLocation
、着色器文本内显式设置或SPIR-V二进制代码直接指定绑定,则图形系统(如OpenGL)会自动为这些属性分配通用顶点属性。已分配的绑定可通过GetAttribLocation
函数查询。
- 如果在链接程序时,有活动的属性没有通过
-
链接限制:
- 在链接程序时,如果分配的绑定会导致引用不存在的通用属性(即大于或等于MAX_VERTEX_ATTRIBS的索引),或者对于需要连续多个通用属性的矩阵属性或多维数组属性没有足够的空间进行分配,那么链接操作将会失败。
-
SPIR-V 着色器和
BindAttribLocation
:- 对于SPIR-V着色器,由于SPIR-V规范要求位置必须在着色器文本内部完全指定,因此
BindAttribLocation
函数对其无效。在SPIR-V着色器中,属性的位置必须按照特定章节的规定明确设置。如果同时在SPIR-V着色器内部和通过BindAttribLocation
设置了不同的绑定,将以SPIR-V着色器内部的设置为准。
- 对于SPIR-V着色器,由于SPIR-V规范要求位置必须在着色器文本内部完全指定,因此
Data type | component layout qualifier | Components used |
---|---|---|
scalar | 0 or unspecified | x |
scalar | 1 | y |
scalar | 2 | z |
scalar | 3 | w |
two-component vector | 0 or unspecified | (x, y) |
two-component vector | 1 | (y, z) |
two-component vector | 2 | (z, w) |
three-component vector | 0 or unspecified | (x, y, z) |
three-component vector | 1 | (y, z, w) |
four-component vector | 0 or unspecified | (x, y, z, w) |
table 11.1:属性变量访问的通用属性组件
Data type | Column vector type layout qualifier | Generic attributes used |
---|---|---|
mat2, dmat2 | two-component vector | i, i + 1 |
mat2x3, dmat2x3 | three-component vector | i, i + 1 |
mat2x4, dmat2x4 | four-component vector | i, i + 1 |
mat3x2, dmat3x2 | two-component vector | i, i + 1, i + 2 |
mat3, dmat3 | three-component vector | i, i + 1, i + 2 |
mat3x4, dmat3x4 | four-component vector | i, i + 1, i + 2 |
mat4x2, dmat4x2 | two-component vector | i, i + 1, i + 2, i + 3 |
mat4x3, dmat4x3 | three-component vector | i, i + 1, i + 2, i + 3 |
mat4, dmat4 | four-component vector | i, i + 1, i + 2, i + 3 |
table 11.2: 绑定到通用属性索引i的矩阵变量的列向量所使用的通用属性和向量类型
Data type | Command |
---|---|
int | VertexAttribI1i |
ivec2 | VertexAttribI2i |
ivec3 | VertexAttribI3i |
ivec4 | VertexAttribI4i |