dot 형식의 마스크 애니메이션 ( 셰이더 )


DOT 형식의 마스크 애니메이션을 할 수 있을까 싶어서 셰이더로 만들어 봤다.

장점은 DOT이 아무리 늘어나도 부하가 걸리지 않는 다는 것이다.
TEXTURE의 TILE만 늘려주면 되니까!



사용된 텍스쳐들 마스크 이미지.



Shader "Custom/flip_Vertex" {
 Properties {
  _Color ("Color", Color) = (1,1,1,1)
  _MainTex ("Albedo (RGB)", 2D) = "white" {}
  _AlphaTex("Alpha Tex", 2D) = "white" {}
  _MaskTex("Mask Tex", 2D) = "white" {}
  _AnimRange("Value",Range(-10,10)) = 5
  _Angle("Angle", Range(-5.0,  5.0)) = 0.0
    
 }
 SubShader {
  Tags { "RenderType"="Opaque" "Queue"="Transparent"}
  cull back
 
  CGPROGRAM
  #pragma surface surf Lambert vertex:vert noshadow  alpha:fade
 
  sampler2D _MainTex;
  sampler2D _AlphaTex;
  sampler2D _MaskTex;
  float _AnimRange;
  float _Angle;
  fixed4 _Color;
 
  struct Input {
   float2 uv_MainTex;
   float2 uv_AlphaTex;
   float2 uv_MaskTex;
  };
  
  //텍스쳐 회전 참고
                //http://www.shaderslab.com/demo-96---uv-rotation-with-matrix.html
  void vert(inout appdata_full v) {
 
   //Pivot
   float2 pivot = float2(0.5, 0.5);
   // Rotation Matrix
   float sinAngle = sin(_Angle);
   float cosAngle = cos(_Angle);
   float2x2 rot = float2x2(cosAngle, -sinAngle, sinAngle, cosAngle);
   float2 uv = v.texcoord.xy - pivot;
   
   v.texcoord.xy = mul(rot, uv ); 
   v.texcoord.xy += pivot;  
  }
 
  // 마스크 텍스쳐의 UV.X 값을 이동 시키는 형식으로 제작.
  void surf (Input IN, inout SurfaceOutput o) {
   _AnimRange = ceil(_AnimRange)*0.1;
   fixed4 c = tex2D (_MainTex, IN.uv_MainTex ) * _Color;
   fixed4 a = tex2D(_AlphaTex, IN.uv_AlphaTex );
   fixed4 m = tex2D(_MaskTex,  float2(IN.uv_MaskTex.x - (_AnimRange), IN.uv_MaskTex.y));
 
   o.Albedo = c.rgb;
   o.Alpha = (a.rgb * (1-m.rgb))  ;
  }
  ENDCG
 }
 FallBack "Diffuse"
}

타일을 아무리 늘여도 BATCH 는 여전히 4.



댓글

이 블로그의 인기 게시물

날짜 시간 시간차 시간 계산 하기

코루틴에서 CallBack 함수 적용하기

C++ 언어 퍼센트 구하는 방법 / 기본 언어 퍼센트 구하는 방법