NGUI粒子系统的渲染顺序是怎样的

2015年01月30日 13:48 0 点赞 0 评论 更新于 2025-11-21 15:46

大家都知道NGUI粒子系统,然而对于其渲染顺序,又有多少人了解呢?下面我们就来深入探究NGUI粒子系统的渲染顺序。

在之前,我一直认为只有当当前颜色的alpha值小于0时,使用源颜色的alpha通道(src alpha)才会将图像以半透明的方式绘制到已有的内容上。但在今天进行GLES的点精灵(point sprite)试验时,我发现了不同的情况。我使用了一张24位的粒子纹理图,该图不带alpha通道,其特点是中心亮、边缘渐黑。

在试验中,我使用的混合函数为glBlendFunc(GL_SRC_ALPHA, GL_ONE),结果发现也产生了类似使用alpha通道的效果。接下来,我们复习一下混合(blend)的公式:

假设源颜色是(Rs, Gs, Bs, As),源混合因子是(Sr, Sg, Sb, Sa),目的颜色是(Rd, Gd, Bd, Ad),目的混合因子是(Dr, Dg, Db, Da),并且默认的混合计算采用加法。那么最终混合后的片段颜色为(RsSr + RdDr, GsSg + GdDg, BsSb + BdDb, AsSa + AdDa)。

GL_SRC_ALPHA代表的RGBA混合因子是(As, As, As, As)。由于我使用的这张纹理是24位RGB格式,没有alpha通道,所以As = 1。而GL_ONE代表的RGBA混合因子是(1, 1, 1, 1)。

将这些值带入上述公式,得到的结果是(Rs + Rd, Gs + Gd, Bs + Bd, As + Ad)。这意味着直接将源颜色加到已有的颜色上。因为我的粒子纹理图是中心亮、边缘渐变黑色的,而黑色对应的RGB值为(0, 0, 0),所以在纹理黑色的地方,最终的颜色就是已有的颜色;在亮一点的地方,相当于将灰色加到已有颜色上,会使颜色更加饱和。因此,这种渐变黑色就形成了类似alpha通道的效果。

之后,我又将纹理环境模式设置成GL_MODULATE,并且在绘制粒子时指定一个颜色。这样一来,彩色的颜色会被乘到纹理颜色上,最终纹理呈现出彩色效果,再将其加到背景上就形成了彩色粒子。这种效果与直接在图上设定alpha通道和颜色还是有区别的,但它更适合粒子系统。

下图展示了在蓝色背景上绘制彩色粒子的效果。由于使用了glBlendFunc(GL_SRC_ALPHA, GL_ONE)这种混合方式,可以透过粒子看到部分蓝色背景。如果使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),就看不到背景了,因为粒子纹理上没有alpha通道(alpha === 1)。

(ps: Irrlicht的透明加法颜色材质渲染器就是采用这种方式进行混合的)

作者信息

feifeila

feifeila

共发布了 3994 篇文章