0

我希望使用索引缓冲区绘制具有两种不同颜色的两个三角形(具有一个公共顶点)。我该怎么做?

在不使用索引缓冲区的情况下,只需重复公共顶点数据即可轻松绘制两个这样的三角形。是的,我仍然可以使用索引缓冲区。但在这种情况下,使用索引缓冲区没有任何优势。我的顶点数据如下:

glm::vec4 positions[] = {
    glm::vec4(+0.0f, +0.0f, +0.0f, +1.0f),
    glm::vec4(+1.0f, +1.0f, +0.0f, +1.0f),
    glm::vec4(-1.0f, +1.0f, +0.0f, +1.0f),
    glm::vec4(-1.0f, -1.0f, +0.0f, +1.0f),
    glm::vec4(+1.0f, -1.0f, +0.0f, +1.0f)
    };
glm::vec4 colors[] = {
    glm::vec4(+1.0f, +0.0f, +0.0f, +1.0f),
    glm::vec4(+1.0f, +0.0f, +0.0f, +1.0f),
    glm::vec4(+1.0f, +0.0f, +0.0f, +1.0f),
    glm::vec4(+0.0f, +1.0f, +0.0f, +1.0f),
    glm::vec4(+0.0f, +1.0f, +0.0f, +1.0f)
    };

int indices[] = {
    0, 1, 2,
    0, 3, 4
    };

我通过以下方式设置属性布局:

int positionStride = sizeof(vertex->position) + sizeof(vertex->color);
   int positionOffset = 0;
   glEnableVertexAttribArray(vertex->POSITION);
   glVertexAttribPointer(vertex->POSITION, vertex->position.length(), 
       GL_FLOAT, GL_FALSE, positionStride, (const void*)positionOffset);

int colorStride = sizeof(vertex->color) + sizeof(vertex->position);
   int colorOffset = positionOffset + sizeof(vertex->position);
   glEnableVertexAttribArray(vertex->COLOR);
   glVertexAttribPointer(vertex->COLOR, vertex->color.length(), GL_FLOAT, 
      GL_FALSE, colorStride, (const void*)colorOffset);

我的顶点类定义如下:

class Vertex
{
public:
    Vertex();
    ~Vertex();
    enum Attribute
    {
        POSITION,
        COLOR
    };
}

使用上述设置,我得到了一个完美的红色三角形,但不是预期的绿色三角形。此外,尽管只有两种独特的颜色,但我必须重复这些颜色。由于三角形是形成平面的最简单的几何对象类型,因此在很多情况下,两个相邻的三角形(共享一个或两个顶点)需要使用不同的常量颜色进行渲染。我想利用索引缓冲区,同时还想用恒定颜色渲染两个相邻的三角形。

使用两种独特的颜色而不是 5 种多余的颜色将是一个额外的好处。

有什么有效的方法可以做到这一点吗?

[@Nicol Bolas:我什至在发布这个问题之前检查了那个链接。由于我只能使用一个索引缓冲区,因此诀窍实际上在于对索引进行排序以同时适合位置和颜色数据。但是,有 5 个位置和两种独特的颜色。如果我安排索引以适合该位置,我必须定义

int indices[] = {
    0, 1, 2,
    0, 3, 4
    };

但是,如果我希望拟合颜色数据,我需要索引为

int indices[] = {
    0, 1, 2,
    3, 3, 4
    };

只要我复制颜色。]

4

0 回答 0