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 |