发送规范化顶点属性会产生垃圾

Sending normalized vertex attribute produces garbage

本文关键字:属性 规范化 顶点      更新时间:2023-10-16

我正在尝试发送一个颜色属性到我的GLSL着色器。

颜色存储在紧密封装的字节数组中,由3个连续字节组成RGB三元组。着色器期望vec3,所以我调用glVertexAttribPointer发送标准化浮点值到着色器。

glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]);
glBufferData(GL_ARRAY_BUFFER, mesh.n_vertices() * 3 * sizeof(GLubyte), color, GL_STATIC_DRAW);
// a little later
glEnableVertexAttribArray(attributes[COLOR]);
glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]);
glVertexAttribPointer(attributes[COLOR], 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0);

结果是:

  1. 颜色似乎没有到达着色器,顶点的颜色是单一的绿色
  2. 应用程序的性能受到严重影响

当我手动规范化颜色值时,将它们复制到浮点数组并将其发送给OpenGL,它渲染没有任何问题:

glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]);
glBufferData(GL_ARRAY_BUFFER, mesh.n_vertices() * 3 * sizeof(GLfloat), colorf, GL_STATIC_DRAW);
// a little later
glEnableVertexAttribArray(attributes[COLOR]);
glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]);
glVertexAttribPointer(attributes[COLOR], 3, GL_FLOAT, GL_FALSE, 0, 0);

我在AMD显卡和opengl3.0环境下测试了这个。

为什么会发生这种情况?我错过什么了吗?

根据Bahbar的建议,我现在将颜色三元组对齐到32位,它完美地工作。颜色在着色器中正确到达,并且没有任何性能影响。