【问题标题】:VBO - Drawing multiple elements with different colorsVBO - 用不同颜色绘制多个元素
【发布时间】:2018-08-19 16:58:39
【问题描述】:

我正在尝试使用 OpenGL 中的顶点缓冲区对象绘制两个四边形。它们应该用不同的颜色绘制。如您所见,第一个四边形有一个红色、绿色、蓝色和黄色的顶点。第二个四边形有不同的颜色,但问题是第二个四边形被完全绘制为黄色。这是我的代码:

GLfloat vertices[24] = {10.0, 10.0, 0.0,  10.0, -10.0, 0.0,  -10.0, -10.0, 0.0,  -10.0, 10.0, 0.0,
                        20.0, 20.0, 0.0,  20.0, 10.0, 0.0,    10.0, 10.0, 0.0,    10.0, 20.0, 0.0 };    
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 24, vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

GLfloat colors[24] = {1.0, 0.0, 0.0,  0.0, 1.0, 0.0,  0.0, 0.0, 1.0,  1.0, 1.0, 0.0,
                      0.5, 0.5, 0.5,   0.7, 0.2, 1.0,  0.2, 1.0, 0.7,  0.8, 0.0, 0.45 };
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, colorBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLfloat) * 24, colors, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);


glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glVertexPointer(3, GL_FLOAT, 0, 0);

glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, colorBuffer);
glColorPointer(3, GL_FLOAT, 0, 0);

glDrawArrays(GL_QUADS, 0, 8);

四边形是这样绘制的:

第二个四边形是右上角的那个。它应该是多色的,但它是使用颜色缓冲区的第 4 个元素绘制的。我应该怎么做才能解决它?

【问题讨论】:

  • glBindBuffer(GL_ARRAY_BUFFER, colorBuffer); 而不是 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, colorBuffer); 请注意,在您的情况下,buffer 保持绑定并且也用于 glColorPointer
  • @Rabbid76 如果您将评论作为答案,我可以接受。我不明白为什么应该关闭这个问题,它没有违反任何指导方针。

标签: c++ opengl vbo


【解决方案1】:

OpenGL 2.1 Reference Pages; glColorPointer:

glColorPointer 指定渲染时使用的颜色组件数组的位置和数据格式。 ...

如果在指定颜色数组时将非零命名缓冲区对象绑定到GL_ARRAY_BUFFER 目标,则指针将被视为缓冲区对象数据存储中的字节偏移量。

在您的代码中buffer 绑定到目标GL_ARRAY_BUFFER

glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);

然后将colorBuffer绑定到目标GL_ELEMENT_ARRAY_BUFFER并定义颜色数组:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, colorBuffer);
glColorPointer(3, GL_FLOAT, 0, 0);

由于此时buffer 仍绑定到目标GL_ARRAY_BUFFER,因此glColorPointer 使用buffer。这导致顶点坐标被视为颜色,这就是您在渲染中可以看到的。

要解决问题,您必须将 colorBuffer 绑定到目标 GL_ARRAY_BUFFER

glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);

【讨论】:

    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    相关资源
    最近更新 更多