c-关于glVertexAttribPointer索引参数的说明



我有一个非常简单的程序可以在OpenGL中显示三维三角形。我输入的帽子值,它显示不正确。我把下面的数组放入顶点缓冲区

float triangle[] = {
//  x     y       z      r      g      b      a
0.2f, -0.2f, -0.5f,  0.0f,  0.0f,  0.0f,  1.0f,
-0.2f, -0.2f, -0.5f,  0.0f,  0.0f,  0.0f,  1.0f,
-0.2f,  0.2f,  1.0f,  0.0f,  0.0f,  0.0f,  1.0f,
0.0f, -0.2f,  0.0f,  0.0f,  0.0f,  0.0f,  1.0f
};

我使用以下内容将它们传递给顶点着色器

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 7, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 7, 0);

但是输出三角形有一个奇怪的蓝色区域,即使位置正确,这也没有意义,因为输入颜色应该是黑色。我见过一些人将索引用作sizeof(float(*3和sizeof(浮点(*4,但这会使三角形变绿,并导致位置错误。docs.gl条目非常模糊,没有提供任何示例。这是我的着色器

片段着色器

#version 330 core
out vec4 color;
in vec4 outColor;
void main() {
out vec4 outColor;
uniform mat4 transform;
void main() {
gl_Position = transform * inPos;
outColor = inColor;
};

这里怎么了?

如果绑定了命名缓冲区对象,则glVertexAttribPointer的最后一个参数将被视为缓冲区数据存储中的字节偏移量
颜色属性的偏移量为3*sizeof(float)字节:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 7, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 7, 
(void*)(sizeof(float) * 3)); // <--- byte offset

该属性由7个组件组成(xyzr。顶点坐标的偏移量为0,因为这是元组中的前3个组件。颜色的偏移量是3*sizeof(float),因为这是从4到7的分量。

最新更新