LayaBlinnPhongFB.cginc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "Lighting.cginc"
  2. #include "AutoLight.cginc"
  3. float4 _Color;
  4. sampler2D _MainTex;
  5. float _AlbedoIntensity;
  6. float4 _MainTex_ST;
  7. sampler2D _BumpMap;
  8. sampler2D _SpecGlossMap;
  9. half _Shininess;
  10. half _Cutoff;
  11. struct a2v {
  12. float4 vertex : POSITION;
  13. float3 normal : NORMAL;
  14. float4 tangent : TANGENT;
  15. float4 texcoord : TEXCOORD0;
  16. float4 texcoord1: TEXCOORD1;
  17. float4 color : COLOR;
  18. };
  19. struct v2f {
  20. float4 pos : SV_POSITION;
  21. float2 uv : TEXCOORD0;
  22. float2 uv2: TEXCOORD1;
  23. float3 worldPos : TEXCOORD2;
  24. float3 lightDir: TEXCOORD3;
  25. float3 viewDir : TEXCOORD4;
  26. float4 color : COLOR;
  27. SHADOW_COORDS(5)
  28. UNITY_FOG_COORDS(6)
  29. };
  30. inline void layaBlinnPhongLighting (in fixed3 lightDir, in fixed3 viewDir, in fixed3 normal, out fixed4 diffuse, out fixed4 specular)
  31. {
  32. half3 h = normalize (lightDir + viewDir);
  33. fixed diff = max (0, dot (normal, lightDir));
  34. float nh = max (0, dot (normal, h));
  35. diffuse = _LightColor0 * max(0, dot(normal, lightDir));
  36. specular = _LightColor0 * pow (nh, _Shininess * 128.0);
  37. }
  38. v2f vert(a2v v) {
  39. v2f o;
  40. o.pos = UnityObjectToClipPos(v.vertex);
  41. o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
  42. o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
  43. o.uv2 = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
  44. o.color = v.color;
  45. fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
  46. fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
  47. fixed3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w;
  48. float3x3 worldToTangent = float3x3(worldTangent, worldBinormal, worldNormal);
  49. o.lightDir = mul(worldToTangent, WorldSpaceLightDir(v.vertex));
  50. o.viewDir = mul(worldToTangent, WorldSpaceViewDir(v.vertex));
  51. // Pass shadow coordinates to pixel shader
  52. TRANSFER_SHADOW(o);
  53. UNITY_TRANSFER_FOG(o, o.pos);
  54. return o;
  55. }
  56. fixed4 frag(v2f i) : SV_Target {
  57. fixed4 mainTexColor = tex2D(_MainTex, i.uv);
  58. fixed4 albedo = mainTexColor * _Color * _AlbedoIntensity;
  59. #if EnableAlphaCutoff
  60. clip (albedo.a - _Cutoff);
  61. #endif
  62. fixed4 lightMapColor = fixed4(0.0,0.0,0.0,0.0);
  63. #if defined(LIGHTMAP_ON)
  64. lightMapColor = fixed4(DecodeLightmap (UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uv2)), 1.0);
  65. #endif
  66. fixed4 diffuse;
  67. fixed4 specular;
  68. #if EnableLighting
  69. fixed3 lightDir = normalize(i.lightDir);
  70. fixed3 viewDir = normalize(i.viewDir);
  71. fixed3 normal = UnpackNormal(tex2D(_BumpMap, i.uv));
  72. layaBlinnPhongLighting(lightDir, viewDir, normal, diffuse, specular);
  73. #else
  74. diffuse = fixed4(0.0,0.0,0.0,0.0);
  75. specular = fixed4(0.0,0.0,0.0,0.0);
  76. #endif
  77. fixed4 ambient = (lightMapColor + UNITY_LIGHTMODEL_AMBIENT) * albedo;
  78. diffuse = diffuse * albedo;
  79. #if defined(SpecularTexture)
  80. specular = specular * tex2D(_SpecGlossMap, i.uv) * _SpecColor;
  81. #else
  82. specular = specular * mainTexColor.a * _SpecColor;
  83. #endif
  84. UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
  85. fixed4 color;
  86. #if ENABLEVERTEXCOLOR
  87. color = fixed4(ambient.rgb + (diffuse + specular).rgb * atten, albedo.a)*i.color;
  88. #else
  89. color = fixed4(ambient.rgb + (diffuse + specular).rgb * atten, albedo.a);
  90. #endif
  91. UNITY_APPLY_FOG(i.fogCoord, color);
  92. color = clamp(color, 0, 1);
  93. return color;
  94. }