使用 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(明显更复杂)。
我的目标是使用具有不同颜色并尽可能使用不同宽度的 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(明显更复杂)。