Vertex and fragment shader 7 - 2D過場淡入淡出(Fade in/out) - 圓心縮放(Alpha模糊)

  同樣是圓心縮放的效果,不過加上使用Lerp運算跟改變Alpha值,來達到模糊化的效果,也就可以避免原本圓心縮放的邊緣太過銳利。

呈現的效果大概是這樣




同樣設定基本屬性,材質、顏色、切除的量、切除方向。
_MainTex ("Base (RGB)", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
_Amount ("Amount", Range (0,1)) = 0
_Direction ("Direction", Range(0,1)) = 1

這邊稍微改變一點算法,使用_Amount計算後來作為Lerp的參數,然後加上Direction可以改變方向。
float a = clamp(length(coord)*(1-_Amount)/_Amount,0.0,1.0);
return lerp(float4(textureColor.rgb,_Direction),float4(textureColor.rgb,1-_Direction*2),a) * _Color;


  最後在Unity當中使用的時候,調整 _Amount 調整切除的量,調整 _Direction 來改變切除的方向,也可以改變顏色的加成。

注意,因為使用的是螢幕座標,所以會是以遊戲顯示畫面的高寬去等分,所以在寬螢幕上會變成橢圓形,如果想要維持正方形,最簡單的解決辦法就是改為UV座標,然後讓使用這個材質的面片是正方形就可以了。


完整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
   }

   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;

         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
         {
            half4 textureColor = tex2D(_MainTex, input.uv);
            float2 coord = input.screenPos.xy*2-1;
            float a = clamp(length(coord)*(1-_Amount)/_Amount,0.0,1.0);
            return lerp(float4(textureColor.rgb,_Direction),float4(textureColor.rgb,1-_Direction*2),a) * _Color;
         }
         ENDCG
      }
   }
   Fallback "Diffuse"
} 

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

No comments:

Post a Comment