带有索引缓冲区对象的OpenGL颜色

时间:2014-05-17 10:11:39

标签: c++ opengl

我有一个有8个顶点的立方体,我希望每个面都有不同的颜色,我可以通过对每个三角形进行着色,并将颜色传递给顶点超过1次来实现VBO。

但是对于索引缓冲区对象,我只能将1种颜色传递给每个顶点,那么如何为每个面部着色?

GLuint createCube()
{
const float vertices[] = {
    0.25f, 0.25f, -1.25f, 1.0f,
    0.25f, -0.25f, -1.25f, 1.0f,
    -0.25f, 0.25f, -1.25f, 1.0f,
    -0.25f, -0.25f, -1.25f, 1.0f,
    0.25f, 0.25f, -2.75f, 1.0f,
    -0.25f, 0.25f, -2.75f, 1.0f,
    0.25f, -0.25f, -2.75f, 1.0f,
    -0.25f, -0.25f, -2.75f, 1.0f,

            // 8 colors for 8 vertices!
    0.0f, 0.0f, 1.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f,

    1.0f, 0.0f, 0.0f, 1.0f,
    1.0f, 0.0f, 0.0f, 1.0f,
    1.0f, 0.0f, 0.0f, 1.0f,
    1.0f, 0.0f, 0.0f, 1.0f,
};

const GLint indexData[]
{
        0, 1, 2,
        1, 3, 2,
        4, 5, 6,
        6, 5, 7,
        2, 3, 7,
        2, 7, 5,
        0, 6, 1,
        0, 4, 6,
        4, 0, 2,
        4, 2, 5,
        6, 3, 1,
        6, 7, 3,
};

GLuint vao;
glGenVertexArrays(1, &vao);

GLuint vbo;
glGenBuffers(1, &vbo);

GLuint indexObjectBuffer;
glGenBuffers(1, &indexObjectBuffer);

glBindVertexArray(vao);

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);


glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexObjectBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36*4, indexData, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)128);

glBindVertexArray(0);

return vao;
}

输出:

Output

如您所见,正面是蓝色,背面是红色,其他面是混合的。我怎样才能给其他面孔特定的颜色?

1 个答案:

答案 0 :(得分:0)

颜色是每个顶点,而不是每个面,所以你最好的镜头是复制VBO中的顶点。一个顶点是整个数据集(位置,颜色,法线向量,纹理坐标...)如果您需要一些数据不同,那么从技术上讲,您有两个不同的顶点而不是一个。

然而,您可能会通过从第一个顶点获取面部颜色而不是使用平滑着色来破解它。