我的目标是使用不同颜色的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个。 我该怎么做?我可以通过使用颜色索引来优化它而不是重复它们吗?
若然,怎么样?
此外,是否可以定义每个细分的宽度?
答案 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(显着更复杂)。