使用 VBO 绘制不同宽度的彩色线条?

Draw colored lines with different widths using VBOs?

我的目标是使用具有不同颜色并尽可能使用不同宽度的 VBO 呈现段列表。

每个顶点定义为:

class Vector2f {
public:
    float x, y;
};

段列表由定义段的顶点对组成。

然后我初始化VBO:

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vector2f) * segments.size(), &segments[0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

然后我用:

画画
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, sizeof(Vector2f), (void*)(sizeof(float) * 0));
glColor3f(0.0f, 1.0f, 0.0f);
glDrawArrays(GL_LINES, 0, segments.size());
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

在我的示例中,我想为每个段指定一种颜色。颜色是先前定义的,只能是 3 个选项中的 1 个。 我该怎么做?我可以通过使用颜色索引而不是重复它们来优化它吗?

如果是,怎么做?

此外,是否可以定义每个单独段的宽度?

How can I do it?

扩展顶点结构以包含颜色值:

class Vector2f
{
public:
    float x, y;
    unsigned char r, g, b;
};

并使用 GL_COLOR_ARRAY + glColorPointer():

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(2, GL_FLOAT, sizeof(Vector2f), offsetof( Vector2f, x ) );
glColorPointer(3, GL_UNSIGNED_BYTE, sizeof(Vector2f), offsetof( Vector2f, r ) );
glDrawArrays(GL_LINES, 0, segments.size());
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

Also, is it possible to define the width of each individual segment?

不是真正的固定功能。您要么以 glLineWidth() + 每个段的绘制调用结束(失去批处理绘制调用的性能优势),要么 CPU 上的 converting the line into triangle geometry(明显更复杂)。