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

时间:2017-11-02 14:39:03

标签: c++ performance opengl colors vbo

我的目标是使用不同颜色的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个。 我该怎么做?我可以通过使用颜色索引来优化它而不是重复它们吗?

若然,怎么样?

此外,是否可以定义每个细分的宽度?

1 个答案:

答案 0 :(得分:2)

  

我该怎么做?

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

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);
  

此外,是否可以定义每个细分的宽度?

不是固定功能。您最终会在每个段上进行glLineWidth() +绘制调用(失去批量绘制调用的性能优势)或在CPU上使用converting the line into triangle geometry(显着更复杂)。