我一直在阅读一些基于OpenGL的架构如何管理其对象,以便根据我的应用程序的特定需求创建自己的轻量级引擎(请不要"为什么要& #39;你只是使用现有产品"回复)。我一直在研究的一个架构是Qt的快速场景图,虽然它很有道理但我对某些事情感到困惑。
根据他们的文档,不透明基元从前到后排序,非不透明基元从前到后排序。排序是通过希望消除处理出现在其他人后面的像素的需要来进行早期的z杀死。这似乎是一种相当普遍的做法,我明白了。这很有道理。
他们的文档还讨论了如何将使用相同材料的项目一起批处理以减少状态更改的数量。也就是说,共享着色器程序可以绑定一次,然后使用相同的着色器呈现多个项目。这也很有道理,我很擅长。
我不能得到的是这两种技术如何协同工作。假设我有3种不同的材料(让我们说它们都是不透明的简化)和100种每种材料使用3种材料中的一种,那么我理论上可以根据材料创建3批。但如果我的100件物品在场景的不同深度怎么办?那么我是否需要创建超过3批,以便我可以正确地对项目进行排序并将它们从前到后渲染?
根据我读过的其他引擎,例如Ogre 3D,这两种技术似乎都经常使用,我只是不明白它们是如何一起使用的。
答案 0 :(得分:1)
如果您确实有3种材质,则只能批量根据其排序在组中渲染的对象。有时,可以针对彼此不重叠的对象优化排序,以最小化材料切换。
真正的“诀窍”背后是如何组合材料。如果引擎能够从3种源材料中创建单个材质并使用着色器将材质设置正确应用于不同的对象(主要是转换纹理坐标),则可以同时对所有内容进行批处理和排序。但如果不可能,发动机就无法进一步优化它,不得不时不时地切换材料。
您不必将场景中的每个素材组合在一起。但是,如果可以将经常相互切换的材料分组,那么它已经可以提高性能。