有序透明度最基本的使用painters algorithm完成。
画家的算法在对象需要在另一个对象的前面和后面绘制,或者单个对象具有多个透明的子组件的情况下分解。我们不能轻易地将网格的子组件相对于彼此进行排序。
虽然它不能解决问题z-buffer允许我们优化渲染。大多数游戏使用这个稍微复杂的算法作为渲染的基础。
- 呈现所有按材料状态排序的不透明物体或从前到后 以避免透支。
- 渲染所有透明对象从前到后排序。
游戏结合使用各种技术来避免此问题。
将模型拆分为不重叠的透明部分。通常这是隐式完成的,因为游戏的透明对象通常会使用与模型其余部分不同的材质。您还可以使用多层透明度来分割模型,使每个新模型的图层不重叠。例如,您可以将松树模型径向分成5个部分。
这在固定功能管道中更为常见。现代游戏只是试图避免这个问题。
避免模型中的半透明部件。仅将透明度用于消除锯齿边缘,以及透明对象可将场景干净地分割为两个单独的对象组。 (例如Windows或水上飞机)。像这样分裂世界并将这些块前后渲染,可以在不引起其他透明物体明显切除的情况下绘制出抗锯齿边缘。即使它们重叠,只要您的alpha测试设置为高于〜30%,边缘本身往往看起来很好。
半透明物体通常呈现为粒子效果。草和烟是最常见的例子。效果或草地物体组的点列表按每个帧进行排序。这比排序任意子网格要简单得多。许多户外游戏都有复杂的草地和树叶实例系统。这些允许它们渲染单独的叶子和刀片,并且正确地对这些叶片进行排序,并避免以这种方式进行大部分渲染开销,但是它们严格限制对象的类型。
许多效果可以使用加法和减法混合而不是阿尔法混合以独立的顺序完成。
如果您的平滑边缘仍然不可接受,有几个简单的选项。您可以将模型的任何部分以低于75%的透明度抖动。或者,您可以通过使用coverage到alpha来让硬件为您提供没有可见工件的工具。这会导致多重采样硬件抖动透支样本中的边缘。它不会给你一个平滑的渐变,但如果你已经打算使用MSAA,4-16级别的alpha对于抗锯齿边缘是完全可以接受的,并且是免费的。
有很多警告和特殊情况。如果有水,则可能需要使用模板或深度测试渲染任何与水相交的半透明物体两次。
将相机移入和移出透明物体始终存在问题。
渲染复杂的半透明物体几乎是不可能的。就像建筑物或幽灵的X射线视图一样。许多游戏只是将这种类型的对象渲染为叠加。但使用现代硬件,各种更复杂的方案都是可能的。
更复杂的方案
的深度剥离的渲染,你从后到前渲染多遍不同的Z剪切平面复合场景,无论顺序还是什么对象包含字母的方法。它比你所期望的要便宜,因为许多对象只能渲染一个或两个片。但它并不完美,许多游戏开发者认为它太昂贵了。
Order Independent Transparency还有很多其他品种。使用现代化的GPU和计算器,我们可以一次渲染一个缓冲区,其中每个像素都是一堆可能的切片。然后,我们可以对堆栈进行排序并在后处理中混合这些切片,并且只有在像素上有透明层时才会导致性能损失。
OIT仍然大多只用于2.5D游戏(如小大星球)的特殊情况。但我相信它可能最终成为游戏编程的核心工具。
禁用z缓冲时遇到的问题与结束颜色依赖于绘制顺序有关。一种方法是从最远到最近的所有透明对象进行排序,然后按照该顺序进行绘制。在这个页面上有几篇文章:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-10-transparency/它处理确切的问题。 – BWG