OpenGL:在OpenGL-ES之外,三角带中的退化三角形是否可以接受?

niknxzdl  于 2023-03-02  发布在  其他
关注(0)|答案(3)|浏览(217)

在OpenGL ES的本教程中,介绍了优化模型的技术,其中之一是使用三角形条带定义网格,使用“退化”三角形结束一个条带并开始另一个条带,而不结束图元。http://www.learnopengles.com/tag/degenerate-triangles/
然而,本指南是针对移动的平台的,我想知道这种技术是否适用于现代桌面硬件。具体来说,它是否会 * 伤害 *?它是否会导致图形伪像或降低性能(与将条带拆分为单独的原语相反?)
如果它不会产生伪像,并且至少执行得一样好,我打算使用它,仅仅是因为它使我想绘制的特定网格中的顶点组织更容易。

osh3o9ms

osh3o9ms1#

除了上述答案(不,这根本不会造成伤害,除非你在真实的三角形与退化三角形的比率方面做了一些疯狂的事情),还要注意,较新版本的OpenGL和OpenGL ES(3.x或更高版本)API支持一种方法,即在不需要实际退化三角形的情况下将中断插入索引列表,这被称为图元重新启动。
https://www.khronos.org/opengles/sdk/docs/man3/html/glEnable.xhtml
启用后,您可以为索引类型编码“MAX_INT”,当检测到时,强制GPU从下一个索引值重新开始构建新的三条带。

7kjnsjlb

7kjnsjlb2#

退化三角形在所有平台上都能很好地工作。我知道有一个老的固定函数控制台在处理退化三角形时遇到了困难,但任何稍微现代一点的控制台都可以。减少绘制调用的数量总是好的,我肯定会使用退化函数,而不是多次调用glDrawArrays。
然而,一个通常表现更好的替代方法是三角形列表的索引绘制。使用三角形列表,您可以灵活地重新排序三角形,以最大限度地利用后变换缓存。后变换缓存是经过顶点着色器的最后几个顶点的硬件缓存,GPU可以发现您是否重新发布了相同的顶点,并跳过该顶点的整个顶点着色器。

cgfeq70w

cgfeq70w3#

它不会引起伪像。至于“降低性能”...相对于什么?相对于没有索引的随机分类的三角形?是的,它会比这更快。
但是还有很多其他的事情可以做。例如,图元重新启动,它消除了对退化三角形的需要。然后是使用三角形的有序列表来提高缓存一致性。三角形条带会比这更快吗?
这取决于你渲染的是什么,你的顶点着色器有多贵,以及其他各种各样的事情。
但说到底,如果你关心的是在特定平台上的最大性能,那么你应该为每个平台配置文件,并根据你运行的平台选择顶点数据。如果性能对你来说真的那么重要,那么你就必须付出一些努力。

相关问题