20.4 混合与粒子系统
粒子系统一般要使用某种混合方式来绘制。对于像火焰和魔咒这样的效果,我们希望在粒子位置上的颜色变亮。加法混合适于实现这种效果。也就是,我们将源颜色和目标颜色相加。不过,粒子通常是透明的;所以,我们必须通过它的不透明度来调整源粒子颜色;也就是,使用如下混合参数:
SrcBlend = SRC_ALPHA; DestBlend = ONE; BlendOp = ADD;
从而得到混合方程:
C=asCsrc+Cdst
换句话说,不透明度决定了有多少源粒子颜色会融合为最终颜色:粒子的不透明度越大,它融入的颜色就越多。另一种方式是先将纹理颜色与不透明度(由alpha通道描述)相乘,根据不透明度来稀释纹理颜色,然后使用稀释后的纹理。此时,我们使用的混合参数为:
SrcBlend = ONE; DestBlend = ONE; BlendOp = ADD;
这是因为我们提前计算出了Csrc,并把它直接烘焙到了纹理数据里面。
当需要根据粒子密度来决定颜色亮度时,加法混合可以得到非常好的效果(因为加法会把颜色累积在一起);这样,粒子密度越高的区域,颜色亮度就越高,是我们通常想要的结果(参见图20.3)。
加法混合不适合模拟烟雾,因为把一团烟雾粒子叠加在一起会导致烟雾的整体颜色过亮,使烟雾失去本来的暗色调。相比之下,减法混合(D3D11_BLEND_OP_REV_SUBTRACT)更适合模拟烟雾,它会从目标颜色中减去烟雾粒子的颜色。通过这一方式,当烟雾粒子的密度较高时会得到较深的颜色,形成浓烟的效果;当烟雾粒子的密度较低时会得到较浅的颜色,形成青烟的效果。不过,这只适合模拟黑色烟雾,不适合模拟浅灰色或白色烟雾。另一种实现烟雾的方法是使用透明混合,我们把烟雾粒子视为半透明物体,并使用透明混合来渲染它们。但是,当使用透明混合时会存在一个比较大的问题,它需要根据观察点的位置,按照从后向前的顺序对粒子进行排序。这会带来很大的系统开销。由于粒子系统的随机性,这一规定有时会导致出现明显的渲染错误。注意,如果场景中存在许多粒子系统, 那么粒子系统也要按照从后向前的顺序进行排序; 我们不仅要对粒子系统中的粒子进行排序,而且还要在粒子系统之间进行排序。还要注意的是,当使用混合时,不要忘记使用9.5.4和9.5.5节讨论过的内容。
文件下载(已下载 572 次)发布时间:2014/8/30 下午3:10:10 阅读次数:3969