【问题标题】:Issue converting legacy pipeline to modern openGL将遗留管道转换为现代 openGL 的问题
【发布时间】:2020-05-24 11:10:26
【问题描述】:

我正在将 openGL 1.0 版应用程序转换为更现代的版本。我被困在一个功能上,需要一些帮助。

基本上我们从文件 [.SLC] 格式中读取数据点 然后数据在一个数据结构中 vector<vector<vector<float, float, float>>>

旧的渲染:

for [size of first vector]
   for [size of second vector]

       glBegin(GL_LINE_LOOP);       
           for [size of third vector]
                glVertex3f(float, float, float);
       glEnd();

这个 3 层循环表示一个对象,我试图通过一次调用类似于此的方法来呈现该对象。不过,我似乎无法做到这一点。

glVertexAttribPointer(vp, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), nullptr);
glDrawElements(GL_LINE_LOOP, indices.size() / sizeof(uint32_t), GL_UNSIGNED_INT, NULL);

谁能指出我正确的方向。如果您需要更多信息,请告诉我,我会尝试进一步解释。 谢谢

我的问题是将顶点/索引的集合放在一起发送到渲染函数。

如示例所示,有 3 个循环。我在想,就在第三个循环开始之前开始收集顶点数据。

这部分很简单,但是索引集合让我感到困惑。如果第三个循环有 [N] 顶点我也应该有 [N] 索引。

此时我应该将这 2 个集合发送到渲染函数吗?如果是,那么最终可能会调用数百次渲染函数,那么下一个问题是有没有办法将所有数据组合起来并作为单个调用发送?

【问题讨论】:

  • "vector<vector<vector<float, float, float>>>" 这不是有效的 C++。没有 vector<float, float, float> 这样的类型。
  • 即psedo代码:float,float,float是一个struct

标签: c++ opengl shader vbo


【解决方案1】:

[...] 有没有办法合并所有数据并将其作为单个调用发送?

如果你想用 on draw call 渲染多个GL_LINE_LOOP图元,那么我推荐使用Primitive Restart

基元重启功能允许您告诉 OpenGL 一个特定的索引值意味着,不是在该索引处获取顶点,而是开始一个新的基元

启用GL_PRIMITIVE_RESTART并通过glPrimitiveRestartIndex定义重启索引(例如0xFFFFFFFF):

glEnable( GL_PRIMITIVE_RESTART );
glPrimitiveRestartIndex( 0xFFFFFFFF );

例如如果您想使用索引 (0, 1, 2) 和 (3, 4, 5, 6) 绘制 2 个线循环(使用一次绘制调用),则必须定义以下索引数组:

std::vector<uint32_t> indices{ 0, 1, 2, 0xFFFFFFFF, 3, 4, 5, 6 };

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多