混合方程
考虑图 9.1。我们从地形和板条箱开始渲染场景,先绘制地形,再绘制板条箱,使地形和板条箱的像素依次存入后台缓冲区。然后使用混合(blending),将水体绘制到后台缓冲区,使水体像素和后台缓冲区中的地形、板条箱像素融为一体。通过一方式,我们可以透过水体看到地形和板条箱。本章我们主要讲解混合技术,它可以将当前的光栅化像素(也称为源像素)与后台缓冲区中的像素(也称为目标像素)混合(融合)在一起。该技术通常用于渲染半透明物体,比如水和玻璃。
图 9.1 半透明的水面。
注意:为了叙述方便,当我们提到后台缓冲时,指的是渲染目标。但是,我们也可以绘制到一个“离屏,off screene”渲染目标中。混合作用在这些渲染目标的方式是相同的,目标像素的值就是之前光栅化后的离屏渲染目标中的值。
设 C src 为当前正在进行光栅化处理的第 ij 个像素(源像素)的颜色,C dst 为后台缓冲区中的第 ij 个像素(目标像素)的颜色。当不使用混合时,C src 会覆盖 C dst 的值(假设该值已通过深度/模板测试)并成为后台缓冲区中的第 ij 个像素的新颜色。但是当使用混合时,C src和 C dst 会被组合为一个新颜色 C 并覆盖 C dst 的值(即,混合颜色 C 会成为后台缓冲区中的第 ij 个像素的新颜色)。Direct3D 使用如下混合方程混合源像素和目标像素颜色:
图 1 将源颜色和目标颜色相加。由于颜色叠加,所以创建后的图像比原始图像的亮度要高一些。
图 2 将源颜色和目标颜色相乘。
F src (源混合系数)和 F dst(目标混合系数)。对于一些额外的高级混合系数,请参阅 SDK 文档中的 D3D11_BLEND 枚型。设 C src = (r ,g ,b )、A src = (从像素着色器中输出的alpha 值)、C dst = (r ,g ,b )、A dst = (已经储存在渲染目标中的alpha 值)。它们按照各种不同的方式调整源像素和目标像素的比例,实现各种不同的混合效果。运算符⊗是定义的颜色的分量乘法;运算符⊞可以是一个二进制运算符。上述混合方程只负责处理颜色的 RGB 分量。alpha 分量要由另外一个方程来处理:
该方程与前一个方程基本相同,只是使用的混合系数和二进制运算符有些区别。我们将RGB 和 alpha 分开的原因非常简单,就是为了独立地、按照不同的方式处理它们。
注意:我们很少混合 alpha 分量,多数情况下,我们只是对 RGB 分量进行混合。尤其是在本书中,我们从不混合源 alpha 值和目标 alpha 值,虽然 alpha 值会参与我们的 RGB 混合操作。这主要是因为我们暂时用不到后台缓冲区中的 alpha 值。只有当某些算法需要使用目标 alpha 值时,后台缓冲区中的 alpha 值才有用。