Я работаю над шейдером, который должен записать нормали и глубину мирового пространства объекта в соответствующие буферы, но оставить все остальные 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
}
}
}