rtt粒子渲染不正常的一系列问题

    技术2024-12-18  8

    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的来源。

    待续……

     

    最新回复(0)