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

Posted

技术标签:

【中文标题】OpenGL:如何在一次调用中绘制多条线带?【英文标题】:OpenGL: How to draw multiple line strips in one call? 【发布时间】:2019-08-03 14:41:22 【问题描述】:

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

顺序如下:

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

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

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

【问题讨论】:

@NicolBolas 我的意思是线条。三角形不会面临每个图元不同顶点的问题。 【参考方案1】:

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

但是draw call也不是完全没有成本的,丢掉免费性能也没有意义,所以使用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,..

你把重启索引放在条带之间。

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

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

【讨论】:

以上是关于OpenGL:如何在一次调用中绘制多条线带?的主要内容,如果未能解决你的问题,请参考以下文章

在一张图中绘制多条线[重复]

如何使用 VBO 和单个 OpenGL drawelements 调用绘制多个对象?

matlab里一次画两条曲线怎么编程?

如何在 OpenGL 中的单个绘制调用上绘制多个顶点数组?

OpenGL中的动态VBO

如何在matlab同一个图形上绘制多条曲线