0

我一直在阅读一些基于 OpenGL 的架构如何管理它们的对象,以便根据我的应用程序的特定需求创建我自己的轻量级引擎(请不要回答“为什么不直接使用这个现有产品”)。我一直在研究的一种架构是 Qt 的 Quick Scene Graph,虽然它很有意义,但我对某些事情感到困惑。

根据他们的文档,不透明基元是从前到后排序的,非透明基元是从后到前排序的。顺序是通过希望消除处理出现在其他像素后面的像素的需要来进行早期 z-killing。这似乎是一种相当普遍的做法,我明白了。这说得通。

他们的文档还讨论了如何将使用相同材质的项目组合在一起以减少状态更改的次数。也就是说,一个共享着色器程序可以绑定一次,然后使用同一个着色器渲染多个项目。这也是有道理的,我很擅长。

我不明白这两种技术如何协同工作。假设我有 3 种不同的材料(为了简化起见,它们都是不透明的)和 100 个项目,每个项目都使用这 3 种材料中的一种,那么理论上我可以根据这些材料创建 3 个批次。但是如果我的 100 个项目在场景中的不同深度怎么办?然后我是否需要创建 3 个以上的批次,以便我可以正确排序项目并将它们从前到后呈现?

根据我对 Ogre 3D 等其他引擎的了解,这两种技术似乎都经常使用,我只是不明白它们是如何一起使用的。

4

1 回答 1

1

如果你真的有 3 种材质,你只能批量按照它们的排序在一个组中渲染的对象。有时,可以针对不相互重叠的对象优化分类,以最大限度地减少材料切换。

所有这一切背后的真正“技巧”是结合材料。如果引擎能够从 3 种源材质中创建一种材质并使用着色器将材质设置正确应用到不同的对象(主要是转换纹理坐标),那么所有东西都可以同时批处理和排序. 但是,如果这不可能,引擎就无法进一步优化它,并且不得不时不时地切换材料。

您不必将场景中的所有材质组合在一起。但是如果可以将那些经常相互切换的材料进行分组,它已经可以大大提高性能。

于 2015-08-03T13:42:06.360 回答