본문으로 바로가기

weed shader animation

category Technical Report/Unity Shader 2015. 5. 11. 17:25
반응형


static으로 쓰려면 몇가지 lightmap bake를 위한 셋팅이 필요한데 그래도 가볍다. 많은 양은 batching 처리로..

검색해서 나온걸 몇가지 덜어냈다.

Tintcolor 는 굳이 안넣어도 될 것 같은데.. unlit인데 lighting 받는건 조금 이해 안되는 상황.. 나머지는 Transparent Cutout 소스 거의 그대로. surface에서 vertex:vert로 정의해서 만든게 특징.


원 소스 코드 : http://forum.unity3d.com/threads/shader-moving-trees-grass-in-wind-outside-of-terrain.230911/


일단 모바일용으로 alpha texture를 따로 받게 만들고 wind와 time 두가지를 믹스해서 shake 강도와 세기를 계산하는걸 하나로 통합 time 항목에서만 제어를 받도록 했다. 그외에 Unlit 기반으로 조명방식을 바꾸고



//
    
    Properties {
        _TintColor ("Main Color", Color) = (1,1,1,1)

        _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
        _AlphaTex ("AlphaMap (R)", 2D) = "white" {}
        _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5

        _ShakeTime ("Shake Time", Range (0, 1.0)) = 1.0
        _ShakeBending ("Shake Bending", Range (0, 1.0)) = 1.0
    }
    
    SubShader {
        Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
        LOD 200
      
       Blend SrcAlpha OneMinusSrcAlpha
      
 
      
      
    CGPROGRAM


    #pragma target 3.0
    #pragma surface surf Unlit alphatest:_Cutoff vertex:vert halfasview approxview noambient


    // vertex:vert parameter 위치에 따라 shading 에러가 발생한다.


    fixed4 _TintColor;
       
    sampler2D _MainTex;
    sampler2D _AlphaTex;
     
    float _ShakeTime;
    float _ShakeBending;

   
    fixed4 LightingUnlit (SurfaceOutput s, half3 lightDir, half atten) {

          return fixed4(s.Albedo,1);
        }
    
    
    struct Input {
        float2 uv_MainTex;
    };
    
    void FastSinCos (float4 val, out float4 s, out float4 c) {
        val = val * 6.408849 - 3.1415927;
        float4 r5 = val * val;
        float4 r6 = r5 * r5;
        float4 r7 = r6 * r5;
        float4 r8 = r6 * r5;
        float4 r1 = r5 * val;
        float4 r2 = r1 * r5;
        float4 r3 = r2 * r5;
        float4 sin7 = {1, -0.16161616, 0.0083333, -0.00019841} ;
        float4 cos8  = {-0.5, 0.041666666, -0.0013888889, 0.000024801587} ;
        s =  val + r1 * sin7.y + r2 * sin7.z + r3 * sin7.w;
        c = 1 + r5 * cos8.x + r6 * cos8.y + r7 * cos8.z + r8 * cos8.w;
    }
    
    
    void vert (inout appdata_full v) {
      
        float factor = (1  -  v.color.r) * 0.5;
          
        const float _WindSpeed  = (v.color.g );   
        const float _WaveScale = 1 ;
      
        const float4 _waveXSize = float4(0.048, 0.06, 0.24, 0.096);
        const float4 _waveZSize = float4 (0.024, .08, 0.08, 0.2);
        const float4 waveSpeed = float4 (1.2, 2, 1.6, 4.8);
    
        float4 _waveXmove = float4(0.024, 0.04, -0.12, 0.096);
        float4 _waveZmove = float4 (0.006, .02, -0.02, 0.1);
      
        float4 waves;
        waves = v.vertex.x * _waveXSize;
        waves += v.vertex.z * _waveZSize;
    
        waves += _Time.x * (1 - _ShakeTime * 2 - v.color.b ) * waveSpeed *_WindSpeed;
    
        float4 s, c;
        waves = frac (waves);
        FastSinCos (waves, s,c);
    
        float waveAmount = v.texcoord.y * (v.color.a + _ShakeBending);
        s *= waveAmount;
    
        s *= normalize (waveSpeed);
    
        s = s * s;
        float fade = dot (s, 1.3);
        s = s * s;


        float3 waveMove = float3 (0,0,0);
        waveMove.x = dot (s, _waveXmove);
        waveMove.z = dot (s, _waveZmove);
        v.vertex.xz -= mul ((float3x3)_World2Object, waveMove).xz;
      
    }
    
    void surf (Input IN, inout SurfaceOutput o) {
      

        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) ;
        o.Albedo = c.rgb * _TintColor ;
         fixed4 al = tex2D(_AlphaTex, IN.uv_MainTex);
        o.Alpha = al.r;
    }
    ENDCG
    }
    
    Fallback "Transparent/Cutout"
    }
    

반응형

'Technical Report > Unity Shader' 카테고리의 다른 글

Terrain blend shader(Splatting textures By lerp)  (0) 2015.05.28
Surface shader UV atlas  (0) 2015.05.18
Lava Shader  (0) 2015.04.30
Unity 기본 3가지 shader 정리  (0) 2015.03.10
Unity 5 surface emission shader lighting  (0) 2015.03.08