如何避免在Unity中写入某些g缓冲区?

时间:2018-09-29 22:27:57

标签: unity3d shader

我正在开发一个着色器,该着色器必须将对象的世界空间法线和深度写入相应的缓冲区,但不影响所有剩余的g缓冲区。

这可能吗?

我在下面添加了一段代码,以演示我要实现的目标。这种方法的问题是Unity仍会写入其他g缓冲区(具有默认值)。

Shader "Write Depth and WS-Normals"
{   
    SubShader
    {
        Tags
        {
            "RenderType" = "Opaque"
            "Queue"      = "Geometry"
            "LightMode"  = "Deferred"
        }      
        Pass
        {
            ZWrite On
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag           
            #include "UnityCG.cginc"

            struct appdata
            {
                float3 normal   : NORMAL;
                float4 vertex   : POSITION;
            };

            struct v2f
            {
                float3 normal   : TEXCOORD0;
                float4 vertex   : SV_POSITION;
            };

            v2f vert ( appdata v )
            {
                v2f o;
                o.normal    = mul( unity_ObjectToWorld, float4( v.normal, 0 ) ).xyz;
                o.vertex    = UnityObjectToClipPos( v.vertex );
                return o;
            }

            void frag ( v2f i, out float depthOut : DEPTH, out float4 normalsOut : SV_Target2 )
            {
                normalsOut  = float4( i.normal * 0.5 + 0.5, 1 );
                depthOut    = 1; // Depth established here.
                float alpha = 1; // Alpha established here.

                clip( alpha );
            }
            ENDCG
        }
    }
}

0 个答案:

没有答案