1、模型人物的alpha值为什么是正确的,它的alpha来源是哪儿?
这是rtt渲染出的图片:
这是对应的alpha值,可见模型的alpha是正确的,而粒子的alpha值不对应。因此CEGUI将这个image混合到背景图片后粒子显示就不正常了。
2、下面我们研究重点研究模型和粒子的alpha来源。
2.1、对于一般模型有
原则:如果模型的纹理贴图含有alpha通道,则混合后的rtt纹理的alpha就是纹理的alpha;
如果模型的纹理贴图不含alpha通道,则混合后的rtt纹理的alpha来自材质的diffuse的alpha。
(参考Dx9文档
IDirect3DDevice9::SetTextureStageState
D3DTSS_ALPHAOP [指定了本层纹理的alpha来源,默认来自arg1,就是以上原则。]
Texture-stage state is a texture alpha blending operation identified by one member of the D3DTEXTUREOP enumerated type. The default value for the first texture stage (stage 0) is D3DTOP_SELECTARG1, and for all other stages the default is D3DTOP_DISABLE.
D3DTSS_ALPHAARG1
)
这个可以验证,以身体的材质为例:
material 女主角白丁装_高模_01_身体
{
technique
{
pass
{
scene_blend alpha_blend
texture_unit
{
texture 女主角白丁装_高模_01_身体.tga
}
}
}
}
对于上面的rtt图,由于“女主角白丁装_高模_01_身体.tga”不含alpha,因此rtt的alpha来自diffuse,而Ogre默认diffuse 1 1 1 1,因此人物模型的alpha显示全白色。
我们将材质的 diffuse 改为 diffuse 1 1 1 0.4
material 女主角白丁装_高模_01_身体
{
technique
{
pass
{
scene_blend alpha_blend
diffuse 1 1 1 0.4
texture_unit
{
texture 女主角白丁装_高模_01_身体.tga
}
}
}
}
这是混合后的效果,
这是对应的alpha值,可见原则是对的。
以上模型为什么能渲染正确的问题解决了,
2.2、粒子的alpha为什么没正确输出?
这个就得研究粒子的渲染原理了,Ogre中粒子是用renderer billboard渲染的,粒子的纹理的颜色一般是在它的affector ColourFading
中随着时间而变化的,这个变化的修改了纹理的像素值包括alpha值。
这个必须要弄清楚两个来源:
(1)最终渲染出的rtt的rgb来源。
(2)alpha的来源。
待续……