5

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

顺序如下所示:

v_1_1,v_1_2,v_1_3,v_2_1,v_2_2,v_3_1,..对于每个顶点v_i_j,其中i是条带j的索引和条带中顶点的索引。

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

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

4

1 回答 1

8

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

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

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

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

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

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

于 2019-08-03T15:31:04.417 回答