OpenGL:OpenGL-ES之外的Triangle Strip中的退化三角形是可以接受的吗?

时间:2016-05-10 18:10:18

标签: c++ opengl opengl-es

在OpenGL ES的本教程中,解释了优化模型的技术,其中之一是使用三角形条来定义网格,使用" degenerate"三角形结束一个条带并开始另一个而不结束基元。 http://www.learnopengles.com/tag/degenerate-triangles/

但是,本指南非常适用于移动平台,我想知道这种技术是否适用于现代桌面硬件。具体来说,伤害会不会?它会导致图形伪像还是降低性能(相反将条带分成单独的原型?)

如果它没有造成任何伪影并且至少也能执行,我的目的是仅仅因为它使我想要绘制的某个网格中的顶点组织起来更容易。

3 个答案:

答案 0 :(得分:5)

退化三角形在所有平台上都能很好地工作。我知道一个旧的固定功能控制台挣扎着堕落的三角形,但任何模糊的现代都会很好。减少绘制调用的数量总是很好,我肯定会使用退化而不是多次调用glDrawArrays。

然而,通常表现更好的替代方案是三角形列表的索引绘制。使用三角形列表,您可以灵活地重新排序三角形,以最大限度地利用变换后缓存。变换后缓存是通过顶点着色器的最后几个顶点的硬件缓存,GPU可以发现您是否重新发出相同的顶点并跳过该顶点的整个顶点着色器。

答案 1 :(得分:4)

除了上面的答案之外(除非你根据真实三角形与退化的比例做一些疯狂的事情,否则它根本不应该受到伤害),同时请注意更新版本的OpenGL和OpenGL ES( 3.x或更高版本)API支持将中断插入索引列表而不需要实际的退化三角形的方法,这称为原始重启。

https://www.khronos.org/opengles/sdk/docs/man3/html/glEnable.xhtml

启用后,您可以编码" MAX_INT"对于索引类型,并在检测到时强制GPU重新开始从下一个索引值构建新的tristrip。

答案 2 :(得分:2)

它不会导致伪影。至于“降低性能”......相对于什么?相对于没有索引的随机分类的三角形?是的,它会比那更快。

但是还有很多其他事情可以做。例如,原始重启,这消除了对退化三角形的需要。然后使用有序的三角形列表来提高缓存一致性。三角形条纹会比这更快吗?

这取决于你渲染的内容,顶点着色器的价格以及各种其他东西。

但最终,如果您关心特定平台上的最高性能,那么您应该为每个平台进行分析,并根据您运行的平台选择顶点数据。如果性能确实 对您很重要,那么您将不得不付出一些努力。