对于我的着色器,我不想为所有绘制调用启用所有属性。例如,在一次绘制调用中,我想为存储在顶点缓冲区中的每个顶点使用不同的颜色。所以我使用glEnableVertexAttribArray
和glVertexAttribPointer
绑定缓冲区,它工作正常。
但是我不能将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);
它不起作用。
答案 0 :(得分:0)
看起来我的问题是颜色属性的位置为0,如果该位置未启用,则不会渲染任何内容。
我将我的位置属性移动到位置0(layout(location = 0) attribute vec3 aVertexPosition;
),我现在可以安全地启用或禁用颜色属性