Advertisement
Guest User

Untitled

a guest
Sep 24th, 2021
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.96 KB | None | 0 0
  1. #if !defined(LIGHTING_INCLUDED)
  2. #define LIGHTING_INCLUDED
  3.  
  4. #include "UnityPBSLighting.cginc"
  5. #include "AutoLight.cginc"
  6. #include "UnityCG.cginc"
  7.  
  8. float4 _Ambient;
  9. sampler2D _MainTex;
  10. sampler2D _NormalMap;
  11. float4 _MainTex_ST;
  12. float _ToonAmount;
  13.  
  14. struct VertexData
  15. {
  16. float4 vertex: POSITION;
  17. float3 normal: NORMAL;
  18. float4 tangent: TANGENT;
  19. float2 uv: TEXCOORD0;
  20. };
  21.  
  22. struct Interpolators
  23. {
  24. float4 pos: SV_POSITION;
  25. float2 uv: TEXCOORD0;
  26. float3 normal: TEXCOORD1;
  27. float4 tangent: TEXCOORD2;
  28. float3 worldPos: TEXCOORD4;
  29.  
  30. SHADOW_COORDS(5)
  31.  
  32. #if defined(VERTEXLIGHT_ON)
  33. float3 vertexLightColor: TEXCOORD6;
  34. #endif
  35. };
  36.  
  37. void ComputeVertexLightColor(inout Interpolators i)
  38. {
  39. #if defined(VERTEXLIGHT_ON)
  40. i.vertexLightColor = Shade4PointLights(
  41. unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
  42. unity_LightColor[0].rgb, unity_LightColor[1].rgb,
  43. unity_LightColor[2].rgb, unity_LightColor[3].rgb,
  44. unity_4LightAtten0, i.worldPos, i.normal
  45. );
  46. #endif
  47. }
  48.  
  49. Interpolators vert(VertexData v)
  50. {
  51. Interpolators i;
  52. #if defined(MANUAL_BILLBOARD)
  53. i.pos = UnityObjectToClipPos(v.vertex);
  54. i.normal = UnityObjectToWorldNormal(v.normal);
  55. i.tangent = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
  56. i.worldPos = mul(unity_ObjectToWorld, v.vertex);
  57. #else
  58. // i.pos = mul(UNITY_MATRIX_P,
  59. // mul(UNITY_MATRIX_MV, float4(0, 0, 0, 1))
  60. // + float4(v.vertex.x, v.vertex.y, 0, 0));
  61. float4 world_origin = mul(UNITY_MATRIX_M, float4(0, 0, 0, 1));
  62. float4 view_origin = float4(UnityObjectToViewPos(float3(0, 0, 0)), 1);
  63.  
  64. float4 world_pos = mul(UNITY_MATRIX_M, v.vertex);
  65. float4 view_pos = world_pos - world_origin + view_origin;
  66. float4 clip_pos = mul(UNITY_MATRIX_P, view_pos);
  67.  
  68. i.pos = clip_pos;
  69. i.normal = -1 * normalize(unity_CameraToWorld._m02_m12_m22);
  70. //This tangent calculation uses (0, 1, 0) to generate the perpendicular value (tangent)
  71. //Could be modified to fit other vectors
  72. //I also don't know why w is negative but it works
  73. i.tangent = normalize(float4(i.normal.z * -1, 0, i.normal.x, -1));
  74. //i.worldPos = mul(unity_ObjectToWorld, mul(UNITY_MATRIX_MV, float4(0, 0, 0, 1)) + float4(v.vertex.x, v.vertex.y, 0, 0));
  75. //i.worldPos = mul(unity_ObjectToWorld, v.vertex);
  76. i.worldPos = view_pos;
  77. v.vertex = float4(0, 0, 0, 0);
  78. #endif
  79.  
  80. i.uv = TRANSFORM_TEX(v.uv, _MainTex);
  81.  
  82. // #if defined (SHADOWS_SCREEN)
  83. // #if defined (UNITY_NO_SCREENSPACE_SHADOWS)
  84. // i._ShadowCoord = mul( unity_WorldToShadow[0], world_pos );
  85. // #else
  86. // i._ShadowCoord = ComputeScreenPos(i.pos);
  87. // #endif
  88. // #endif
  89. // #if defined (SHADOWS_DEPTH) && defined (SPOT)
  90. // i._ShadowCoord = mul (unity_WorldToShadow[0], world_pos);
  91. // #endif
  92. // #if defined (SHADOWS_CUBED)
  93. // i._ShadowCoord.xyz = world_pos.xyz - _LightPositionRange.xyz;
  94. // #endif
  95.  
  96. TRANSFER_SHADOW(i)
  97. ComputeVertexLightColor(i);
  98. return i;
  99. }
  100. //ShadowsScreen && UNITY_NO_SCREENSPACE_SHADOWS
  101. //#define TRANSFER_SHADOW(a) a._ShadowCoord = mul( unity_WorldToShadow[0], mul( unity_ObjectToWorld, v.vertex ) );
  102. //ShadowsScreen && !UNITY_NO_SCREENSPACE_SHADOWS
  103. //#define TRANSFER_SHADOW(a) a._ShadowCoord = ComputeScreenPos(a.pos);
  104. //SpotLight && ShadowsDepth
  105. //#define TRANSFER_SHADOW(a) a._ShadowCoord = mul (unity_WorldToShadow[0], mul(unity_ObjectToWorld,v.vertex));
  106. //ShadowsCubed (Point Light)
  107. //#define TRANSFER_SHADOW(a) a._ShadowCoord.xyz = mul(unity_ObjectToWorld, v.vertex).xyz - _LightPositionRange.xyz;
  108.  
  109. UnityLight CreateLight(Interpolators i)
  110. {
  111. UnityLight light;
  112.  
  113. #if defined(POINT) || defined(POINT_COOKIE) || defined(SPOT)
  114. light.dir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos);
  115. #else
  116. light.dir = _WorldSpaceLightPos0.xyz;
  117. #endif
  118. UNITY_LIGHT_ATTENUATION(attenuation, i, i.worldPos);
  119. light.color = _LightColor0.rgb * attenuation;
  120. light.ndotl = DotClamped(i.normal, light.dir);
  121. return light;
  122. }
  123.  
  124. void InitializeFragmentNormal(inout Interpolators i)
  125. {
  126. float3 mainNormal = UnpackScaleNormal(tex2D(_NormalMap, i.uv), 1);
  127.  
  128. float3 binormal = cross(i.normal, i.tangent.xyz) *
  129. (i.tangent.w * unity_WorldTransformParams.w);
  130.  
  131. i.normal = normalize(
  132. mainNormal.x * i.tangent +
  133. mainNormal.y * binormal +
  134. mainNormal.z * i.normal
  135. );
  136. }
  137.  
  138. float Toonify(float ndotl)
  139. {
  140. return round(ndotl * _ToonAmount) / _ToonAmount;
  141. }
  142.  
  143. float4 frag(Interpolators i): SV_TARGET
  144. {
  145. InitializeFragmentNormal(i);
  146. float4 col = tex2D(_MainTex, i.uv);
  147. clip(col.a - 0.5);
  148. UnityLight light = CreateLight(i);
  149. UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos.xyz);
  150. atten /= 2;
  151. atten += 0.5;
  152. return col * atten * float4(_LightColor0.rgb * Toonify(light.ndotl) + _Ambient.rgb, 1);
  153. }
  154.  
  155. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement