Unity renderTexture 透明通道问题的解决办法

发表于2018-05-24
评论0 9.4k浏览
大家如果在项目上用过renderTexture,会发现unity的renderTexture有个问题,就是用透明的RGBA贴图设置的时候,它会将所有的透明通道信息单独拿出来全部做个乘法叠加,depth only的渲染机制导致,会分开存储透明信息。

出现透明通道后要如何解决呢?此时只能用裁切透明的方式来做一下处理,可以给个权重值,比如大于0.2的不透明度都设置为透明,而且在开启抗锯齿的情况下,这样的opacity Clip也可以过度很柔和了。
SubShader {
        Tags {
            "Queue"="AlphaTest"
            "RenderType"="TransparentCutout"////裁切透明类型
        }
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            AlphaToMask On////开启后,可以在MSAA开启的时候,有柔化透明通道边缘作用
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #define UNITY_PASS_FORWARDBASE
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma multi_compile_fog
            #pragma only_renderers d3d9 d3d11 glcore gles gles3 metal 
            #pragma target 3.0
            uniform float4 _Color;
            struct VertexInput {
                float4 vertex : POSITION;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                UNITY_FOG_COORDS(0)
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.pos = UnityObjectToClipPos( v.vertex );
                UNITY_TRANSFER_FOG(o,o.pos);
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
                clip(_Color.a - 0.5);////用clip裁切透明通道
////// Lighting:
                float3 finalColor = 0;
                fixed4 finalRGBA = fixed4(finalColor,(_Color.a) * 2.0 - 1.0);
                UNITY_APPLY_FOG(i.fogCoord, finalRGBA);
                return finalRGBA;
            }
            ENDCG
        }

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论