lights_pars_begin.glsl.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. export default /* glsl */`
  2. uniform vec3 ambientLightColor;
  3. vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {
  4. vec3 irradiance = ambientLightColor;
  5. #ifndef PHYSICALLY_CORRECT_LIGHTS
  6. irradiance *= PI;
  7. #endif
  8. return irradiance;
  9. }
  10. #if NUM_DIR_LIGHTS > 0
  11. struct DirectionalLight {
  12. vec3 direction;
  13. vec3 color;
  14. int shadow;
  15. float shadowBias;
  16. float shadowRadius;
  17. vec2 shadowMapSize;
  18. };
  19. uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];
  20. void getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {
  21. directLight.color = directionalLight.color;
  22. directLight.direction = directionalLight.direction;
  23. directLight.visible = true;
  24. }
  25. #endif
  26. #if NUM_POINT_LIGHTS > 0
  27. struct PointLight {
  28. vec3 position;
  29. vec3 color;
  30. float distance;
  31. float decay;
  32. int shadow;
  33. float shadowBias;
  34. float shadowRadius;
  35. vec2 shadowMapSize;
  36. float shadowCameraNear;
  37. float shadowCameraFar;
  38. };
  39. uniform PointLight pointLights[ NUM_POINT_LIGHTS ];
  40. // directLight is an out parameter as having it as a return value caused compiler errors on some devices
  41. void getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {
  42. vec3 lVector = pointLight.position - geometry.position;
  43. directLight.direction = normalize( lVector );
  44. float lightDistance = length( lVector );
  45. directLight.color = pointLight.color;
  46. directLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );
  47. directLight.visible = ( directLight.color != vec3( 0.0 ) );
  48. }
  49. #endif
  50. #if NUM_SPOT_LIGHTS > 0
  51. struct SpotLight {
  52. vec3 position;
  53. vec3 direction;
  54. vec3 color;
  55. float distance;
  56. float decay;
  57. float coneCos;
  58. float penumbraCos;
  59. int shadow;
  60. float shadowBias;
  61. float shadowRadius;
  62. vec2 shadowMapSize;
  63. };
  64. uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];
  65. // directLight is an out parameter as having it as a return value caused compiler errors on some devices
  66. void getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {
  67. vec3 lVector = spotLight.position - geometry.position;
  68. directLight.direction = normalize( lVector );
  69. float lightDistance = length( lVector );
  70. float angleCos = dot( directLight.direction, spotLight.direction );
  71. if ( angleCos > spotLight.coneCos ) {
  72. float spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );
  73. directLight.color = spotLight.color;
  74. directLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );
  75. directLight.visible = true;
  76. } else {
  77. directLight.color = vec3( 0.0 );
  78. directLight.visible = false;
  79. }
  80. }
  81. #endif
  82. #if NUM_RECT_AREA_LIGHTS > 0
  83. struct RectAreaLight {
  84. vec3 color;
  85. vec3 position;
  86. vec3 halfWidth;
  87. vec3 halfHeight;
  88. };
  89. // Pre-computed values of LinearTransformedCosine approximation of BRDF
  90. // BRDF approximation Texture is 64x64
  91. uniform sampler2D ltc_1; // RGBA Float
  92. uniform sampler2D ltc_2; // RGBA Float
  93. uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];
  94. #endif
  95. #if NUM_HEMI_LIGHTS > 0
  96. struct HemisphereLight {
  97. vec3 direction;
  98. vec3 skyColor;
  99. vec3 groundColor;
  100. };
  101. uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];
  102. vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {
  103. float dotNL = dot( geometry.normal, hemiLight.direction );
  104. float hemiDiffuseWeight = 0.5 * dotNL + 0.5;
  105. vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );
  106. #ifndef PHYSICALLY_CORRECT_LIGHTS
  107. irradiance *= PI;
  108. #endif
  109. return irradiance;
  110. }
  111. #endif
  112. `;