添加到 GLuint 属性索引有什么作用?

What does adding to a GLuint attribute index do?

我目前正在阅读一些代码(特别是 Oculus Mobile SDK 的示例代码,它只渲染一些漂浮的彩色立方体),他在其中检索顶点着色器属性 glGetAttribLocation(在着色器中它是一个 mat4,它是变换矩阵),然后再往下一点他做了一些添加到着色器属性索引的东西。

VertexTransformAttribute = glGetAttribLocation( Program.Program, "VertexTransform" );

//some stuff happens in between

for ( int i = 0; i < 4; i++ )
{
    GL( glEnableVertexAttribArray( VertexTransformAttribute + i ) );
    GL( glVertexAttribPointer( VertexTransformAttribute + i, 4, GL_FLOAT,
                            false, 4 * 4 * sizeof( float ), (void *)( i * 4 * sizeof( float ) ) ) );
    GL( glVertexAttribDivisor( VertexTransformAttribute + i, 1 ) );
}

在某种程度上,我理解他正在对所有立方体的变换矩阵做一些事情,但我不确定添加到索引中有什么作用。

任何解释这部分的帮助将不胜感激!

每个顶点属性向 OpenGL 提供 4 个值,即使您没有使用全部 4 个值。但是在 GLSL 中,你可以使用 matrices and arrays of types for the type of a vertex shader input variable。由于这些值超过 4 个,因此尽管只声明了一个实际变量,但您需要超过 1 个属性来传递数据。

因此输入变量名称的属性位置是第一个属性索引。并且 OpenGL 会自动连续分配下一个 X 属性索引,以满足您对变量的请求。在 mat4 的情况下,这是一个 4x4 矩阵。所以 OpenGL 需要给它分配总共 4 个属性,每个属性代表矩阵的一列。这些是按顺序分配的,从与变量名称关联的属性索引开始,到后面的 3 个属性索引结束。