将遗留管道转换为现代 openGL 的问题

Issue converting legacy pipeline to modern openGL

我正在将 openGL ver 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 个集合发送到渲染函数吗?如果是,那么最终可能会调用数百次渲染函数,所以下一个问题是有没有办法组合所有数据并将其作为单个调用发送?

[...] is there a way to combine all of the data and send it as a single call?

如果要渲染多个GL_LINE_LOOP primitives with on draw call, then I recommend to use Primitive Restart:

Primitive restart functionality allows you to tell OpenGL that a particular index value means, not to source a vertex at that index, but to begin a new Primitive

启用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 };