CharaSkin.cg 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2. // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
  3. // Character skin shader
  4. // Includes falloff shadow
  5. #define ENABLE_CAST_SHADOWS
  6. // Material parameters
  7. float4 _Color;
  8. float4 _ShadowColor;
  9. float4 _LightColor0;
  10. float4 _MainTex_ST;
  11. // Textures
  12. sampler2D _MainTex;
  13. sampler2D _FalloffSampler;
  14. sampler2D _RimLightSampler;
  15. // Constants
  16. #define FALLOFF_POWER 1.0
  17. #ifdef ENABLE_CAST_SHADOWS
  18. // Structure from vertex shader to fragment shader
  19. struct v2f
  20. {
  21. float4 pos : SV_POSITION;
  22. LIGHTING_COORDS( 0, 1 )
  23. float3 normal : TEXCOORD2;
  24. float2 uv : TEXCOORD3;
  25. float3 eyeDir : TEXCOORD4;
  26. float3 lightDir : TEXCOORD5;
  27. };
  28. #else
  29. // Structure from vertex shader to fragment shader
  30. struct v2f
  31. {
  32. float4 pos : SV_POSITION;
  33. float3 normal : TEXCOORD0;
  34. float2 uv : TEXCOORD1;
  35. float3 eyeDir : TEXCOORD2;
  36. float3 lightDir : TEXCOORD3;
  37. };
  38. #endif
  39. // Float types
  40. #define float_t half
  41. #define float2_t half2
  42. #define float3_t half3
  43. #define float4_t half4
  44. // Vertex shader
  45. v2f vert( appdata_base v )
  46. {
  47. v2f o;
  48. o.pos = UnityObjectToClipPos( v.vertex );
  49. o.uv = TRANSFORM_TEX( v.texcoord.xy, _MainTex );
  50. o.normal = normalize( mul( unity_ObjectToWorld, float4_t( v.normal, 0 ) ).xyz );
  51. // Eye direction vector
  52. float4_t worldPos = mul( unity_ObjectToWorld, v.vertex );
  53. o.eyeDir = normalize( _WorldSpaceCameraPos - worldPos );
  54. o.lightDir = WorldSpaceLightDir( v.vertex );
  55. #ifdef ENABLE_CAST_SHADOWS
  56. TRANSFER_VERTEX_TO_FRAGMENT( o );
  57. #endif
  58. return o;
  59. }
  60. // Fragment shader
  61. float4 frag( v2f i ) : COLOR
  62. {
  63. float4_t diffSamplerColor = tex2D( _MainTex, i.uv );
  64. // Falloff. Convert the angle between the normal and the camera direction into a lookup for the gradient
  65. float_t normalDotEye = dot( i.normal, i.eyeDir );
  66. float_t falloffU = clamp( 1 - abs( normalDotEye ), 0.02, 0.98 );
  67. float4_t falloffSamplerColor = FALLOFF_POWER * tex2D( _FalloffSampler, float2( falloffU, 0.25f ) );
  68. float3_t combinedColor = lerp( diffSamplerColor.rgb, falloffSamplerColor.rgb * diffSamplerColor.rgb, falloffSamplerColor.a );
  69. // Rimlight
  70. float_t rimlightDot = saturate( 0.5 * ( dot( i.normal, i.lightDir ) + 1.0 ) );
  71. falloffU = saturate( rimlightDot * falloffU );
  72. //falloffU = saturate( ( rimlightDot * falloffU - 0.5 ) * 32.0 );
  73. falloffU = tex2D( _RimLightSampler, float2( falloffU, 0.25f ) ).r;
  74. float3_t lightColor = diffSamplerColor.rgb * 0.5; // * 2.0;
  75. combinedColor += falloffU * lightColor;
  76. #ifdef ENABLE_CAST_SHADOWS
  77. // Cast shadows
  78. float3_t shadowColor = _ShadowColor.rgb * combinedColor;
  79. float_t attenuation = saturate( 2.0 * LIGHT_ATTENUATION( i ) - 1.0 );
  80. combinedColor = lerp( shadowColor, combinedColor, attenuation );
  81. #endif
  82. return float4_t( combinedColor, diffSamplerColor.a ) * _Color * _LightColor0;
  83. }