OpenGL:如何在一次调用中绘制多条线带?
OpenGL: How to draw multiple line strips in one call?
我想绘制多条不同长度的线条。
所有顶点都在一个公共缓冲区中。
命令如下所示:
v_1_1,v_1_2,v_1_3,v_2_1,v_2_2,v_3_1,..
每个顶点 v_i_j
其中 i
是条带的索引,j
是条带中顶点的索引。
是否可以使用索引缓冲区来指定该缓冲区中每个条带的开始和结束索引?
或解决该问题的任何其他方法?
在 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,..
你把重启索引放在条带之间。
原始重启有两种形式:用户定义的索引和固定的索引。用户定义的索引版本允许您指定索引代表什么"restart";固定索引总是使用最大索引。
即使固定索引重启需要更高的 GL 版本(4.3 而不是 3.1),固定索引版本实际上在所有 GPU 硬件中更普遍。例如,OpenGL ES 没有非固定版本,Vulkan 也没有。仅使用最大索引并没有真正的缺点。因此,即使实现不支持固定重启索引,您也应该始终使用最大索引作为用户定义的重启索引。
我想绘制多条不同长度的线条。 所有顶点都在一个公共缓冲区中。
命令如下所示:
v_1_1,v_1_2,v_1_3,v_2_1,v_2_2,v_3_1,..
每个顶点 v_i_j
其中 i
是条带的索引,j
是条带中顶点的索引。
是否可以使用索引缓冲区来指定该缓冲区中每个条带的开始和结束索引?
或解决该问题的任何其他方法?
在 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,..
你把重启索引放在条带之间。
原始重启有两种形式:用户定义的索引和固定的索引。用户定义的索引版本允许您指定索引代表什么"restart";固定索引总是使用最大索引。
即使固定索引重启需要更高的 GL 版本(4.3 而不是 3.1),固定索引版本实际上在所有 GPU 硬件中更普遍。例如,OpenGL ES 没有非固定版本,Vulkan 也没有。仅使用最大索引并没有真正的缺点。因此,即使实现不支持固定重启索引,您也应该始终使用最大索引作为用户定义的重启索引。