Shader "UI/Test2Pass"
{
    //以下は全部インスペクター上には表示しないけど必要な処理
    //ここで宣言しておかないとSceneセーブした時などに値が維持されない    
    Properties 
    {
        [HideInInspector] _MainTex("-", 2D) = "white"{} //uGUI及びGraphics.Blitが標準で扱うテクスチャ

        [HideInInspector] _CustomTex("-", 2D)="white"{}        
        [HideInInspector] _IgnoreRange("-", float) = 0
    }

    SubShader
    {
        Tags
        {
            "RenderPipeline" = "UniversalPipeline"
            "Queue" = "Transparent" 
        }
        Cull Off
        ZWrite Off

        HLSLINCLUDE      
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            //uGUI Image > Source Imageにアタッチされた画像を参照できるようにする
            TEXTURE2D(_MainTex);        
            SAMPLER(sampler_MainTex);  

            //最終的に画面に出力されるテクスチャを宣言、中身のデータはC#側から渡される
            TEXTURE2D(_CustomTex);        
            SAMPLER(sampler_CustomTex); 

            //SRP Batcherを適用、動的に変更される数値はこの中に定義
            CBUFFER_START(UnityPerMaterial)
                half _IgnoreRange;                
            CBUFFER_END
            
            struct Attributes
            {
                half2 uv : TEXCOORD0;
                float4 positionOS : POSITION;
            };

            struct Varyings
            {
                half2 uv : TEXCOORD0;
                float4 positionCS : SV_POSITION;
            };

            Varyings vert (Attributes input)
            {
                Varyings output;
                output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
                output.uv = input.uv;
                return output;
            }
        ENDHLSL    

        //Pass0: 一番上のPassはuGUIのCanvasRendererから自動的に呼び出される、処理的には下のPass1より後に実行される
        Pass
        {        
            //最終出力は背景と合成させる            
            Blend SrcAlpha OneMinusSrcAlpha

            HLSLPROGRAM
                //画像x軸の真ん中あたりの描画を飛ばす            
                half4 frag (Varyings input) : SV_Target
                {    
                    //_MainTexではなく、C#側から書き込みを行った_CustomTexを最終的な描画対象とする
                    //これによりuGUIの標準の描画ロジックを回避して、Pass1の内容を引き継いで出力できる
                    //まずこの_CustomTexから、指定のUV座標のピクセル色を抜き出す
                    half4 original = SAMPLE_TEXTURE2D(_CustomTex, sampler_CustomTex, input.uv);

                    half isRightInUV = step(0.5 + _IgnoreRange, input.uv.x); //渡されたUV座標が画像の右側に存在するか
                    half isLeftInUV = step(input.uv.x, 0.5 - _IgnoreRange); //渡されたUV座標が画像の左側に存在するか
                    half isCenter = 1 - max(isRightInUV, isLeftInUV); //渡されたUV座標がx軸の真ん中あたりかどうか

                    return lerp(original, half4(0, 0, 0, 0), isCenter); //真ん中辺りだったら透明色を渡して描画させない
                }
            ENDHLSL
        }      

        //Pass1: C#から明示的に呼び出す
        Pass
        {     
            //この段階では背景との合成が必要ないのでBlend Off            
            Blend One Zero

            HLSLPROGRAM
                //画像y軸の真ん中あたりの描画を飛ばす
                half4 frag (Varyings input) : SV_Target
                {
                    //SourceImageにアタッチされた画像の、指定UV座標のピクセル色を取得
                    half4 original = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);

                    half isUpInUV = step(0.5 + _IgnoreRange, input.uv.y); //渡されたUV座標が画像の上側に存在するか
                    half isDownInUV = step(input.uv.y, 0.5 - _IgnoreRange); //渡されたUV座標が画像の下側に存在するか
                    half isCenter = 1 - max(isUpInUV, isDownInUV); //渡されたUV座標がy軸の真ん中あたりかどうか

                    return lerp(original, half4(0, 0, 0, 0), isCenter); //真ん中辺りだったら透明色を渡して描画させない
                }
            ENDHLSL
        }          
    }
}