我一直在阅读一些基于 OpenGL 的架构如何管理它们的对象,以便根据我的应用程序的特定需求创建我自己的轻量级引擎(请不要回答“为什么不直接使用这个现有产品”)。我一直在研究的一种架构是 Qt 的 Quick Scene Graph,虽然它很有意义,但我对某些事情感到困惑。
根据他们的文档,不透明基元是从前到后排序的,非透明基元是从后到前排序的。顺序是通过希望消除处理出现在其他像素后面的像素的需要来进行早期 z-killing。这似乎是一种相当普遍的做法,我明白了。这说得通。
他们的文档还讨论了如何将使用相同材质的项目组合在一起以减少状态更改的次数。也就是说,一个共享着色器程序可以绑定一次,然后使用同一个着色器渲染多个项目。这也是有道理的,我很擅长。
我不明白这两种技术如何协同工作。假设我有 3 种不同的材料(为了简化起见,它们都是不透明的)和 100 个项目,每个项目都使用这 3 种材料中的一种,那么理论上我可以根据这些材料创建 3 个批次。但是如果我的 100 个项目在场景中的不同深度怎么办?然后我是否需要创建 3 个以上的批次,以便我可以正确排序项目并将它们从前到后呈现?
根据我对 Ogre 3D 等其他引擎的了解,这两种技术似乎都经常使用,我只是不明白它们是如何一起使用的。