对于我的着色器,我不想为所有绘制调用启用所有属性。例如,在一次绘制调用中,我想为存储在顶点缓冲区中的每个顶点使用不同的颜色。所以我使用 glEnableVertexAttribArray
和 glVertexAttribPointer
来绑定(bind)缓冲区,它工作正常。
但是我不能使用 glVertexAttrib
方法来获得常量颜色。我误解了这些方法吗? Can you tell if a vertex attribute is enabled from within a vertex shader?说是
If an attribute is disabled, its value comes from regular OpenGL state. Namely, the state set by the glVertexAttrib functions
但是当我禁用 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(颜色);
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 (layout(location = 0) attribute vec3 aVertexPosition;
),现在我可以安全地启用或禁用颜色属性
关于c++ - 如何使用 glVertexAttrib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28818997/