c++ - 如何使用 glVertexAttrib

标签 c++ opengl

对于我的着色器,我不想为所有绘制调用启用所有属性。例如,在一次绘制调用中,我想为存储在顶点缓冲区中的每个顶点使用不同的颜色。所以我使用 glEnableVertexAttribArrayglVertexAttribPointer 来绑定(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/

相关文章:

c++ - 在 C++ 项目的 C 部分 (VS10)

c++ - 2D OpenGL 场景因大量重叠形状而变慢

java - LWJGL wiki 上的示例代码因 GL_INVALID_OPERATION 失败

c++ - 我没有正确编程我的 while 循环

c++ - 逆离散傅里叶变换输出图像

c++ - 如何处理基于 quat 相机的旋转?

performance - 如何为 GUI 进行 OpenGL 实时文本渲染?

c++ - 在 OpenGL 中垂直翻转 FreeType 文本

c++ - 在 OSX 上用 C++ 捕获屏幕图像

c++ - 收集唯一的排序 vector