关于glVertexAttribPointer索引参数的说明

问题描述

我有一个非常简单的程序,可以在OpenGL中显示3D三角形。我输入的帽子价值,无法正确显示。我将以下数组放入顶点缓冲区

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

然后我将以下内容传递给顶点着色器

glEnabLevertexAttribArray(0);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,sizeof(float) * 7,0);

glEnabLevertexAttribArray(1);
glVertexAttribPointer(1,4,0);

但是,即使位置正确,输出三角形也有一个奇怪的蓝色区域,这没有意义,因为输入颜色应为黑色。我已经看到一些将索引用作sizeof(float)* 3和sizeof(float)* 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的最后一个参数将被视为缓冲区数据存储区中的字节偏移。
color属性的偏移量为3*sizeof(float)个字节:

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

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

该属性包含7个组成部分( x y z r g b a )。顶点坐标的偏移为0,因为这是元组中的前3个分量。颜色的偏移量为3*sizeof(float),因为这是从4到7的分量。