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
Texture-stage state is the first alpha argument for the stage, identified by by D3DTA. The default argument is D3DTA_TEXTURE. If no texture is set for this stage, the default argument is D3DTA_DIFFUSE. Specify D3DTA_TEMP to select a temporary register color for read or write. D3DTA_TEMP is supported if the D3DPMISCCAPS_TSSARGTEMP device capability is present. The default value for the register is (0.0, 0.0, 0.0, 0.0). D3DTSS_ALPHAARG2 Texture-stage state is the second alpha argument for the stage, identified by by D3DTA. The default argument is D3DTA_CURRENT. Specify D3DTA_TEMP to select a temporary register color for read or write. D3DTA_TEMP is supported if the D3DPMISCCAPS_TSSARGTEMP device capability is present. The default value for the register is (0.0, 0.0, 0.0, 0.0).) 这个可以验证,以身体的材质为例: 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的来源。
待续……