我正在尝试将颜色属性发送到我的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);
会发生什么:
当我手动规范化颜色值时,将它们复制到一个浮点数组并将其发送到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);
我在带有OpenGL 3.0环境的AMD显卡上进行了测试。
为什么会这样?我错过了什么吗?
答案 0 :(得分:0)
根据Bahbar的建议,我现在将颜色三元组调整为32位,并且它可以完美地工作。颜色在着色器中正确到达,并且根本没有性能损失。