memomem

備忘録・メモ置き場

Unity Shader VFACE

シェーダーセマンティクス VFACE を使用することで、レンダリングされている面を知ることができる。

シェーダーセマンティクス - Unity マニュアル

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;
}

その他参考

【Unityシェーダ入門】ポリゴンの表面と裏面に別テクスチャを貼る - おもちゃラボ

Unity Shader内で面の裏と表を取得する - 夜風のMixedReality