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.
댓글
댓글 쓰기