gpt4 book ai didi

c++ - 如何使用 glVertexAttrib

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:21 37 4
gpt4 key购买 nike

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

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com