@babylonjs/core 7.45.0 → 7.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/Buffers/bufferUtils.d.ts +28 -1
  2. package/Buffers/bufferUtils.js +104 -1
  3. package/Buffers/bufferUtils.js.map +1 -1
  4. package/Decorators/nodeDecorator.js +1 -1
  5. package/Decorators/nodeDecorator.js.map +1 -1
  6. package/Engines/Extensions/engine.renderTarget.js +2 -1
  7. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  8. package/Engines/WebGL/webGLRenderTargetWrapper.js +1 -1
  9. package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
  10. package/Engines/WebGPU/Extensions/engine.renderTarget.js +2 -1
  11. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  12. package/Engines/abstractEngine.js +2 -2
  13. package/Engines/abstractEngine.js.map +1 -1
  14. package/Engines/renderTargetWrapper.js +1 -1
  15. package/Engines/renderTargetWrapper.js.map +1 -1
  16. package/Engines/thinEngine.js +2 -1
  17. package/Engines/thinEngine.js.map +1 -1
  18. package/FrameGraph/Node/Blocks/PostProcesses/basePostProcessBlock.d.ts +5 -0
  19. package/FrameGraph/Node/Blocks/PostProcesses/basePostProcessBlock.js +7 -0
  20. package/FrameGraph/Node/Blocks/PostProcesses/basePostProcessBlock.js.map +1 -1
  21. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.d.ts +3 -0
  22. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +13 -0
  23. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  24. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.d.ts +0 -3
  25. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.js +0 -13
  26. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.js.map +1 -1
  27. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js +3 -0
  28. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js.map +1 -1
  29. package/FrameGraph/Node/nodeRenderGraph.js +9 -5
  30. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  31. package/FrameGraph/Node/nodeRenderGraphBlock.js +1 -0
  32. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  33. package/FrameGraph/Passes/renderPass.d.ts +11 -0
  34. package/FrameGraph/Passes/renderPass.js +40 -0
  35. package/FrameGraph/Passes/renderPass.js.map +1 -1
  36. package/FrameGraph/Tasks/Layers/baseLayerTask.js +3 -2
  37. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  38. package/FrameGraph/Tasks/Layers/highlightLayerTask.js +1 -1
  39. package/FrameGraph/Tasks/Layers/highlightLayerTask.js.map +1 -1
  40. package/FrameGraph/Tasks/PostProcesses/bloomMergeTask.js +1 -1
  41. package/FrameGraph/Tasks/PostProcesses/bloomMergeTask.js.map +1 -1
  42. package/FrameGraph/Tasks/PostProcesses/bloomTask.js +1 -1
  43. package/FrameGraph/Tasks/PostProcesses/bloomTask.js.map +1 -1
  44. package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js +1 -1
  45. package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js.map +1 -1
  46. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js +1 -1
  47. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js.map +1 -1
  48. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +2 -2
  49. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  50. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js +1 -0
  51. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js.map +1 -1
  52. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +2 -1
  53. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
  54. package/FrameGraph/Tasks/Texture/copyToBackbufferColorTask.js +1 -0
  55. package/FrameGraph/Tasks/Texture/copyToBackbufferColorTask.js.map +1 -1
  56. package/FrameGraph/Tasks/Texture/copyToTextureTask.js +1 -1
  57. package/FrameGraph/Tasks/Texture/copyToTextureTask.js.map +1 -1
  58. package/FrameGraph/frameGraph.d.ts +5 -5
  59. package/FrameGraph/frameGraph.js +31 -21
  60. package/FrameGraph/frameGraph.js.map +1 -1
  61. package/FrameGraph/frameGraphTask.d.ts +8 -2
  62. package/FrameGraph/frameGraphTask.js +12 -12
  63. package/FrameGraph/frameGraphTask.js.map +1 -1
  64. package/FrameGraph/frameGraphTextureManager.d.ts +33 -2
  65. package/FrameGraph/frameGraphTextureManager.js +368 -27
  66. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  67. package/Lights/LTC/ltcTextureTool.d.ts +20 -0
  68. package/Lights/LTC/ltcTextureTool.js +24 -0
  69. package/Lights/LTC/ltcTextureTool.js.map +1 -0
  70. package/Lights/Shadows/shadowGenerator.d.ts +10 -0
  71. package/Lights/Shadows/shadowGenerator.js +5 -0
  72. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  73. package/Lights/Shadows/shadowGeneratorSceneComponent.js +6 -0
  74. package/Lights/Shadows/shadowGeneratorSceneComponent.js.map +1 -1
  75. package/Lights/areaLight.d.ts +39 -0
  76. package/Lights/areaLight.js +81 -0
  77. package/Lights/areaLight.js.map +1 -0
  78. package/Lights/index.d.ts +2 -0
  79. package/Lights/index.js +2 -0
  80. package/Lights/index.js.map +1 -1
  81. package/Lights/light.d.ts +8 -0
  82. package/Lights/light.js +10 -0
  83. package/Lights/light.js.map +1 -1
  84. package/Lights/lightConstants.d.ts +4 -0
  85. package/Lights/lightConstants.js +4 -0
  86. package/Lights/lightConstants.js.map +1 -1
  87. package/Lights/rectAreaLight.d.ts +61 -0
  88. package/Lights/rectAreaLight.js +127 -0
  89. package/Lights/rectAreaLight.js.map +1 -0
  90. package/Loading/loadingScreen.d.ts +21 -1
  91. package/Loading/loadingScreen.js +125 -52
  92. package/Loading/loadingScreen.js.map +1 -1
  93. package/Materials/Node/Blocks/Dual/lightBlock.js +2 -0
  94. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  95. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +1 -1
  96. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  97. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +2 -1
  98. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  99. package/Materials/Node/Blocks/debugBlock.d.ts +38 -0
  100. package/Materials/Node/Blocks/debugBlock.js +92 -0
  101. package/Materials/Node/Blocks/debugBlock.js.map +1 -0
  102. package/Materials/Node/Blocks/index.d.ts +1 -0
  103. package/Materials/Node/Blocks/index.js +1 -0
  104. package/Materials/Node/Blocks/index.js.map +1 -1
  105. package/Materials/Node/nodeMaterial.d.ts +2 -0
  106. package/Materials/Node/nodeMaterial.js +20 -2
  107. package/Materials/Node/nodeMaterial.js.map +1 -1
  108. package/Materials/Node/nodeMaterialBlock.d.ts +8 -1
  109. package/Materials/Node/nodeMaterialBlock.js +13 -1
  110. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  111. package/Materials/PBR/index.d.ts +1 -0
  112. package/Materials/PBR/index.js +1 -0
  113. package/Materials/PBR/index.js.map +1 -1
  114. package/Materials/PBR/pbrBaseMaterial.d.ts +13 -0
  115. package/Materials/PBR/pbrBaseMaterial.js +60 -0
  116. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  117. package/Materials/PBR/pbrMaterial.d.ts +8 -0
  118. package/Materials/PBR/pbrMaterial.js +12 -0
  119. package/Materials/PBR/pbrMaterial.js.map +1 -1
  120. package/Materials/Textures/internalTexture.d.ts +0 -18
  121. package/Materials/Textures/internalTexture.js +0 -46
  122. package/Materials/Textures/internalTexture.js.map +1 -1
  123. package/Materials/Textures/rawTexture.d.ts +6 -2
  124. package/Materials/Textures/rawTexture.js +10 -3
  125. package/Materials/Textures/rawTexture.js.map +1 -1
  126. package/Materials/Textures/textureHelper.functions.d.ts +18 -0
  127. package/Materials/Textures/textureHelper.functions.js +47 -0
  128. package/Materials/Textures/textureHelper.functions.js.map +1 -0
  129. package/Materials/materialFlags.d.ts +6 -0
  130. package/Materials/materialFlags.js +14 -0
  131. package/Materials/materialFlags.js.map +1 -1
  132. package/Materials/materialHelper.functions.js +3 -1
  133. package/Materials/materialHelper.functions.js.map +1 -1
  134. package/Materials/standardMaterial.d.ts +1 -0
  135. package/Materials/standardMaterial.js +14 -0
  136. package/Materials/standardMaterial.js.map +1 -1
  137. package/Meshes/Compression/dracoCompressionWorker.js +0 -1
  138. package/Meshes/Compression/dracoCompressionWorker.js.map +1 -1
  139. package/Misc/timingTools.d.ts +2 -2
  140. package/Misc/timingTools.js +15 -10
  141. package/Misc/timingTools.js.map +1 -1
  142. package/Particles/gpuParticleSystem.js +8 -2
  143. package/Particles/gpuParticleSystem.js.map +1 -1
  144. package/Rendering/IBLShadows/iblShadowsPluginMaterial.d.ts +4 -0
  145. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +66 -16
  146. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -1
  147. package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +8 -0
  148. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +16 -0
  149. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  150. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +9 -0
  151. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +28 -11
  152. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  153. package/Shaders/ShadersInclude/defaultFragmentDeclaration.js +1 -1
  154. package/Shaders/ShadersInclude/defaultFragmentDeclaration.js.map +1 -1
  155. package/Shaders/ShadersInclude/gaussianSplatting.js +1 -1
  156. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  157. package/Shaders/ShadersInclude/lightFragment.js +19 -1
  158. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  159. package/Shaders/ShadersInclude/lightFragmentDeclaration.js +3 -0
  160. package/Shaders/ShadersInclude/lightFragmentDeclaration.js.map +1 -1
  161. package/Shaders/ShadersInclude/lightUboDeclaration.js +3 -0
  162. package/Shaders/ShadersInclude/lightUboDeclaration.js.map +1 -1
  163. package/Shaders/ShadersInclude/lightVxFragmentDeclaration.js +3 -0
  164. package/Shaders/ShadersInclude/lightVxFragmentDeclaration.js.map +1 -1
  165. package/Shaders/ShadersInclude/lightVxUboDeclaration.js +3 -0
  166. package/Shaders/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
  167. package/Shaders/ShadersInclude/lightsFragmentFunctions.d.ts +1 -0
  168. package/Shaders/ShadersInclude/lightsFragmentFunctions.js +14 -1
  169. package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  170. package/Shaders/ShadersInclude/ltcHelperFunctions.d.ts +5 -0
  171. package/Shaders/ShadersInclude/ltcHelperFunctions.js +31 -0
  172. package/Shaders/ShadersInclude/ltcHelperFunctions.js.map +1 -0
  173. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js +11 -2
  174. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
  175. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +6 -0
  176. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  177. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.d.ts +1 -0
  178. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js +18 -1
  179. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  180. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +6 -3
  181. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
  182. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +4 -0
  183. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  184. package/Shaders/ShadersInclude/pbrUboDeclaration.js +1 -1
  185. package/Shaders/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  186. package/Shaders/ShadersInclude/pbrVertexDeclaration.js +5 -2
  187. package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
  188. package/Shaders/iblShadowAccumulation.fragment.js +6 -5
  189. package/Shaders/iblShadowAccumulation.fragment.js.map +1 -1
  190. package/Shaders/iblShadowSpatialBlur.fragment.js +3 -3
  191. package/Shaders/iblShadowSpatialBlur.fragment.js.map +1 -1
  192. package/Shaders/iblShadowVoxelTracing.fragment.js +26 -8
  193. package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
  194. package/Shaders/pbr.fragment.js +11 -3
  195. package/Shaders/pbr.fragment.js.map +1 -1
  196. package/Shaders/pbr.vertex.js +2 -0
  197. package/Shaders/pbr.vertex.js.map +1 -1
  198. package/ShadersWGSL/ShadersInclude/lightFragment.js +19 -1
  199. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  200. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +4 -0
  201. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
  202. package/ShadersWGSL/ShadersInclude/lightVxFragmentDeclaration.js +3 -0
  203. package/ShadersWGSL/ShadersInclude/lightVxFragmentDeclaration.js.map +1 -1
  204. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js +4 -0
  205. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
  206. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.d.ts +1 -0
  207. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +12 -1
  208. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  209. package/ShadersWGSL/ShadersInclude/ltcHelperFunctions.d.ts +5 -0
  210. package/ShadersWGSL/ShadersInclude/ltcHelperFunctions.js +35 -0
  211. package/ShadersWGSL/ShadersInclude/ltcHelperFunctions.js.map +1 -0
  212. package/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.js +10 -1
  213. package/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
  214. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +4 -0
  215. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  216. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.d.ts +1 -0
  217. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js +18 -1
  218. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  219. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js +4 -0
  220. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  221. package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js +1 -1
  222. package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  223. package/ShadersWGSL/iblShadowAccumulation.fragment.js +4 -3
  224. package/ShadersWGSL/iblShadowAccumulation.fragment.js.map +1 -1
  225. package/ShadersWGSL/iblShadowSpatialBlur.fragment.js +3 -3
  226. package/ShadersWGSL/iblShadowSpatialBlur.fragment.js.map +1 -1
  227. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +26 -8
  228. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
  229. package/ShadersWGSL/pbr.fragment.js +10 -2
  230. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  231. package/ShadersWGSL/pbr.vertex.js +2 -0
  232. package/ShadersWGSL/pbr.vertex.js.map +1 -1
  233. package/Sprites/spriteRenderer.js +1 -0
  234. package/Sprites/spriteRenderer.js.map +1 -1
  235. package/package.json +1 -1
@@ -11,6 +11,7 @@ import { ShaderLanguage } from "../../Materials/shaderLanguage.js";
11
11
  */
12
12
  declare class MaterialIBLShadowsRenderDefines extends MaterialDefines {
13
13
  RENDER_WITH_IBL_SHADOWS: boolean;
14
+ COLORED_IBL_SHADOWS: boolean;
14
15
  }
15
16
  /**
16
17
  * Plugin used to render the contribution from IBL shadows.
@@ -29,6 +30,9 @@ export declare class IBLShadowsPluginMaterial extends MaterialPluginBase {
29
30
  */
30
31
  shadowOpacity: number;
31
32
  private _isEnabled;
33
+ private _isColored;
34
+ get isColored(): boolean;
35
+ set isColored(value: boolean);
32
36
  /**
33
37
  * Defines if the plugin is enabled in the material.
34
38
  */
@@ -12,12 +12,23 @@ class MaterialIBLShadowsRenderDefines extends MaterialDefines {
12
12
  constructor() {
13
13
  super(...arguments);
14
14
  this.RENDER_WITH_IBL_SHADOWS = false;
15
+ this.COLORED_IBL_SHADOWS = false;
15
16
  }
16
17
  }
17
18
  /**
18
19
  * Plugin used to render the contribution from IBL shadows.
19
20
  */
20
21
  export class IBLShadowsPluginMaterial extends MaterialPluginBase {
22
+ get isColored() {
23
+ return this._isColored;
24
+ }
25
+ set isColored(value) {
26
+ if (this._isColored === value) {
27
+ return;
28
+ }
29
+ this._isColored = value;
30
+ this._markAllSubMeshesAsTexturesDirty();
31
+ }
21
32
  _markAllSubMeshesAsTexturesDirty() {
22
33
  this._enable(this._isEnabled);
23
34
  this._internalMarkAllSubMeshesAsTexturesDirty();
@@ -36,6 +47,7 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
36
47
  */
37
48
  this.shadowOpacity = 1.0;
38
49
  this._isEnabled = false;
50
+ this._isColored = false;
39
51
  /**
40
52
  * Defines if the plugin is enabled in the material.
41
53
  */
@@ -44,6 +56,7 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
44
56
  }
45
57
  prepareDefines(defines) {
46
58
  defines.RENDER_WITH_IBL_SHADOWS = this._isEnabled;
59
+ defines.COLORED_IBL_SHADOWS = this.isColored;
47
60
  }
48
61
  getClassName() {
49
62
  return "IBLShadowsPluginMaterial";
@@ -80,11 +93,19 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
80
93
  var iblShadowsTextureSampler: sampler;
81
94
  var iblShadowsTexture: texture_2d<f32>;
82
95
 
83
- fn computeIndirectShadow() -> vec2f {
84
- var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;
85
- var shadowValue: vec2f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rg;
86
- return mix(shadowValue, vec2f(1.0), 1.0 - uniforms.shadowOpacity);
87
- }
96
+ #ifdef COLORED_IBL_SHADOWS
97
+ fn computeIndirectShadow() -> vec3f {
98
+ var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;
99
+ var shadowValue: vec3f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rgb;
100
+ return mix(shadowValue, vec3f(1.0), 1.0 - uniforms.shadowOpacity);
101
+ }
102
+ #else
103
+ fn computeIndirectShadow() -> vec2f {
104
+ var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;
105
+ var shadowValue: vec2f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rg;
106
+ return mix(shadowValue, vec2f(1.0), 1.0 - uniforms.shadowOpacity);
107
+ }
108
+ #endif
88
109
  #endif
89
110
  `,
90
111
  };
@@ -93,9 +114,15 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
93
114
  frag["CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION"] = `
94
115
  #ifdef RENDER_WITH_IBL_SHADOWS
95
116
  #ifdef REFLECTION
96
- var shadowValue: vec2f = computeIndirectShadow();
97
- finalIrradiance *= vec3f(shadowValue.x);
98
- finalRadianceScaled *= vec3f(mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness));
117
+ #ifdef COLORED_IBL_SHADOWS
118
+ var shadowValue: vec3f = computeIndirectShadow();
119
+ finalIrradiance *= shadowValue;
120
+ finalRadianceScaled *= mix(vec3f(1.0), shadowValue, roughness);
121
+ #else
122
+ var shadowValue: vec2f = computeIndirectShadow();
123
+ finalIrradiance *= vec3f(shadowValue.x);
124
+ finalRadianceScaled *= vec3f(mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness));
125
+ #endif
99
126
  #endif
100
127
  #endif
101
128
  `;
@@ -103,8 +130,13 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
103
130
  else {
104
131
  frag["CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR"] = `
105
132
  #ifdef RENDER_WITH_IBL_SHADOWS
106
- var shadowValue: vec2f = computeIndirectShadow();
107
- color *= toGammaSpace(vec4f(shadowValue.x, shadowValue.x, shadowValue.x, 1.0f));
133
+ #ifdef COLORED_IBL_SHADOWS
134
+ var shadowValue: vec3f = computeIndirectShadow();
135
+ color *= toGammaSpace(vec4f(shadowValue, 1.0f));
136
+ #else
137
+ var shadowValue: vec2f = computeIndirectShadow();
138
+ color *= toGammaSpace(vec4f(shadowValue.x, shadowValue.x, shadowValue.x, 1.0f));
139
+ #endif
108
140
  #endif
109
141
  `;
110
142
  }
@@ -115,13 +147,20 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
115
147
  CUSTOM_FRAGMENT_DEFINITIONS: `
116
148
  #ifdef RENDER_WITH_IBL_SHADOWS
117
149
  uniform sampler2D iblShadowsTexture;
118
-
150
+ #ifdef COLORED_IBL_SHADOWS
151
+ vec3 computeIndirectShadow() {
152
+ vec2 uv = gl_FragCoord.xy / renderTargetSize;
153
+ vec3 shadowValue = texture2D(iblShadowsTexture, uv).rgb;
154
+ return mix(shadowValue.rgb, vec3(1.0), 1.0 - shadowOpacity);
155
+ }
156
+ #else
119
157
  vec2 computeIndirectShadow() {
120
158
  vec2 uv = gl_FragCoord.xy / renderTargetSize;
121
159
  vec2 shadowValue = texture2D(iblShadowsTexture, uv).rg;
122
160
  return mix(shadowValue.rg, vec2(1.0), 1.0 - shadowOpacity);
123
161
  }
124
162
  #endif
163
+ #endif
125
164
  `,
126
165
  };
127
166
  if (this._material instanceof PBRBaseMaterial) {
@@ -129,9 +168,15 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
129
168
  frag["CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION"] = `
130
169
  #ifdef RENDER_WITH_IBL_SHADOWS
131
170
  #ifdef REFLECTION
132
- vec2 shadowValue = computeIndirectShadow();
133
- finalIrradiance *= shadowValue.x;
134
- finalRadianceScaled *= mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness);
171
+ #ifdef COLORED_IBL_SHADOWS
172
+ vec3 shadowValue = computeIndirectShadow();
173
+ finalIrradiance.rgb *= shadowValue.rgb;
174
+ finalRadianceScaled *= mix(vec3(1.0), shadowValue.rgb, roughness);
175
+ #else
176
+ vec2 shadowValue = computeIndirectShadow();
177
+ finalIrradiance *= shadowValue.x;
178
+ finalRadianceScaled *= mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness);
179
+ #endif
135
180
  #endif
136
181
  #endif
137
182
  `;
@@ -139,8 +184,13 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
139
184
  else {
140
185
  frag["CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR"] = `
141
186
  #ifdef RENDER_WITH_IBL_SHADOWS
142
- vec2 shadowValue = computeIndirectShadow();
143
- color.rgb *= toGammaSpace(shadowValue.x);
187
+ #ifdef COLORED_IBL_SHADOWS
188
+ vec3 shadowValue = computeIndirectShadow();
189
+ color.rgb *= toGammaSpace(shadowValue.rgb);
190
+ #else
191
+ vec2 shadowValue = computeIndirectShadow();
192
+ color.rgb *= toGammaSpace(shadowValue.x);
193
+ #endif
144
194
  #endif
145
195
  `;
146
196
  }
@@ -1 +1 @@
1
- {"version":3,"file":"iblShadowsPluginMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsPluginMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n/**\r\n * @internal\r\n */\r\nclass MaterialIBLShadowsRenderDefines extends MaterialDefines {\r\n public RENDER_WITH_IBL_SHADOWS = false;\r\n}\r\n\r\n/**\r\n * Plugin used to render the contribution from IBL shadows.\r\n */\r\nexport class IBLShadowsPluginMaterial extends MaterialPluginBase {\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"IBLShadowsPluginMaterial\";\r\n\r\n /**\r\n * The texture containing the contribution from IBL shadows.\r\n */\r\n @serialize()\r\n public iblShadowsTexture: InternalTexture;\r\n\r\n /**\r\n * The opacity of the shadows.\r\n */\r\n @serialize()\r\n public shadowOpacity: number = 1.0;\r\n\r\n private _isEnabled = false;\r\n /**\r\n * Defines if the plugin is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n protected _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a give shader language.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial) {\r\n super(material, IBLShadowsPluginMaterial.Name, 310, new MaterialIBLShadowsRenderDefines());\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n }\r\n\r\n public override prepareDefines(defines: MaterialIBLShadowsRenderDefines) {\r\n defines.RENDER_WITH_IBL_SHADOWS = this._isEnabled;\r\n }\r\n\r\n public override getClassName() {\r\n return \"IBLShadowsPluginMaterial\";\r\n }\r\n\r\n public override getUniforms() {\r\n return {\r\n ubo: [\r\n { name: \"renderTargetSize\", size: 2, type: \"vec2\" },\r\n { name: \"shadowOpacity\", size: 1, type: \"float\" },\r\n ],\r\n fragment: `#ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform vec2 renderTargetSize;\r\n uniform float shadowOpacity;\r\n #endif`,\r\n };\r\n }\r\n\r\n public override getSamplers(samplers: string[]) {\r\n samplers.push(\"iblShadowsTexture\");\r\n }\r\n\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (this._isEnabled) {\r\n uniformBuffer.bindTexture(\"iblShadowsTexture\", this.iblShadowsTexture);\r\n uniformBuffer.updateFloat2(\"renderTargetSize\", this._material.getScene().getEngine().getRenderWidth(), this._material.getScene().getEngine().getRenderHeight());\r\n uniformBuffer.updateFloat(\"shadowOpacity\", this.shadowOpacity);\r\n }\r\n }\r\n\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage) {\r\n let frag: { [name: string]: string };\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n var iblShadowsTextureSampler: sampler;\r\n var iblShadowsTexture: texture_2d<f32>;\r\n\r\n fn computeIndirectShadow() -> vec2f {\r\n var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;\r\n var shadowValue: vec2f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rg;\r\n return mix(shadowValue, vec2f(1.0), 1.0 - uniforms.shadowOpacity);\r\n }\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef REFLECTION\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n finalIrradiance *= vec3f(shadowValue.x);\r\n finalRadianceScaled *= vec3f(mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness));\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n color *= toGammaSpace(vec4f(shadowValue.x, shadowValue.x, shadowValue.x, 1.0f));\r\n #endif\r\n `;\r\n }\r\n } else {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform sampler2D iblShadowsTexture;\r\n\r\n vec2 computeIndirectShadow() {\r\n vec2 uv = gl_FragCoord.xy / renderTargetSize;\r\n vec2 shadowValue = texture2D(iblShadowsTexture, uv).rg;\r\n return mix(shadowValue.rg, vec2(1.0), 1.0 - shadowOpacity);\r\n }\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef REFLECTION\r\n vec2 shadowValue = computeIndirectShadow();\r\n finalIrradiance *= shadowValue.x;\r\n finalRadianceScaled *= mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness);\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n vec2 shadowValue = computeIndirectShadow();\r\n color.rgb *= toGammaSpace(shadowValue.x);\r\n #endif\r\n `;\r\n }\r\n }\r\n\r\n return shaderType === \"vertex\" ? null : frag;\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.IBLShadowsPluginMaterial`, IBLShadowsPluginMaterial);\r\n"]}
1
+ {"version":3,"file":"iblShadowsPluginMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsPluginMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n/**\r\n * @internal\r\n */\r\nclass MaterialIBLShadowsRenderDefines extends MaterialDefines {\r\n public RENDER_WITH_IBL_SHADOWS = false;\r\n public COLORED_IBL_SHADOWS = false;\r\n}\r\n\r\n/**\r\n * Plugin used to render the contribution from IBL shadows.\r\n */\r\nexport class IBLShadowsPluginMaterial extends MaterialPluginBase {\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"IBLShadowsPluginMaterial\";\r\n\r\n /**\r\n * The texture containing the contribution from IBL shadows.\r\n */\r\n @serialize()\r\n public iblShadowsTexture: InternalTexture;\r\n\r\n /**\r\n * The opacity of the shadows.\r\n */\r\n @serialize()\r\n public shadowOpacity: number = 1.0;\r\n\r\n private _isEnabled = false;\r\n private _isColored = false;\r\n public get isColored(): boolean {\r\n return this._isColored;\r\n }\r\n public set isColored(value: boolean) {\r\n if (this._isColored === value) {\r\n return;\r\n }\r\n this._isColored = value;\r\n this._markAllSubMeshesAsTexturesDirty();\r\n }\r\n /**\r\n * Defines if the plugin is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n protected _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a give shader language.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial) {\r\n super(material, IBLShadowsPluginMaterial.Name, 310, new MaterialIBLShadowsRenderDefines());\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n }\r\n\r\n public override prepareDefines(defines: MaterialIBLShadowsRenderDefines) {\r\n defines.RENDER_WITH_IBL_SHADOWS = this._isEnabled;\r\n defines.COLORED_IBL_SHADOWS = this.isColored;\r\n }\r\n\r\n public override getClassName() {\r\n return \"IBLShadowsPluginMaterial\";\r\n }\r\n\r\n public override getUniforms() {\r\n return {\r\n ubo: [\r\n { name: \"renderTargetSize\", size: 2, type: \"vec2\" },\r\n { name: \"shadowOpacity\", size: 1, type: \"float\" },\r\n ],\r\n fragment: `#ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform vec2 renderTargetSize;\r\n uniform float shadowOpacity;\r\n #endif`,\r\n };\r\n }\r\n\r\n public override getSamplers(samplers: string[]) {\r\n samplers.push(\"iblShadowsTexture\");\r\n }\r\n\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (this._isEnabled) {\r\n uniformBuffer.bindTexture(\"iblShadowsTexture\", this.iblShadowsTexture);\r\n uniformBuffer.updateFloat2(\"renderTargetSize\", this._material.getScene().getEngine().getRenderWidth(), this._material.getScene().getEngine().getRenderHeight());\r\n uniformBuffer.updateFloat(\"shadowOpacity\", this.shadowOpacity);\r\n }\r\n }\r\n\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage) {\r\n let frag: { [name: string]: string };\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n var iblShadowsTextureSampler: sampler;\r\n var iblShadowsTexture: texture_2d<f32>;\r\n\r\n #ifdef COLORED_IBL_SHADOWS\r\n fn computeIndirectShadow() -> vec3f {\r\n var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;\r\n var shadowValue: vec3f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rgb;\r\n return mix(shadowValue, vec3f(1.0), 1.0 - uniforms.shadowOpacity);\r\n }\r\n #else\r\n fn computeIndirectShadow() -> vec2f {\r\n var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;\r\n var shadowValue: vec2f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rg;\r\n return mix(shadowValue, vec2f(1.0), 1.0 - uniforms.shadowOpacity);\r\n }\r\n #endif\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n finalIrradiance *= shadowValue;\r\n finalRadianceScaled *= mix(vec3f(1.0), shadowValue, roughness);\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n finalIrradiance *= vec3f(shadowValue.x);\r\n finalRadianceScaled *= vec3f(mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness));\r\n #endif\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n color *= toGammaSpace(vec4f(shadowValue, 1.0f));\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n color *= toGammaSpace(vec4f(shadowValue.x, shadowValue.x, shadowValue.x, 1.0f));\r\n #endif\r\n #endif\r\n `;\r\n }\r\n } else {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform sampler2D iblShadowsTexture;\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 computeIndirectShadow() {\r\n vec2 uv = gl_FragCoord.xy / renderTargetSize;\r\n vec3 shadowValue = texture2D(iblShadowsTexture, uv).rgb;\r\n return mix(shadowValue.rgb, vec3(1.0), 1.0 - shadowOpacity);\r\n }\r\n #else\r\n vec2 computeIndirectShadow() {\r\n vec2 uv = gl_FragCoord.xy / renderTargetSize;\r\n vec2 shadowValue = texture2D(iblShadowsTexture, uv).rg;\r\n return mix(shadowValue.rg, vec2(1.0), 1.0 - shadowOpacity);\r\n }\r\n #endif\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n finalIrradiance.rgb *= shadowValue.rgb;\r\n finalRadianceScaled *= mix(vec3(1.0), shadowValue.rgb, roughness);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n finalIrradiance *= shadowValue.x;\r\n finalRadianceScaled *= mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness);\r\n #endif\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n color.rgb *= toGammaSpace(shadowValue.rgb);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n color.rgb *= toGammaSpace(shadowValue.x);\r\n #endif\r\n #endif\r\n `;\r\n }\r\n }\r\n\r\n return shaderType === \"vertex\" ? null : frag;\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.IBLShadowsPluginMaterial`, IBLShadowsPluginMaterial);\r\n"]}
@@ -101,6 +101,7 @@ export declare class IblShadowsRenderPipeline extends PostProcessRenderPipeline
101
101
  private _dummyTexture3d;
102
102
  private _shadowOpacity;
103
103
  private _enabled;
104
+ private _coloredShadows;
104
105
  private _materialsWithRenderPlugin;
105
106
  /**
106
107
  * Observable that triggers when the shadow renderer is ready
@@ -124,6 +125,13 @@ export declare class IblShadowsRenderPipeline extends PostProcessRenderPipeline
124
125
  */
125
126
  get shadowOpacity(): number;
126
127
  set shadowOpacity(value: number);
128
+ /**
129
+ * Render the shadows in color rather than black and white.
130
+ * This is slightly more expensive than black and white shadows but can be much
131
+ * more accurate when the strongest lights in the IBL are non-white.
132
+ */
133
+ get coloredShadows(): boolean;
134
+ set coloredShadows(value: boolean);
127
135
  private _renderSizeFactor;
128
136
  /**
129
137
  * A multiplier for the render size of the shadows. Used for rendering lower-resolution shadows.
@@ -40,6 +40,19 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
40
40
  this._shadowOpacity = value;
41
41
  this._setPluginParameters();
42
42
  }
43
+ /**
44
+ * Render the shadows in color rather than black and white.
45
+ * This is slightly more expensive than black and white shadows but can be much
46
+ * more accurate when the strongest lights in the IBL are non-white.
47
+ */
48
+ get coloredShadows() {
49
+ return this._coloredShadows;
50
+ }
51
+ set coloredShadows(value) {
52
+ this._coloredShadows = value;
53
+ this._voxelTracingPass.coloredShadows = value;
54
+ this._setPluginParameters();
55
+ }
43
56
  /**
44
57
  * A multiplier for the render size of the shadows. Used for rendering lower-resolution shadows.
45
58
  */
@@ -552,6 +565,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
552
565
  this._shadowCastingMeshes = [];
553
566
  this._shadowOpacity = 0.8;
554
567
  this._enabled = true;
568
+ this._coloredShadows = false;
555
569
  this._materialsWithRenderPlugin = [];
556
570
  /**
557
571
  * Observable that triggers when the shadow renderer is ready
@@ -868,6 +882,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
868
882
  plugin.shadowOpacity = this.shadowOpacity;
869
883
  }
870
884
  plugin.isEnabled = this._enabled;
885
+ plugin.isColored = this._coloredShadows;
871
886
  this._materialsWithRenderPlugin.push(material);
872
887
  }
873
888
  _setPluginParameters() {
@@ -879,6 +894,7 @@ export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
879
894
  const plugin = mat.pluginManager.getPlugin(IBLShadowsPluginMaterial.Name);
880
895
  plugin.iblShadowsTexture = this._getAccumulatedTexture().getInternalTexture();
881
896
  plugin.shadowOpacity = this.shadowOpacity;
897
+ plugin.isColored = this._coloredShadows;
882
898
  }
883
899
  });
884
900
  }