Как мне избежать записи в определенные g-буферы в Unity? - PullRequest
0 голосов
/ 30 сентября 2018

Я работаю над шейдером, который должен записать нормали и глубину мирового пространства объекта в соответствующие буферы, но оставить все остальные g-буфера нетронутыми.

Возможно ли это?

IЯ добавил фрагмент моего кода ниже, чтобы продемонстрировать, чего я пытаюсь достичь.Проблема с этим подходом заключается в том, что 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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...