Cocos2d-x 粒子特效:混合模式(Blend Mode)
在Cocos2d-x的粒子特效中,混合模式(Blend Mode)用于控制粒子颜色与背景颜色如何混合,通过设置
source
(源颜色,即粒子颜色)和 dest
(目标颜色,即背景颜色)的混合因子来实现不同的视觉效果。以下是详细介绍: 混合模式理论总结
混合因子(source) | 混合因子(dest) | 混合效果说明 |
---|---|---|
GL_ZERO | GL_ZERO | 源颜色和目标颜色都不参与混合,结果为黑色(透明) |
GL_ONE | GL_ZERO | 仅运用源颜色,直接覆盖目标颜色,粒子显示为原本颜色 |
GL_SRC_COLOR | GL_ONE_MINUS_SRC_COLOR | 源颜色乘以自身,目标颜色乘以(1 - 源颜色),实现一种半透明叠加效果 |
GL_ONE_MINUS_SRC_COLOR | GL_SRC_COLOR | 与GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR 相反,实现另一种半透明叠加效果 |
GL_DST_COLOR | GL_ONE_MINUS_DST_COLOR | 源颜色乘以目标颜色,目标颜色乘以(1 - 目标颜色),产生一种与背景相关的混合效果 |
GL_ONE_MINUS_DST_COLOR | GL_DST_COLOR | 与GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR 相反,混合效果不同 |
GL_SRC_ALPHA | GL_ONE_MINUS_SRC_ALPHA | 常用的半透明混合模式,根据源颜色的透明度来混合,实现自然的透明叠加效果 |
GL_ONE_MINUS_SRC_ALPHA | GL_SRC_ALPHA | 与GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA 相反,效果略有不同 |
GL_DST_ALPHA | GL_ONE_MINUS_DST_ALPHA | 根据目标颜色的透明度来混合 |
GL_ONE_MINUS_DST_ALPHA | GL_DST_ALPHA | 与GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA 相反 |
GL_SRC_ALPHA_SATURATE | GL_ONE | 源颜色的alpha值会被限制在目标颜色的(1 - alpha)范围内,常用于实现边缘柔和的混合效果 |
各混合因子含义及底层算法
GL_ZERO
- 含义:表示不使用该颜色参与混合,贡献值为0。
- 底层算法:在混合计算中,对应颜色分量乘以0。
- 设计目的:用于完全去除某种颜色的影响,比如只想显示背景或粒子其中一个,排除另一个的干扰。
GL_ONE
- 含义:表示启用该颜色的全部值参与混合,贡献值为1。
- 底层算法:在混合计算中,对应颜色分量乘以1。
- 设计目的:让某种颜色完全覆盖另一种颜色,比如直接用粒子颜色覆盖背景。
GL_SRC_COLOR
- 含义:使用源颜色(粒子颜色)自身的值作为混合因子。
- 底层算法:结果颜色分量 = 源颜色分量 * 源颜色分量。
- 设计目的:建立源颜色自身强度相关的混合效果,增强或减弱源颜色在混合中的比重。
GL_ONE_MINUS_SRC_COLOR
- 含义:使用(1 - 源颜色)作为混合因子。
- 底层算法:结果颜色分量 = 源颜色分量 * (1 - 源颜色分量)。
- 设计目的:与源颜色互补的混合,用于达成一些反向叠加效果。
GL_DST_COLOR
- 含义:使用目标颜色(背景颜色)自身的值作为混合因子。
- 底层算法:结果颜色分量 = 源颜色分量 * 目标颜色分量。
- 设计目的:根据背景颜色来调整源颜色的显示,使混合效果与背景相关。
GL_ONE_MINUS_DST_COLOR
- 含义:使用(1 - 目标颜色)作为混合因子。
- 底层算法:结果颜色分量 = 源颜色分量 * (1 - 目标颜色分量)。
- 设计目的:实现与背景颜色互补的混合效果。
GL_SRC_ALPHA
- 含义:运用源颜色的透明度(alpha值)作为混合因子。
- 底层算法:结果颜色分量 = 源颜色分量 * 源alpha值。
- 设计目的:根据粒子的透明度来混合,是实现自然透明效果的常用方式。
GL_ONE_MINUS_SRC_ALPHA
- 含义:使用(1 - 源颜色的透明度)作为混合因子。
- 底层算法:结果颜色分量 = 源颜色分量 * (1 - 源alpha值)。
- 设计目的:实现与源透明度互补的混合,用于一些特殊的透明混合效果。
GL_DST_ALPHA
- 含义:使用目标颜色的透明度(alpha值)作为混合因子。
- 底层算法:结果颜色分量 = 源颜色分量 * 目标alpha值。
- 设计目的:根据背景的透明度来调整粒子的混合效果。
GL_ONE_MINUS_DST_ALPHA
- 含义:使用(1 - 目标颜色的透明度)作为混合因子。
- 底层算法:结果颜色分量 = 源颜色分量 * (1 - 目标alpha值)。
- 设计目的:完成与背景透明度互补的混合效果。
GL_SRC_ALPHA_SATURATE
- 含义:源颜色的alpha值会被限制在目标颜色的(1 - alpha)范围内,以避免过度透明或不透明。
- 底层算法:先计算源alpha值与目标(1 - alpha)的限制关系,再进行混合计算。
- 设计目的:在混合时保持边缘柔和,避免出现过于突兀的透明过渡。
举例演示
下面以简单的粒子系统在纯色背景上的情况为例,假设粒子颜色为红色((1, 0, 0, 1)
),背景颜色为蓝色((0, 0, 1, 1)
):
GL_ZERO, GL_ZERO
:最终颜色为(0, 0, 0, 0)
,即黑色透明,看不到粒子和背景。GL_ONE, GL_ZERO
:最终颜色为(1, 0, 0, 1)
,粒子完全覆盖背景,只看到红色粒子。GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR
:最终颜色为红色和蓝色的一种半透明叠加效果,计算方式为(1 * 1 + 0 * (1 - 1), 0 * 1 + 0 * (1 - 1), 0 * 1 + 1 * (1 - 1), 1 * 1 + 1 * (1 - 1)) = (1, 0, 0, 1)
(简化情况,实际根据alpha计算更复杂),视觉上粒子更突出但有半透明感。GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
:要是粒子alpha为0.5,最终颜色为红色和蓝色的自然透明混合,能看到粒子与背景的融合。
相关知识点科普
- OpenGL混合:Cocos2d-x的混合模式是基于OpenGL的混合机制,OpenGL提供了丰富的混合函数来实现各种复杂的视觉效果,这在图形渲染中是非常要紧的技术,广泛应用于游戏、影视特效等领域。
- Alpha通道:alpha值表示透明度,0表示完全透明,1表示完全不透明。在混合计算中,alpha通道起着关键作用,决定了颜色的叠加程度和透明效果。
通过合理设置混合模式的source
和dest
,可以为粒子特效带来丰富多样的视觉表现,满足不同的游戏和应用需求。
参考资料
Cocos2d-x 粒子系统
Cocos2d-x v3.15 ParticleSystemQuad Class Reference
Advanced-OpenGL/Blending