我已经实现了一个用于 2D 游戏的场景树。树节点包含变换和可绘制对象。
这是场景树的样子:
Root
|
--------------------------
| |
Layer1 Layer2
| |
----------------- ---------
| | | | |
A B C F G
|
---------
| |
D E
为了绘制场景,首先以深度优先顺序遍历树。在遍历期间,可绘制对象被收集在渲染队列中。然后将渲染队列传递给渲染器进行处理。
由于可绘制对象是按深度优先顺序收集的,这也是渲染器绘制它们的顺序。要更改绘图顺序,我必须重新排列树节点。例如,如果我想在节点 F 之前绘制节点 G,我必须交换它们。我想改变它,这样节点就不必再重新排列了。相反,渲染器应该能够自行对渲染队列进行排序。
问题:
每组兄弟节点(例如 [A, B, C] 或 [F, G] 或 [D, E])必须单独排序,以便层次结构保持完整。如果树节点直接排序,这不是问题。但是,如果将树展平为渲染队列,事情就会变得复杂。
我的问题:
如何在不干扰节点层次结构的情况下对渲染队列进行排序?
这类问题有替代解决方案吗?
附加信息:
我能找到的最好的资源是博客文章Order your graphics draw calls around。它解释了如何使用由多个信息块组合而成的 64 位密钥对渲染队列进行排序。不过,它并没有解决我遇到的问题。
你可能会问我为什么不满足于直接对树节点进行排序。有两个原因:首先,我想将关注点分开。重新排列场景树中的节点以使渲染器以正确的顺序绘制它们将不利于实现这一目标。其次,不可能从排序中排除不可见的节点/可绘制对象(而渲染队列仅包含可见的可绘制对象)。