【问题标题】:What does adding to a GLuint attribute index do?添加到 GLuint 属性索引有什么作用?
【发布时间】:2016-07-20 01:29:47
【问题描述】:

我目前正在阅读一些代码(特别是 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 mobile virtual-reality oculus


    【解决方案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 个属性索引结束。

    【讨论】:

    • 展开,在这个例子中具体发生的是,示例编写器正在将每个渲染对象的模型转换(通常表示为 mat4)推送到缓冲区中,以便随后它们都可以通过对实例化调用的一次调用呈现。有关更多详细信息,请参阅learnopengl.com/#!Advanced-OpenGL/Instancing,包括作者做了类似但没有使用循环的部分。
    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多