如何使用glVertexAttrib

时间:2015-03-02 20:35:43

标签: c++ opengl

对于我的着色器,我不想为所有绘制调用启用所有属性。例如,在一次绘制调用中,我想为存储在顶点缓冲区中的每个顶点使用不同的颜色。所以我使用glEnableVertexAttribArrayglVertexAttribPointer绑定缓冲区,它工作正常。

但是我不能将glVertexAttrib方法用于恒定颜色。我误解了这些方法吗? Can you tell if a vertex attribute is enabled from within a vertex shader?

  

如果禁用某个属性,则其值来自常规OpenGL状态。即,由glVertexAttrib函数设置的状态

但是当我禁用glDisableVertexAttribArray并使用glVertexAttrib将其设置为常量时,它不会呈现任何内容。如果我尝试在着色器中使用该属性,它只会呈现黑色。

我错过了什么?

编辑:

我的代码是这样的(它有一些抽象,但gl函数的调用顺序就是这个)

    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glEnableVertexAttribArray(position);
    glVertexAttribPointer(position, 3, GL_FLOAT, false, sizeof(Vertex), 0);
    glEnableVertexAttribArray(normal);
    glVertexAttribPointer(normal, 3, GL_FLOAT, true, sizeof(Vertex), (void*)(sizeof(Vec3)));
    glEnableVertexAttribArray(color);
    glVertexAttribPointer(color, 4, GL_FLOAT, false, sizeof(Vertex), (void*)(sizeof(Vec3)+sizeof(Vec3)));

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);

    glDrawElements(
        GL_TRIANGLES,
        (edgeCount - 1)*(edgeCount - 1) * 6,
        GL_UNSIGNED_INT,
        (void*)0
        );

当我替换 glEnableVertexAttribArray(color); glVertexAttribPointer(color, 4, GL_FLOAT, false, sizeof(Vertex), (void*)(sizeof(Vec3)+sizeof(Vec3)));

时,这会有效

glDisableVertexAttribArray(color);
glVertexAttrib4f(color, 1.0f, 0.0, 0.0, 1.0);

它不起作用。

1 个答案:

答案 0 :(得分:0)

看起来我的问题是颜色属性的位置为0,如果该位置未启用,则不会渲染任何内容。

我将我的位置属性移动到位置0(layout(location = 0) attribute vec3 aVertexPosition;),我现在可以安全地启用或禁用颜色属性