OpenGL:在 OpenGL-ES 之外,Triangle Strip 中的退化三角形是不是可以接受?
Posted
技术标签:
【中文标题】OpenGL:在 OpenGL-ES 之外,Triangle Strip 中的退化三角形是不是可以接受?【英文标题】:OpenGL: Are degenerate triangles in a Triangle Strip acceptable outside of OpenGL-ES?OpenGL:在 OpenGL-ES 之外,Triangle Strip 中的退化三角形是否可以接受? 【发布时间】:2016-05-10 18:10:17 【问题描述】:在本 OpenGL ES 教程中,解释了优化模型的技术,其中之一是使用三角形条来定义您的网格,使用“退化”三角形来结束一个条并开始另一个条而不结束基元。 http://www.learnopengles.com/tag/degenerate-triangles/
但是,本指南非常针对移动平台,我想知道这种技术是否适用于现代桌面硬件。具体来说,它会伤害吗?它是否会导致图形伪影或降低性能(与将条带拆分为单独的基元相反?)
如果它不会导致伪影并且至少表现得一样好,我打算使用它仅仅是因为它可以更容易地组织我想要绘制的某个网格中的顶点。
【问题讨论】:
【参考方案1】:退化三角形在所有平台上都能很好地工作。我知道一个旧的固定功能控制台与退化三角形作斗争,但任何模糊现代的东西都可以。减少绘图调用的数量总是好的,我肯定会使用退化而不是多次调用 glDrawArrays。
但是,通常表现更好的替代方法是三角形列表的索引绘制。使用三角形列表,您可以灵活地对三角形重新排序,以最大限度地利用转换后缓存。转换后缓存是通过顶点着色器的最后几个顶点的硬件缓存,如果您重新发出相同的顶点并跳过该顶点的整个顶点着色器,GPU 可以发现。
【讨论】:
【参考方案2】:除了上面的答案(不,它根本不应该受到伤害,除非你在真实三角形与退化的比率方面做了一些疯狂的事情),还要注意新版本的 OpenGL 和 OpenGL ES (3. x 或更高版本)API 支持在索引列表中插入中断而不需要实际退化三角形的方法,这称为原始重启。
https://www.khronos.org/opengles/sdk/docs/man3/html/glEnable.xhtml
启用后,您可以为索引类型编码“MAX_INT”,当检测到这会强制 GPU 从下一个索引值重新构建新的 tristrip。
【讨论】:
【参考方案3】:它不会导致伪影。至于“降低性能”……相对于什么?相对于没有索引的随机三角形分类?是的,它会比这更快。
但还有很多其他事情可以做。例如,基元重新启动,它消除了对退化三角形的需要。然后是使用有序的三角形列表来提高缓存的一致性。三角带会比那更快吗?
这取决于您要渲染的内容、顶点着色器的成本以及其他各种因素。
但归根结底,如果您关心特定平台的最大性能,那么您应该针对每个平台进行分析,并根据您所运行的平台选择顶点数据。如果性能真的对您那么很重要,那么您将不得不付出一些努力。
【讨论】:
在问题中,它与将条带拆分为单独的 glDrawArrays() 相关。我只需要知道退化三角形是否有隐藏且显着的成本,因为我现在可以通过在设计阶段采取行动来轻松避免它以上是关于OpenGL:在 OpenGL-ES 之外,Triangle Strip 中的退化三角形是不是可以接受?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 OpenGL-ES 在带有 SDL2 的 Raspberry Pi 上工作?