シェーダーセマンティクス VFACE を使用することで、レンダリングされている面を知ることができる。
using VFACE in surface shader - Unity Forum
Shader "Face" { SubShader { Pass { Cull Off CGPROGRAM #pragma vertex vertex_shader #pragma fragment pixel_shader void vertex_shader (inout float4 vertex:POSITION,inout float2 uv:TEXCOORD0) { vertex = UnityObjectToClipPos(vertex); } float4 pixel_shader (float4 vertex:POSITION,float2 uv:TEXCOORD0, bool IsFacing:SV_IsFrontFace) : SV_TARGET { return IsFacing ? float4(1,0,0,1) : float4(0,0,1,1); } ENDCG } } }
// https://github.com/przemyslawzaworski/Unity3D-CG-programming/blob/master/surface_shaders/vface.shader Shader "Vface" { SubShader { Cull Off CGPROGRAM #pragma target 5.0 #pragma surface SurfaceShader Standard struct Input { float IsFacing:VFACE; }; void SurfaceShader( Input i , inout SurfaceOutputStandard o ) { float4 color = (i.IsFacing>0) ? float4(1,0,0,1) : float4(0,0,1,1); o.Emission = color.rgb; o.Alpha = color.a; } ENDCG } }
下記が1番簡単
fixed4 frag (v2f i,fixed facing:VFACE) : SV_Target { fixed4 col = facing >0 ? fixed4(1,1,1,1):fixed4(1,0,0,1); return col; }