发送标准化顶点属性会产生垃圾

时间:2014-05-15 20:54:49

标签: c++ opengl

我正在尝试将颜色属性发送到我的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. 该应用程序受到了巨大的性能影响
  3. 当我手动规范化颜色值时,将它们复制到一个浮点数组并将其发送到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显卡上进行了测试。

    为什么会这样?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

根据Bahbar的建议,我现在将颜色三元组调整为32位,并且它可以完美地工作。颜色在着色器中正确到达,并且根本没有性能损失。