ストライプ画面遷移シェーダー

ストライプ画面遷移シェーダー

[Unity UGUI] ストライプ画面遷移シェーダー。
(Stripe Transition Shader)

関連ページ
前回 サークル画面遷移シェーダー を作った経験を生かして、線状に画面を分割したストライプ画面遷移シェーダーを作りました。
思った以上に良いのが出来たので共有します。

ストライプ画面遷移シェーダーの概要

画面を指定の数値で線状に分割し、各区域に指定のディレイをかけて徐々に画面遷移をするシェーダーになります。
言葉で表現すると非常に分かりにくいですが、動画で見ると分かり易いと思います。

ストライプ画面遷移シェーダーのコード全文

以下コード全文です。uGUI Imageへの反映方法は こちらの記事 参照してください。
Shader "UI/StripeTransition"
{
    Properties
    {
        [HideInInspector] _MainTex("-",2D)="white"{}
        [KeywordEnum(L to R, R to L, B to T, T to B)] _Direction("Direction", Int) = 0
        _Transition("Transition", Range(0, 1)) = 0
        _SplitNum("SplitNum", Range(1, 20)) = 1
        _Delay("Delay", Range(0, 0.1)) = 0
    }

    SubShader
    {
        Tags { "Queue" = "Transparent" }
        Cull Off
        ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile _DIRECTION_L_TO_R _DIRECTION_R_TO_L _DIRECTION_B_TO_T _DIRECTION_T_TO_B

            struct appdata
            {
                fixed2 uv : TEXCOORD0;
                fixed4 vertex : POSITION;
                fixed4 color : COLOR;
            };

            struct v2f
            {
                fixed2 uv : TEXCOORD0;
                fixed4 vertex : POSITION;
                fixed4 color : COLOR;
            };

            fixed _Transition;            
            int _SplitNum;
            fixed _Delay;
            sampler2D _MainTex;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                o.color = v.color;
                return o;
            }

            
//uv座標を変形させて、分割された各区画の座標を返す

            
//_SplitNumが1ならシンプルに返り値は0~1の範囲に収まる、_SplitNumが増えると最大値がどんどん減っていく

            fixed getUvPos(fixed2 uv)
            {
#if _DIRECTION_L_TO_R
                fixed targetPos = uv.x;
#elif _DIRECTION_R_TO_L
                fixed targetPos = 1 - uv.x;
#elif _DIRECTION_B_TO_T
                fixed targetPos = uv.y;
#elif _DIRECTION_T_TO_B
                fixed targetPos = 1 - uv.y;
#endif

                fixed threshold = 1 / (fixed)_SplitNum;
                fixed remainder = targetPos % threshold;

                int count = targetPos / threshold;
                return saturate(remainder + count * _Delay);
            }

            
//画像の分割数やdelay値に合わせて、_Transitionの値を変形させて、分割された各区画が閉じる閾値を割り出す

            fixed getFixTransition()
            {
                fixed accel = (1 + (_Delay * _SplitNum * max(1, _SplitNum - 1)));
                return _Transition / (fixed)_SplitNum * accel;
            }     

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                col *= i.color;

                fixed pos = getUvPos(i.uv);
                
//変形させた座標と変形させた閾値の値を比較し、前者が後者より値が小さい場合表示、逆なら表示しない

                fixed alpha = step(pos, getFixTransition());

                col.a = alpha;
                return col;
            }
            ENDCG
        }
    }
}
使い方としては、UI Canvasの一番下に画面全体を覆うようにImageを用意し、そこにマテリアルをアタッチします。

プロパティを開設

用意してあるプロパティは4つです。
StripeTransitionシェーダーのプロパティ
 Direction 
: 画面が閉じていく方向。L to R、R to L、T to B、B to Tの4つがある。
 Transition 
: 遷移が完了するまでの割合。0~1の値を指定できる。
 SplitNum 
: 遷移する際の画面の分割数。1~20までを指定できる。
 Delay 
: 分割された各区分の遷移が始まるまでのDelay値。0~0.1までを指定できる。

下は
Direction
を操作した場合のサンプル動画です。


下は
SplitNum
を操作した場合のサンプル動画です。


下は
delay
を操作した場合のサンプル動画です。

0
0