Portfolio/Graphic2012.11.02 02:14

PC버전 레서탯을 제작 할 당시에 Strumpy Shader 로 편집한 쉐이더 파일과

Built-In shader 의 모바일 쉐이더의 코드와

마지막으로 Unity WiKi의 TeamFortress2Shader 코드를 참고하여

모바일 내에서 림 컬러와 스펙큘러 텍스쳐를 지원하는 찰진 느낌의 캐릭터를 표현하기 위해 편집한

쉐이더 코드 파일입니다.


[비교 스크린 샷]


유니티에서 제공하는 기본 Built-In Shader에 비해 번들거리지 않고 조금 더 따듯한 느낌을 표현할 수 있습니다.


[쉐이더 파일]

CharacterShaderMobile.shader



[쉐이더 코드]

// Simplified Bumped shader. Differences from regular Bumped one:

// - no Main Color

// - Normalmap uses Tiling/Offset of the Base texture

// - fully supports only 1 directional light. Other lights can affect it, but it will be per-vertex/SH.


Shader "Mobile/CharacterShader" {

Properties {

_Color ("Main Color", Color) = (1,1,1,1)

_RimColor ("Rim Color", Color) = (0.97,0.88,1,0.75)

_RimPower ("Rim Power", Float) = 2.5

_MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {}

_BumpMap ("Normal (Normal)", 2D) = "bump" {}

_SpecularTex ("Specular Level (R) Gloss (G) Rim Mask (B)", 2D) = "gray" {}

_RampTex ("Toon Ramp (RGB)", 2D) = "white" {}

}


SubShader {

Tags { "RenderType"="Opaque" }

LOD 400


CGPROGRAM

#pragma surface surf MobileBlinnPhong exclude_path:prepass nolightmap noforwardadd halfasview


float4 _RimColor;

float _RimPower;

sampler2D _MainTex, _SpecularTex, _BumpMap, _RampTex;


inline fixed4 LightingMobileBlinnPhong (SurfaceOutput s, fixed3 lightDir, fixed3 viewDir, fixed atten)

{

fixed3 h = normalize(lightDir + viewDir);

fixed NdotL = dot(s.Normal, lightDir) * 0.5 + 0.5;

fixed3 ramp = tex2D(_RampTex, float2(NdotL * atten)).rgb;

float nh = max (0, dot (s.Normal, h));

float spec = pow (nh, s.Gloss*128) * s.Specular;

fixed4 c;

c.rgb = ((s.Albedo * ramp * _LightColor0.rbg + _LightColor0.rbg * spec) * (atten * 2));

c.a = s.Alpha;

return c;

}



struct Input {

float2 uv_MainTex;

float3 viewDir;

};



void surf (Input IN, inout SurfaceOutput o) {

o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;

o.Alpha = tex2D(_MainTex, IN.uv_MainTex).a;

o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));

float3 specGloss = tex2D(_SpecularTex, IN.uv_MainTex).rgb;

o.Specular = specGloss.r;

o.Gloss = specGloss.g;

float4 Fresnel0_1_NoInput = float4(0,0,1,1);

float4 Fresnel0=(1.0 - dot( normalize( float4( IN.viewDir.x, IN.viewDir.y,IN.viewDir.z,1.0 ).xyz), normalize( Fresnel0_1_NoInput.xyz ) )).xxxx;

float4 Pow0=pow(Fresnel0,_RimPower.xxxx);

float4 Multiply0=_RimColor * Pow0 * specGloss.b;

o.Emission = Multiply0;

}

ENDCG  

}

}

Posted by 몬자