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

5
我想绘制不同长度的多条线带,所有顶点都在一个共同的缓冲区中。
顺序如下所示:例如,对于每个顶点v_i_j,其中i是线带的索引,j是线带中顶点的索引:v_1_1,v_1_2,v_1_3,v_2_1,v_2_2,v_3_1,... 有没有可能使用索引缓冲区来指定缓冲区中每条线带的起始和结束索引?
或者有其他解决方法吗?

@NicolBolas 我的意思是线条。三角形不会面临每个基元不同顶点的问题。 - Matthias
1个回答

8
在OpenGL中,相比于其他API,绘制调用开销并不高。问题在于绘制调用之间状态更改的开销。因此,优化的主要目标应该是减少在不同绘制调用之间需要进行的状态更改(特别是昂贵的更改)的数量。
但绘制调用并非完全没有成本,因此没有必要浪费免费的性能,可以使用原始重启索引。基本上,您需要指定一个索引(通常是索引类型的最大索引。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也没有。而使用最大索引没有任何实际缺点。因此,即使实现不支持固定重启索引,您也应始终将最大索引用作用户定义的重启索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接