20.4 混合与粒子系统

粒子系统一般要使用某种混合方式来绘制。对于像火焰和魔咒这样的效果,我们希望在粒子位置上的颜色变亮。加法混合适于实现这种效果。也就是,我们将源颜色和目标颜色相加。不过,粒子通常是透明的;所以,我们必须通过它的不透明度来调整源粒子颜色;也就是,使用如下混合参数:

SrcBlend = SRC_ALPHA; 
DestBlend = ONE; 
BlendOp = ADD;

从而得到混合方程:

C=asCsrc+Cdst

换句话说,不透明度决定了有多少源粒子颜色会融合为最终颜色:粒子的不透明度越大,它融入的颜色就越多。另一种方式是先将纹理颜色与不透明度(由alpha通道描述)相乘,根据不透明度来稀释纹理颜色,然后使用稀释后的纹理。此时,我们使用的混合参数为:

SrcBlend = ONE; 
DestBlend = ONE; 
BlendOp = ADD;

这是因为我们提前计算出了Csrc,并把它直接烘焙到了纹理数据里面。

当需要根据粒子密度来决定颜色亮度时,加法混合可以得到非常好的效果(因为加法会把颜色累积在一起);这样,粒子密度越高的区域,颜色亮度就越高,是我们通常想要的结果(参见图20.3)。

图20.3
图20.3 当使用加法混合时, 火焰中心的亮度较高,因为这里叠加在一起的粒子数量较多。随着粒子散开,叠加在一起的粒子会越来越少,亮度会逐渐降低。

加法混合不适合模拟烟雾,因为把一团烟雾粒子叠加在一起会导致烟雾的整体颜色过亮,使烟雾失去本来的暗色调。相比之下,减法混合(D3D11_BLEND_OP_REV_SUBTRACT)更适合模拟烟雾,它会从目标颜色中减去烟雾粒子的颜色。通过这一方式,当烟雾粒子的密度较高时会得到较深的颜色,形成浓烟的效果;当烟雾粒子的密度较低时会得到较浅的颜色,形成青烟的效果。不过,这只适合模拟黑色烟雾,不适合模拟浅灰色或白色烟雾。另一种实现烟雾的方法是使用透明混合,我们把烟雾粒子视为半透明物体,并使用透明混合来渲染它们。但是,当使用透明混合时会存在一个比较大的问题,它需要根据观察点的位置,按照从后向前的顺序对粒子进行排序。这会带来很大的系统开销。由于粒子系统的随机性,这一规定有时会导致出现明显的渲染错误。注意,如果场景中存在许多粒子系统, 那么粒子系统也要按照从后向前的顺序进行排序; 我们不仅要对粒子系统中的粒子进行排序,而且还要在粒子系统之间进行排序。还要注意的是,当使用混合时,不要忘记使用9.5.4和9.5.5节讨论过的内容。

文件下载(已下载 572 次)

发布时间:2014/8/30 下午3:10:10  阅读次数:3969

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号