我正在开发一个着色器,该着色器必须将对象的世界空间法线和深度写入相应的缓冲区,但不影响所有剩余的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
}
}
}