为什么我们在混合中禁用 Z-write
Why we disable Z-write in blending
在混合中,我们首先在启用 z-write 和测试的情况下绘制不透明对象。然后我们禁用 z-write 并启用测试以绘制半透明对象。在绘制半透明对象时,我们将它们绘制回前面的顺序,那么为什么我们需要禁用写入 z 缓冲区?
因为如果不这样做,它们可能会阻挡稍后将绘制到场景中的其他半透明对象,甚至是同一对象的一部分。你把他们拉回到前面并不意味着阻碍不会发生。
如果您要绘制一个具有某些内部结构的对象,如果先渲染外表面,则不会渲染该对象。凹面物体也会发生类似的事情。此外,从后到前的排序并不总是容易构建,尤其是当场景中有交叉或交织的对象时
如果严格从后向前渲染,则无需禁用深度写入。我可以想到您可能想要禁用它的几个原因:
排序不是很完美。虽然无论哪种方式都得到了错误的渲染结果,但直觉上讲,以错误的顺序混合会导致比完全消除几何体更不明显的伪像。因此,禁用深度写入很可能会减少不完美排序造成的错误。在一般情况下,完美排序并非易事,甚至可能需要拆分多边形。有关困难的更多详细信息,请在此处查看我的回答:Some questions about OpenGL transparency.
避免深度写入可以提高效率。我有点怀疑这是否会非常重要。但总的来说,避免做不必要的工作总是一个好主意。而且既然写深度在这种情况下肯定不需要,你不妨跳过它。
在混合中,我们首先在启用 z-write 和测试的情况下绘制不透明对象。然后我们禁用 z-write 并启用测试以绘制半透明对象。在绘制半透明对象时,我们将它们绘制回前面的顺序,那么为什么我们需要禁用写入 z 缓冲区?
因为如果不这样做,它们可能会阻挡稍后将绘制到场景中的其他半透明对象,甚至是同一对象的一部分。你把他们拉回到前面并不意味着阻碍不会发生。
如果您要绘制一个具有某些内部结构的对象,如果先渲染外表面,则不会渲染该对象。凹面物体也会发生类似的事情。此外,从后到前的排序并不总是容易构建,尤其是当场景中有交叉或交织的对象时
如果严格从后向前渲染,则无需禁用深度写入。我可以想到您可能想要禁用它的几个原因:
排序不是很完美。虽然无论哪种方式都得到了错误的渲染结果,但直觉上讲,以错误的顺序混合会导致比完全消除几何体更不明显的伪像。因此,禁用深度写入很可能会减少不完美排序造成的错误。在一般情况下,完美排序并非易事,甚至可能需要拆分多边形。有关困难的更多详细信息,请在此处查看我的回答:Some questions about OpenGL transparency.
避免深度写入可以提高效率。我有点怀疑这是否会非常重要。但总的来说,避免做不必要的工作总是一个好主意。而且既然写深度在这种情况下肯定不需要,你不妨跳过它。