渲染之前对对象进行排序


10

我正在尝试实现一个场景图,在我遇到的所有文章中都谈到了对象排序。因此,您可以按“材料”对对象进行排序。现在直到我坐下来并开始执行它,我都认为这是理所当然的,因为它是有道理的。但是现在我想知道排序实际上会发生什么变化?

在我的引擎中,我有一个UBO经理,我使用UBO来存储将在程序之间共享的数据,目前仅涉及时间,相机和投影矩阵以及灯光(我不担心管理哪些灯光会影响哪些对象是ATM)。

现在,对于每个模型,我都必须将模型更改为世界矩阵统一模型,而没有排序方法可以改变它。那么,从更改此矩阵到同时为每个对象设置不好的材质的跳转又是不是?

隐约记得在某处阅读过,每次您更改管道中的某些内容时,都必须将其刷新,这可能会导致性能问题。但是无论如何,对于每个绘图调用,我都会为世界矩阵建立一个模型,因此对这个问题有什么意义呢?

顺便说一句,关于更改制服并调用glBufferSubData是否更(或更少)昂贵,有任何信息。


3
快速回答,是的,从更改矩阵到在每个对象上同时设置材质的跃迁真是太糟糕了。在这一点上,我建议您先进行一次旅行,以了解适用于您平台的OpenGL性能测量工具,然后再继续。使用性能工具,您可以轻松地测量不同的技术,并找出最适合渲染器需求的方法。加上这些工具,将使您在整个职业生涯中一劳永逸,而这个渲染器……就不多了;-)
Patrick Hughes

@PatrickHughes很棒,谢谢,我一定会检查一下
dreta 2012年

Answers:


4

您绝对想对物料进行分类。如果可以,还可以使用实例化将几何图形批处理在一起(例如,如果您有X个相同的对象)。

在按深度进行排序方面,仍然具有价值。您必须对透明对象进行排序(在有限的情况下,忽略一些高级技术可以消除这种需求)。

从前到后对不透明对象进行排序也很有价值,因为它可以使Early-Z大大减少场景的片段着色器开销。


3
对于复杂的情况,排序不透明/透明的对象并不容易(以至于没有任意规则是不可能的)。您也可以按纹理分组,以减少gl调用的相同目的。
Darkwings,2012年

按纹理排序对于批处理调用和减少绘图调用是必需的。排序与减少抽奖次数无关。排序与实际获得正确的渲染(对于透明对象)或最小化片段处理器的开销(对于不透明的对象)有关。是的,“复杂”是一个问题,是的,但这就是使游戏引擎图形程序员付费以使游戏实际上可在商品硬件上玩的东西。仅排序的和未排序的不透明对象之间的硬件效率就非常高。
肖恩·米德迪奇

opengl.org/wiki/Transparency_Sorting这就是我所说的“任意规则”。对于复杂的案例,没有客观的“正确”排序。关于“排序”和“排序”,OP明确表示“按材料排序”(不考虑透明度),并且我对纹理的含义是相同的,因为两者都针对性能影响。
Darkwings,2012年

老实说,我从未见过这类问题在真实游戏中发挥作用。这些示例并没有真正反映出人们实际上是如何做的,透明物体通常具有大致niform的大小,并且具有相当“ boxy”的碰撞边界,这两者都可以防止疯狂的重叠。无论哪种情况,“很难”这一事实都不会改变其必要性。我当然也指出了按物料进行批处理很重要,并提到了实例化以抵消“没有排序可以帮助”的主张,因此我不确定您在我的答案中是否发现了某些具体问题。
肖恩·米德迪奇

看,发表评论并不意味着我在您的答案中发现了错误,而且我从未说过“没有任何帮助”。我已经说过,在某些情况下不存在客观正确的解决方案,因此显然必须使用任意规则找到解决方案。这些是2个完全不同的陈述。
Darkwings,2012年

3

仅按深度对对象进行排序具有巨大的价值,尤其是在分箱或平铺渲染体系结构上。

从前到后对固体进行排序,从后到前对透明胶片进行排序。

渲染时,最接近相机和实体的东西会首先渲染,而其他占用相同空间的东西将被早期的z缓冲区检查拒绝。

如果图形体系结构具有某种层次结构或低分辨率的z缓冲区,则即使在渲染任何东西之前,几何图形也可能会被剔除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.