C++ 3D世界中的Z阶Alpha混合
我正在制作一个只包含2D精灵的3D世界中的游戏(比如《不要挨饿》游戏)。(带C++的OpenGL ES2) 目前,我正在将元素从前到后排序,然后不进行批处理地绘制它们(因此1个元素=1个drawcall)。我希望在我的框架中实现批处理,以减少draw调用 以下是我目前的情况:C++ 3D世界中的Z阶Alpha混合,c++,opengl,alphablending,batching,C++,Opengl,Alphablending,Batching,我正在制作一个只包含2D精灵的3D世界中的游戏(比如《不要挨饿》游戏)。(带C++的OpenGL ES2) 目前,我正在将元素从前到后排序,然后不进行批处理地绘制它们(因此1个元素=1个drawcall)。我希望在我的框架中实现批处理,以减少draw调用 以下是我目前的情况: 将我的场景的所有元素从后到前排序 将元素的顺序列表发送到渲染器 渲染器在其批处理管理器中查找是否存在具有其材质的给定元素的批 批处理不存在:创建一个新批 具有此材质的元素存在批次:将精灵添加到批次 计算每个批次的所有
- 将我的场景的所有元素从后到前排序
- 将元素的顺序列表发送到渲染器
- 渲染器在其批处理管理器中查找是否存在具有其材质的给定元素的批
- 批处理不存在:创建一个新批
- 具有此材质的元素存在批次:将精灵添加到批次李>
- 计算每个批次的所有精灵的大网格(1种材质类型=1个批次)
- 当所有批处理都正常时,批处理管理器将为渲染器计算绘制命令
- 渲染器处理绘制命令(绑定着色器、绑定纹理、绑定缓冲区、绘制元素)
我如何才能做到这一点?听起来您正试图为两个相互排斥的目标优化渲染
- 按排序的Z顺序渲染以生成正确的透明度结果
- 按材质类型分组的渲染,可能是为了减少因切换材质而引起的GL状态更改的数量
其中一个必须优先于另一个。因为Z排序对于正确的透明度外观至关重要,所以您可能必须优先考虑它。一旦你做到了这一点,你仍然可以自由地在Z-订单中批量生产相同材料的产品 你到底在问什么(怎么做什么)?如何进行Z排序?对于没有blendig的渲染,Z缓冲区就足够了。对于透明对象,您需要根据摄影机视图轴对所有对象进行Z排序,并从后向前绘制。这些都是与我看到的XY平面对齐的平面精灵。排序应该是琐碎的,唯一复杂的事情是草,这是不透明的,所以只需先画。如果您的问题是如何做到这一点,同时尽量减少绘制调用/纹理交换的数量,那么答案是使用精灵表。