【问题标题】:Draw colored lines with different widths using VBOs?使用 VBO 绘制不同宽度的彩色线条?
【发布时间】:2018-04-15 03:14:20
【问题描述】:

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

如果有,怎么做?

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

【问题讨论】:

    标签: c++ performance opengl colors vbo


    【解决方案1】:

    我该怎么做?

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

    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(明显更复杂)。

    【讨论】:

    • 所以我不能使用索引优化颜色数组?
    • @gdf31:其实不然,OpenGL 不允许为每个属性使用单独的索引数组。
    • @gdf31:老实说,如果你的目标是桌面 OpenGL 顶点数据与少数纹理相比只是微观的。
    • 我可以有一个 std;;vector 与位置的 Vector2f 然后是 Vector3f 颜色等等?在这种情况下如何处理跨步?
    • @gdf31:是的,完全可行。在这种情况下,您可以将 0 用于 strides,因为您的值非常紧凑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多