lightFragment.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. // Do not edit.
  2. import { ShaderStore } from "../../Engines/shaderStore.js";
  3. const name = "lightFragment";
  4. const shader = `#ifdef LIGHT{X}
  5. #if defined(SHADOWONLY) || defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) && defined(LIGHTMAPNOSPECULAR{X})
  6. #else
  7. #ifdef PBR
  8. #ifdef SPOTLIGHT{X}
  9. preInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);
  10. #elif defined(POINTLIGHT{X})
  11. preInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);
  12. #elif defined(HEMILIGHT{X})
  13. preInfo=computeHemisphericPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);
  14. #elif defined(DIRLIGHT{X})
  15. preInfo=computeDirectionalPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);
  16. #endif
  17. preInfo.NdotV=NdotV;
  18. #ifdef SPOTLIGHT{X}
  19. #ifdef LIGHT_FALLOFF_GLTF{X}
  20. preInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff_GLTF(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);
  21. #elif defined(LIGHT_FALLOFF_PHYSICAL{X})
  22. preInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);preInfo.attenuation*=computeDirectionalLightFalloff_Physical(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w);
  23. #elif defined(LIGHT_FALLOFF_STANDARD{X})
  24. preInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);preInfo.attenuation*=computeDirectionalLightFalloff_Standard(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w);
  25. #else
  26. preInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);
  27. #endif
  28. #elif defined(POINTLIGHT{X})
  29. #ifdef LIGHT_FALLOFF_GLTF{X}
  30. preInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);
  31. #elif defined(LIGHT_FALLOFF_PHYSICAL{X})
  32. preInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);
  33. #elif defined(LIGHT_FALLOFF_STANDARD{X})
  34. preInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);
  35. #else
  36. preInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);
  37. #endif
  38. #else
  39. preInfo.attenuation=1.0;
  40. #endif
  41. #ifdef HEMILIGHT{X}
  42. preInfo.roughness=roughness;
  43. #else
  44. preInfo.roughness=adjustRoughnessFromLightProperties(roughness,light{X}.vLightSpecular.a,preInfo.lightDistance);
  45. #endif
  46. #ifdef IRIDESCENCE
  47. preInfo.iridescenceIntensity=iridescenceIntensity;
  48. #endif
  49. #ifdef HEMILIGHT{X}
  50. info.diffuse=computeHemisphericDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb,light{X}.vLightGround);
  51. #elif defined(SS_TRANSLUCENCY)
  52. info.diffuse=computeDiffuseAndTransmittedLighting(preInfo,light{X}.vLightDiffuse.rgb,subSurfaceOut.transmittance);
  53. #else
  54. info.diffuse=computeDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb);
  55. #endif
  56. #ifdef SPECULARTERM
  57. #ifdef ANISOTROPIC
  58. info.specular=computeAnisotropicSpecularLighting(preInfo,viewDirectionW,normalW,anisotropicOut.anisotropicTangent,anisotropicOut.anisotropicBitangent,anisotropicOut.anisotropy,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);
  59. #else
  60. info.specular=computeSpecularLighting(preInfo,normalW,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);
  61. #endif
  62. #endif
  63. #ifdef SHEEN
  64. #ifdef SHEEN_LINKWITHALBEDO
  65. preInfo.roughness=sheenOut.sheenIntensity;
  66. #else
  67. #ifdef HEMILIGHT{X}
  68. preInfo.roughness=sheenOut.sheenRoughness;
  69. #else
  70. preInfo.roughness=adjustRoughnessFromLightProperties(sheenOut.sheenRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);
  71. #endif
  72. #endif
  73. info.sheen=computeSheenLighting(preInfo,normalW,sheenOut.sheenColor,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);
  74. #endif
  75. #ifdef CLEARCOAT
  76. #ifdef HEMILIGHT{X}
  77. preInfo.roughness=clearcoatOut.clearCoatRoughness;
  78. #else
  79. preInfo.roughness=adjustRoughnessFromLightProperties(clearcoatOut.clearCoatRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);
  80. #endif
  81. info.clearCoat=computeClearCoatLighting(preInfo,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatAARoughnessFactors.x,clearcoatOut.clearCoatIntensity,light{X}.vLightDiffuse.rgb);
  82. #ifdef CLEARCOAT_TINT
  83. absorption=computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract,preInfo.L,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatColor,clearcoatOut.clearCoatThickness,clearcoatOut.clearCoatIntensity);info.diffuse*=absorption;
  84. #ifdef SPECULARTERM
  85. info.specular*=absorption;
  86. #endif
  87. #endif
  88. info.diffuse*=info.clearCoat.w;
  89. #ifdef SPECULARTERM
  90. info.specular*=info.clearCoat.w;
  91. #endif
  92. #ifdef SHEEN
  93. info.sheen*=info.clearCoat.w;
  94. #endif
  95. #endif
  96. #else
  97. #ifdef SPOTLIGHT{X}
  98. info=computeSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness);
  99. #elif defined(HEMILIGHT{X})
  100. info=computeHemisphericLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightGround,glossiness);
  101. #elif defined(POINTLIGHT{X}) || defined(DIRLIGHT{X})
  102. info=computeLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness);
  103. #endif
  104. #endif
  105. #ifdef PROJECTEDLIGHTTEXTURE{X}
  106. info.diffuse*=computeProjectionTextureDiffuseLighting(projectionLightSampler{X},textureProjectionMatrix{X});
  107. #endif
  108. #endif
  109. #ifdef SHADOW{X}
  110. #ifdef SHADOWCSM{X}
  111. for (int i=0; i<SHADOWCSMNUM_CASCADES{X}; i++)
  112. {
  113. #ifdef SHADOWCSM_RIGHTHANDED{X}
  114. diff{X}=viewFrustumZ{X}[i]+vPositionFromCamera{X}.z;
  115. #else
  116. diff{X}=viewFrustumZ{X}[i]-vPositionFromCamera{X}.z;
  117. #endif
  118. if (diff{X}>=0.) {index{X}=i;break;}}
  119. #ifdef SHADOWCSMUSESHADOWMAXZ{X}
  120. if (index{X}>=0)
  121. #endif
  122. {
  123. #if defined(SHADOWPCF{X})
  124. #if defined(SHADOWLOWQUALITY{X})
  125. shadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  126. #elif defined(SHADOWMEDIUMQUALITY{X})
  127. shadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  128. #else
  129. shadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  130. #endif
  131. #elif defined(SHADOWPCSS{X})
  132. #if defined(SHADOWLOWQUALITY{X})
  133. shadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});
  134. #elif defined(SHADOWMEDIUMQUALITY{X})
  135. shadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});
  136. #else
  137. shadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});
  138. #endif
  139. #else
  140. shadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  141. #endif
  142. #ifdef SHADOWCSMDEBUG{X}
  143. shadowDebug{X}=vec3(shadow)*vCascadeColorsMultiplier{X}[index{X}];
  144. #endif
  145. #ifndef SHADOWCSMNOBLEND{X}
  146. float frustumLength=frustumLengths{X}[index{X}];float diffRatio=clamp(diff{X}/frustumLength,0.,1.)*cascadeBlendFactor{X};if (index{X}<(SHADOWCSMNUM_CASCADES{X}-1) && diffRatio<1.)
  147. {index{X}+=1;float nextShadow=0.;
  148. #if defined(SHADOWPCF{X})
  149. #if defined(SHADOWLOWQUALITY{X})
  150. nextShadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  151. #elif defined(SHADOWMEDIUMQUALITY{X})
  152. nextShadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  153. #else
  154. nextShadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  155. #endif
  156. #elif defined(SHADOWPCSS{X})
  157. #if defined(SHADOWLOWQUALITY{X})
  158. nextShadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});
  159. #elif defined(SHADOWMEDIUMQUALITY{X})
  160. nextShadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});
  161. #else
  162. nextShadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});
  163. #endif
  164. #else
  165. nextShadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  166. #endif
  167. shadow=mix(nextShadow,shadow,diffRatio);
  168. #ifdef SHADOWCSMDEBUG{X}
  169. shadowDebug{X}=mix(vec3(nextShadow)*vCascadeColorsMultiplier{X}[index{X}],shadowDebug{X},diffRatio);
  170. #endif
  171. }
  172. #endif
  173. }
  174. #elif defined(SHADOWCLOSEESM{X})
  175. #if defined(SHADOWCUBE{X})
  176. shadow=computeShadowWithCloseESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);
  177. #else
  178. shadow=computeShadowWithCloseESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);
  179. #endif
  180. #elif defined(SHADOWESM{X})
  181. #if defined(SHADOWCUBE{X})
  182. shadow=computeShadowWithESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);
  183. #else
  184. shadow=computeShadowWithESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);
  185. #endif
  186. #elif defined(SHADOWPOISSON{X})
  187. #if defined(SHADOWCUBE{X})
  188. shadow=computeShadowWithPoissonSamplingCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.depthValues);
  189. #else
  190. shadow=computeShadowWithPoissonSampling(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  191. #endif
  192. #elif defined(SHADOWPCF{X})
  193. #if defined(SHADOWLOWQUALITY{X})
  194. shadow=computeShadowWithPCF1(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  195. #elif defined(SHADOWMEDIUMQUALITY{X})
  196. shadow=computeShadowWithPCF3(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  197. #else
  198. shadow=computeShadowWithPCF5(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  199. #endif
  200. #elif defined(SHADOWPCSS{X})
  201. #if defined(SHADOWLOWQUALITY{X})
  202. shadow=computeShadowWithPCSS16(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  203. #elif defined(SHADOWMEDIUMQUALITY{X})
  204. shadow=computeShadowWithPCSS32(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  205. #else
  206. shadow=computeShadowWithPCSS64(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  207. #endif
  208. #else
  209. #if defined(SHADOWCUBE{X})
  210. shadow=computeShadowCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.depthValues);
  211. #else
  212. shadow=computeShadow(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);
  213. #endif
  214. #endif
  215. #ifdef SHADOWONLY
  216. #ifndef SHADOWINUSE
  217. #define SHADOWINUSE
  218. #endif
  219. globalShadow+=shadow;shadowLightCount+=1.0;
  220. #endif
  221. #else
  222. shadow=1.;
  223. #endif
  224. aggShadow+=shadow;numLights+=1.0;
  225. #ifndef SHADOWONLY
  226. #ifdef CUSTOMUSERLIGHTING
  227. diffuseBase+=computeCustomDiffuseLighting(info,diffuseBase,shadow);
  228. #ifdef SPECULARTERM
  229. specularBase+=computeCustomSpecularLighting(info,specularBase,shadow);
  230. #endif
  231. #elif defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X})
  232. diffuseBase+=lightmapColor.rgb*shadow;
  233. #ifdef SPECULARTERM
  234. #ifndef LIGHTMAPNOSPECULAR{X}
  235. specularBase+=info.specular*shadow*lightmapColor.rgb;
  236. #endif
  237. #endif
  238. #ifdef CLEARCOAT
  239. #ifndef LIGHTMAPNOSPECULAR{X}
  240. clearCoatBase+=info.clearCoat.rgb*shadow*lightmapColor.rgb;
  241. #endif
  242. #endif
  243. #ifdef SHEEN
  244. #ifndef LIGHTMAPNOSPECULAR{X}
  245. sheenBase+=info.sheen.rgb*shadow;
  246. #endif
  247. #endif
  248. #else
  249. #ifdef SHADOWCSMDEBUG{X}
  250. diffuseBase+=info.diffuse*shadowDebug{X};
  251. #else
  252. diffuseBase+=info.diffuse*shadow;
  253. #endif
  254. #ifdef SPECULARTERM
  255. specularBase+=info.specular*shadow;
  256. #endif
  257. #ifdef CLEARCOAT
  258. clearCoatBase+=info.clearCoat.rgb*shadow;
  259. #endif
  260. #ifdef SHEEN
  261. sheenBase+=info.sheen.rgb*shadow;
  262. #endif
  263. #endif
  264. #endif
  265. #endif
  266. `;
  267. // Sideeffect
  268. ShaderStore.IncludesShadersStore[name] = shader;
  269. /** @internal */
  270. export const lightFragment = { name, shader };
  271. //# sourceMappingURL=lightFragment.js.map