物件整体透明实现

来源:互联网 发布:多普达p660软件下载 编辑:程序博客网 时间:2024/05/01 17:13

在网上没找到参考代码,自己想了两个办法

1。将物件渲染到纹理上,再把纹理混合到主表面上。zbuffer不用切换,依然使用主表面的zbuffer,这样层次不会乱。这种做法只需要渲染一次,代码稍微复杂点。

2。将整个物件做两次渲染,第一次关闭颜色缓存的渲染,打开zbuffer,作一次渲染。第二个pass打开颜色缓存,作alpha混合 。以为深度值在第一pass已经改变,所以深度值大的点不会输出,也就不会影响到透明效果了。这个因为要作两次渲染,效率可能要低点。我没实际测试过,估计的。这个方法代码最简单了。如果用shader,那更简单了,直接在在shader里面写两个pass就好了。当然物件不能跨technique渲染。

technique RenderSceneWithTexture1Light
{
    pass P0
    {         
        VertexShader = compile vs_1_1 RenderSceneVS( 1, true, false );
        PixelShader  = compile ps_1_1 RenderScenePS( true ); // trivial pixel shader (could use FF instead if desired)
       
        AlphaBlendEnable = false;
        ColorWriteEnable = 0;
    }
    pass P1
    {
        VertexShader = compile vs_1_1 RenderSceneVS( 1, true, false );
        PixelShader  = compile ps_1_1 RenderScenePS( true ); // trivial pixel shader (could use FF instead if desired)
       
        AlphaBlendEnable = true;
        SrcBlend = SRCALPHA;
        DestBlend = INVSRCALPHA;
        ColorWriteEnable = 0xFFFFFFF;
    }
}