Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. // Must match: LightBatch.isBatchingSupported
  2. #define USE_STRUCTURED_BUFFER_FOR_LIGHT2D_DATA 0
  3. #if USE_NORMAL_MAP
  4. #if LIGHT_QUALITY_FAST
  5. #define NORMALS_LIGHTING_COORDS(TEXCOORDA, TEXCOORDB) \
  6. half4 lightDirection : TEXCOORDA;\
  7. half2 screenUV : TEXCOORDB;
  8. #define TRANSFER_NORMALS_LIGHTING(output, worldSpacePos, lightPosition, lightZDistance)\
  9. output.screenUV = ComputeNormalizedDeviceCoordinates(output.positionCS.xyz / output.positionCS.w);\
  10. half3 planeNormal = -GetViewForwardDir();\
  11. half3 projLightPos = lightPosition.xyz - (dot(lightPosition.xyz - worldSpacePos.xyz, planeNormal) - lightZDistance) * planeNormal;\
  12. output.lightDirection.xyz = projLightPos - worldSpacePos.xyz;\
  13. output.lightDirection.w = 0;
  14. #define APPLY_NORMALS_LIGHTING(input, lightColor, lightPosition, lightZDistance)\
  15. half4 normal = SAMPLE_TEXTURE2D(_NormalMap, sampler_NormalMap, input.screenUV);\
  16. half3 normalUnpacked = UnpackNormalRGBNoScale(normal);\
  17. half3 dirToLight = normalize(input.lightDirection.xyz);\
  18. lightColor = lightColor * saturate(dot(dirToLight, normalUnpacked));
  19. #else
  20. #define NORMALS_LIGHTING_COORDS(TEXCOORDA, TEXCOORDB) \
  21. half4 positionWS : TEXCOORDA;\
  22. half2 screenUV : TEXCOORDB;
  23. #define TRANSFER_NORMALS_LIGHTING(output, worldSpacePos, lightPosition, lightZDistance) \
  24. output.screenUV = ComputeNormalizedDeviceCoordinates(output.positionCS.xyz / output.positionCS.w); \
  25. output.positionWS = worldSpacePos;
  26. #define APPLY_NORMALS_LIGHTING(input, lightColor, lightPosition, lightZDistance)\
  27. half4 normal = SAMPLE_TEXTURE2D(_NormalMap, sampler_NormalMap, input.screenUV);\
  28. half3 normalUnpacked = UnpackNormalRGBNoScale(normal);\
  29. half3 planeNormal = -GetViewForwardDir();\
  30. half3 projLightPos = lightPosition.xyz - (dot(lightPosition.xyz - input.positionWS.xyz, planeNormal) - lightZDistance) * planeNormal;\
  31. half3 dirToLight = normalize(projLightPos - input.positionWS.xyz);\
  32. lightColor = lightColor * saturate(dot(dirToLight, normalUnpacked));
  33. #endif
  34. #define NORMALS_LIGHTING_VARIABLES \
  35. TEXTURE2D(_NormalMap); \
  36. SAMPLER(sampler_NormalMap);
  37. #else
  38. #define NORMALS_LIGHTING_COORDS(TEXCOORDA, TEXCOORDB)
  39. #define NORMALS_LIGHTING_VARIABLES
  40. #define TRANSFER_NORMALS_LIGHTING(output, worldSpacePos, lightPosition, lightZDistance)
  41. #define APPLY_NORMALS_LIGHTING(input, lightColor, lightPosition, lightZDistance)
  42. #endif
  43. #define SHADOW_COORDS(TEXCOORDA)\
  44. float2 shadowUV : TEXCOORDA;
  45. #define SHADOW_VARIABLES\
  46. TEXTURE2D(_ShadowTex);\
  47. SAMPLER(sampler_ShadowTex);
  48. // Need to look at shadow caster to remove issue with shadows
  49. #define APPLY_SHADOWS(input, color, intensity)\
  50. if(intensity < 1)\
  51. {\
  52. half4 shadowTex = SAMPLE_TEXTURE2D(_ShadowTex, sampler_ShadowTex, input.shadowUV); \
  53. half shadowFinalValue = dot(half4(1,0,0,0), shadowTex.rgba);\
  54. half unshadowValue = dot(half4(0,1,0,0), shadowTex.rgba);\
  55. half unshadowGTEOne = unshadowValue > 1;\
  56. half spriteAlpha = dot(half4(0,0,1,0), shadowTex.rgba);\
  57. half unshadowFinalValue = unshadowGTEOne * (unshadowValue - (1-spriteAlpha)) + (1-unshadowGTEOne) * (unshadowValue * spriteAlpha);\
  58. half shadowIntensity = 1-saturate(shadowFinalValue - unshadowFinalValue); \
  59. color.rgb = (color.rgb * shadowIntensity) + (color.rgb * intensity*(1 - shadowIntensity));\
  60. }
  61. #define TRANSFER_SHADOWS(output)\
  62. output.shadowUV = ComputeNormalizedDeviceCoordinates(output.positionCS.xyz / output.positionCS.w);
  63. #define SHAPE_LIGHT(index)\
  64. TEXTURE2D(_ShapeLightTexture##index);\
  65. SAMPLER(sampler_ShapeLightTexture##index);\
  66. half2 _ShapeLightBlendFactors##index;\
  67. half4 _ShapeLightMaskFilter##index;\
  68. half4 _ShapeLightInvertedFilter##index;
  69. #if !defined(USE_SHAPE_LIGHT_TYPE_0) && !defined(USE_SHAPE_LIGHT_TYPE_1) && !defined(USE_SHAPE_LIGHT_TYPE_2) && !defined(USE_SHAPE_LIGHT_TYPE_3)
  70. #define USE_DEFAULT_LIGHT_TYPE 1
  71. #endif
  72. struct FragmentOutput
  73. {
  74. #if USE_SHAPE_LIGHT_TYPE_0 || USE_DEFAULT_LIGHT_TYPE
  75. half4 GLightBuffer0 : SV_Target0;
  76. #endif
  77. #if USE_SHAPE_LIGHT_TYPE_1
  78. half4 GLightBuffer1 : SV_Target1;
  79. #endif
  80. #if USE_SHAPE_LIGHT_TYPE_2
  81. half4 GLightBuffer2 : SV_Target2;
  82. #endif
  83. #if USE_SHAPE_LIGHT_TYPE_3
  84. half4 GLightBuffer3 : SV_Target3;
  85. #endif
  86. };
  87. FragmentOutput ToFragmentOutput(half4 finalColor)
  88. {
  89. FragmentOutput output;
  90. #if USE_SHAPE_LIGHT_TYPE_0 || USE_DEFAULT_LIGHT_TYPE
  91. output.GLightBuffer0 = finalColor;
  92. #endif
  93. #if USE_SHAPE_LIGHT_TYPE_1
  94. output.GLightBuffer1 = finalColor;
  95. #endif
  96. #if USE_SHAPE_LIGHT_TYPE_2
  97. output.GLightBuffer2 = finalColor;
  98. #endif
  99. #if USE_SHAPE_LIGHT_TYPE_3
  100. output.GLightBuffer3 = finalColor;
  101. #endif
  102. return output;
  103. }
  104. #define LIGHT_OFFSET(TEXCOORD)\
  105. float4 lightOffset : TEXCOORD;
  106. // Light-Batcher mapping for Reference.
  107. // OuterAngle; // 1-0 where 1 is the value at 0 degrees and 1 is the value at 180 degrees
  108. // InnerAngle; // 1-0 where 1 is the value at 0 degrees and 1 is the value at 180 degrees
  109. // InnerRadiusMult; // 1-0 where 1 is the value at the center and 0 is the value at the outer radius
  110. // Note: IsFullSpotlight // Is no longer fed but deduced within the shader. Value basically is test for InnerAngle = 1.0f
  111. // Likewise InnerAngleMult is also deduced and is basically 1 / (Outer - Inner)
  112. // Position.xyz => _LightPosition
  113. // Position.w => _LightZDistance
  114. // ShadowIntensity => In case of Volumetric Lighting this represents ShadowVolumeIntensity
  115. struct PerLight2D
  116. {
  117. float4x4 InvMatrix;
  118. float4 Color;
  119. float4 Position;
  120. float FalloffIntensity;
  121. float FalloffDistance;
  122. float OuterAngle;
  123. float InnerAngle;
  124. float InnerRadiusMult;
  125. float VolumeOpacity;
  126. float ShadowIntensity;
  127. int LightType;
  128. };
  129. #if USE_STRUCTURED_BUFFER_FOR_LIGHT2D_DATA
  130. #define UNITY_LIGHT2D_DATA \
  131. \
  132. uniform StructuredBuffer<PerLight2D> _Light2DBuffer; \
  133. \
  134. int _BatchBufferOffset; \
  135. \
  136. PerLight2D GetPerLight2D(float4 color) \
  137. { \
  138. int idx = (int)(color.b * 64) + _BatchBufferOffset; \
  139. return _Light2DBuffer[idx]; \
  140. }
  141. #define _L2D_INVMATRIX light.InvMatrix
  142. #define _L2D_COLOR light.Color
  143. #define _L2D_POSITION light.Position
  144. #define _L2D_FALLOFF_INTENSITY light.FalloffIntensity
  145. #define _L2D_FALLOFF_DISTANCE light.FalloffDistance
  146. #define _L2D_OUTER_ANGLE light.OuterAngle
  147. #define _L2D_INNER_ANGLE light.InnerAngle
  148. #define _L2D_INNER_RADIUS_MULT light.InnerRadiusMult
  149. #define _L2D_VOLUME_OPACITY light.VolumeOpacity
  150. #define _L2D_SHADOW_INTENSITY light.ShadowIntensity
  151. #define _L2D_LIGHT_TYPE light.LightType
  152. #else
  153. #define UNITY_LIGHT2D_DATA \
  154. \
  155. float4x4 L2DInvMatrix; \
  156. float4 L2DColor; \
  157. float4 L2DPosition; \
  158. float L2DFalloffIntensity; \
  159. float L2DFalloffDistance; \
  160. float L2DOuterAngle; \
  161. float L2DInnerAngle; \
  162. float L2DInnerRadiusMult; \
  163. float L2DVolumeOpacity; \
  164. float L2DShadowIntensity; \
  165. int L2DLightType; \
  166. #define _L2D_INVMATRIX L2DInvMatrix
  167. #define _L2D_COLOR L2DColor
  168. #define _L2D_POSITION L2DPosition
  169. #define _L2D_FALLOFF_INTENSITY L2DFalloffIntensity
  170. #define _L2D_FALLOFF_DISTANCE L2DFalloffDistance
  171. #define _L2D_OUTER_ANGLE L2DOuterAngle
  172. #define _L2D_INNER_ANGLE L2DInnerAngle
  173. #define _L2D_INNER_RADIUS_MULT L2DInnerRadiusMult
  174. #define _L2D_VOLUME_OPACITY L2DVolumeOpacity
  175. #define _L2D_SHADOW_INTENSITY L2DShadowIntensity
  176. #define _L2D_LIGHT_TYPE L2DLightType
  177. #endif