OpenGL:如何在一次调用中绘制多条线带?

标签 opengl vertex-buffer index-buffer

我想绘制多个不同长度的线带。
所有顶点都在一个公共(public)缓冲区中。

顺序如下所示:
v_1_1,v_1_2,v_1_3,v_2_1,v_2_2,v_3_1,..对于每个顶点v_i_j在哪里 i是 strip 的索引,j strip 中顶点的索引。

是否有可能使用索引缓冲区来指定该缓冲区中每个 strip 的开始和结束索引?

或者有什么其他方法可以解决这个问题?

最佳答案

在 OpenGL 中,与其他一些 API 相比,绘制调用开销并不高。问题是绘制调用之间状态变化的开销。因此,优化方面的主要目标应该是减少不同绘制调用之间所需的状态更改次数(尤其是昂贵的状态更改次数)。

但绘制调用并非完全没有成本,而且放弃免费性能是没有意义的,所以使用 primitive restart index.基本上,您所做的是指定一个索引(通常是索引类型的最大索引。16 位索引将使用 0xFFFF)来引用,而不是索引,而是重新启动原语的意图。所以在你的例子中,你会这样做:

v_1_1, v_1_2, v_1_3, 0xFFFF, v_2_1, v_2_2, 0xFFFF, v_3_1,..

您将重新启动索引放在 strip 之间。

原语重启有两种形式:用户定义索引和固定索引。用户自定义索引版本允许你指定什么索引代表“重启”;固定索引始终使用最大索引。

尽管固定索引重启需要更高的 GL 版本(4.3 而不是 3.1),但固定索引版本实际上在所有 GPU 硬件中更通用。例如,OpenGL ES 没有非固定版本,Vulkan 也没有。仅使用最大索引并没有真正的缺点。因此,即使实现不支持固定的重启索引,您也应该始终使用最大索引作为用户定义的重启索引。

关于OpenGL:如何在一次调用中绘制多条线带?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57339334/

相关文章:

delphi - OpenGL Delphi中的渲染错误

c++ - gluBuild2DMipmaps 内存泄漏

opengl - 用 glDrawElements 很难理解索引

language-agnostic - 在 Vulkan 中更新顶点缓冲区的最普遍正确方法

c++ - OpenGL ES 2.0 2D 投影矩阵,将 GLfloat (*)[4] 转换为 GLfloat 时出错

c++ - 使用 OpenGL 插入数据缓冲区?

c++ - 一个接一个地加载对象时,OpenGL indexbuffer 不工作

algorithm - 将多个 .OBJ 索引缓冲区映射/折叠到 OpenGL 的第一个索引缓冲区

objective-c - 如何在 OpenGL 中向网格对象添加顶点?