Vertex and fragment shader 9 - 2D過場淡入淡出(Fade in/out) - X型切除(單純/旋轉)

  接著來個比較簡單清爽的效果,對角線的切除以及米型的旋轉,雖然簡單但是效果也還算不錯。

*型旋轉的效果


單純X形切除呈現的效果大概是這樣





  這邊以*型旋轉來看,同樣設定基本屬性,材質、顏色、切除的量、切除的方向,這邊多一個設定角度的參數,來設定每一等份的角度是多少,以上圖來說設定45度,可以看到就是切成8份(360/45=8)。
_MainTex ("Base (RGB)", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
_Amount ("Amount", Range (0,1)) = 0
_Direction ("Direction", Range(0,1)) = 1
_Angle ("Angle", Float) = 45


  輸出的時候先取得該座標點的角度,調整位置後減掉一定值若小於0就刪去,最後再乘上切除方向調整參數。
if (position.x != 0.0 && position.y != 0.0){
   angle = degrees(atan(position.y/position.x)) ;
}
clip ((1-_Direction*2)*(frac(angle/_Angle)-_Amount));


  最後在Unity當中使用的時候,調整 _Amount 調整切除的量,調整 _Direction 切除的方向,最後調整每個等分的角度,如果是單純X型切除的部分,就只有調整切除的量而已。


注意,因為使用的是螢幕座標,所以會是以遊戲顯示畫面的中心去等分。


  這邊是單純X型切除,我這邊就只是做簡單的運算,X座標減去Y座標再減去某一個值小於0就切除,這只會形成單一條斜線,因此再做另一個對角線的刪去就得到X型的切除。
float4 textureColor = tex2D(_MainTex, input.uv);
if(abs(input.screenPos.x - input.screenPos.y) - _Amount*0.5 < 0 || abs(input.screenPos.x - (1-input.screenPos.y)) - _Amount*0.5 < 0) discard;
return textureColor * _Color;


完整Shader Code(*型)
Shader "Custom/Fading" 
{
   Properties
   {
      _MainTex ("Base (RGB)", 2D) = "white" {}
      _Color ("Color", Color) = (1,1,1,1)
      _Amount ("Amount", Range (0,1)) = 0
      _Direction ("Direction", Range(0,1)) = 1
      _Angle ("Angle", Float) = 45
   }

   SubShader {
      Pass {
         Cull Off
         Lighting Off
         ZWrite Off
         Blend SrcAlpha OneMinusSrcAlpha

         CGPROGRAM

         #pragma vertex vert
         #pragma fragment frag

         uniform sampler2D _MainTex;
         uniform float4 _Color;
         uniform float _Amount;
         uniform float _Direction;
         uniform float _Angle;

         struct vertexInput {
            float4 vertex : POSITION;
            float4 texcoord : TEXCOORD0;
         };
         struct vertexOutput {
            float4 pos : SV_POSITION;
            float2 uv : TEXCOORD0;
            float4 screenPos : TEXCOORD5;
         };

         vertexOutput vert(vertexInput input)
         {
            vertexOutput output;

            output.uv = input.texcoord;
            output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
            output.screenPos = output.pos * 0.5 + 0.5;
            return output;
         }

         half4 frag(vertexOutput input) : COLOR
         {
            float4 textureColor = tex2D(_MainTex, input.uv);
            float2 position = input.screenPos*2-1;
            float angle = 0.0;
            if (position.x != 0.0 && position.y != 0.0){
               angle = degrees(atan(position.y/position.x)) ;
            }
            clip ((1-_Direction*2)*(frac(angle/_Angle)-_Amount));
            return textureColor * _Color;
         }
         ENDCG
      }
   }
   Fallback "Diffuse"
} 

如果有任何想法歡迎提出。

No comments:

Post a Comment