@babylonjs/materials 9.23.0 → 9.26.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.
@@ -7,6 +7,17 @@ import { type AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh.js";
7
7
  import { type SubMesh } from "@babylonjs/core/Meshes/subMesh.js";
8
8
  import { type Mesh } from "@babylonjs/core/Meshes/mesh.js";
9
9
  import { Scene } from "@babylonjs/core/scene.js";
10
+ /**
11
+ * Max value the sky shader may write before the bound render target stores it as +Inf (which would
12
+ * corrupt anything reading the texture back, e.g. an IBL CDF). Derived from the RT's texture type:
13
+ * half-float caps at its 65504 ceiling; float is effectively unbounded (a huge finite +Inf guard);
14
+ * anything else (8-bit LDR, or the default framebuffer when no RT is bound) is [0,1]. Only used when
15
+ * `rawHdrOutput` is enabled.
16
+ * @param textureType the bound render target's texture type (Constants.TEXTURETYPE_*), or undefined
17
+ * @returns the maximum color value that can be stored without overflowing to +Inf
18
+ * @internal
19
+ */
20
+ export declare function _MaxColorValueForRenderTarget(textureType: number | undefined): number;
10
21
  /**
11
22
  * This is the sky material which allows to create dynamic and texture free effects for skyboxes.
12
23
  * @see https://doc.babylonjs.com/toolsAndResources/assetLibraries/materialsLibrary/skyMat
@@ -69,6 +80,28 @@ export declare class SkyMaterial extends PushMaterial {
69
80
  * Defines if sky should be dithered.
70
81
  */
71
82
  dithering: boolean;
83
+ /**
84
+ * When enabled, the material emits scene-referred linear HDR: `luminance` acts as a plain linear
85
+ * gain (no filmic tonemap), the output is clamped to the bound render target's max representable
86
+ * value rather than [0, 1] (so a bright sun cannot overflow to +Inf), and no sRGB encode is
87
+ * applied. Enable this to bake the sky into an HDR (float / half-float) render target — e.g. an
88
+ * IBL environment cube — where the full dynamic range of the sun disc must be preserved. The
89
+ * clamp ceiling follows whatever target is bound at draw time (65504 for half-float, effectively
90
+ * unbounded for float); if the sky is drawn to an LDR target or the default framebuffer it falls
91
+ * back to [0, 1], so this flag is only meaningful when rendering into a float/half-float target.
92
+ * When disabled, the material produces tonemapped, display-referred output for direct viewing.
93
+ */
94
+ rawHdrOutput: boolean;
95
+ /**
96
+ * Cloud cover over the sun in [0, 1] (0 = clear direct sun, default; 1 = sun fully hidden). This
97
+ * softens only the *sun disc* — the sky dome color itself is unchanged (there is no overcast
98
+ * graying or whitening of the sky). At 0 the sun is a sharp solar disc; above 0 a physically-
99
+ * based single-scattering cloud model attenuates the direct beam (Beer–Lambert) and redistributes
100
+ * the removed energy into a dual-lobe Henyey–Greenstein aureole, energy-conserving as it broadens
101
+ * (thin cloud → tight silver lining; heavy cloud → broad, directionless glow). See the sun-disc
102
+ * branch in sky.fragment for the model + references.
103
+ */
104
+ cloudiness: number;
72
105
  private _cameraPosition;
73
106
  private _skyOrientation;
74
107
  private static readonly _ShaderLoader;
@@ -4,6 +4,7 @@ import { SerializationHelper } from "@babylonjs/core/Misc/decorators.serializati
4
4
  import { Vector3, Quaternion, TmpVectors } from "@babylonjs/core/Maths/math.vector.js";
5
5
  import { MaterialDefines } from "@babylonjs/core/Materials/materialDefines.js";
6
6
  import { PushMaterial } from "@babylonjs/core/Materials/pushMaterial.js";
7
+ import { Constants } from "@babylonjs/core/Engines/constants.js";
7
8
  import { VertexBuffer } from "@babylonjs/core/Buffers/buffer.js";
8
9
  import { Scene } from "@babylonjs/core/scene.js";
9
10
  import { RegisterClass } from "@babylonjs/core/Misc/typeStore.js";
@@ -29,9 +30,33 @@ class SkyMaterialDefines extends MaterialDefines {
29
30
  this.SKIPFINALCOLORCLAMP = false;
30
31
  this.DITHER = false;
31
32
  this.LOGARITHMICDEPTH = false;
33
+ this.SKY_RAW_HDR_OUTPUT = false;
32
34
  this.rebuild();
33
35
  }
34
36
  }
37
+ /**
38
+ * Max value the sky shader may write before the bound render target stores it as +Inf (which would
39
+ * corrupt anything reading the texture back, e.g. an IBL CDF). Derived from the RT's texture type:
40
+ * half-float caps at its 65504 ceiling; float is effectively unbounded (a huge finite +Inf guard);
41
+ * anything else (8-bit LDR, or the default framebuffer when no RT is bound) is [0,1]. Only used when
42
+ * `rawHdrOutput` is enabled.
43
+ * @param textureType the bound render target's texture type (Constants.TEXTURETYPE_*), or undefined
44
+ * @returns the maximum color value that can be stored without overflowing to +Inf
45
+ * @internal
46
+ */
47
+ export function _MaxColorValueForRenderTarget(textureType) {
48
+ switch (textureType) {
49
+ case Constants.TEXTURETYPE_HALF_FLOAT:
50
+ // IEEE-754 half-float max (core's `MaxHalfFloat`). Inlined, not imported: it's not on
51
+ // the public `BABYLON` namespace, so the materials UMD build resolves the import to
52
+ // `undefined` at runtime (→ NaN clamp ceiling).
53
+ return 65504;
54
+ case Constants.TEXTURETYPE_FLOAT:
55
+ return 3.0e38;
56
+ default:
57
+ return 1.0;
58
+ }
59
+ }
35
60
  /**
36
61
  * This is the sky material which allows to create dynamic and texture free effects for skyboxes.
37
62
  * @see https://doc.babylonjs.com/toolsAndResources/assetLibraries/materialsLibrary/skyMat
@@ -78,6 +103,12 @@ let SkyMaterial = (() => {
78
103
  let _dithering_decorators;
79
104
  let _dithering_initializers = [];
80
105
  let _dithering_extraInitializers = [];
106
+ let _rawHdrOutput_decorators;
107
+ let _rawHdrOutput_initializers = [];
108
+ let _rawHdrOutput_extraInitializers = [];
109
+ let _cloudiness_decorators;
110
+ let _cloudiness_initializers = [];
111
+ let _cloudiness_extraInitializers = [];
81
112
  return _a = class SkyMaterial extends _classSuper {
82
113
  /**
83
114
  * Instantiates a new sky material.
@@ -147,8 +178,30 @@ let SkyMaterial = (() => {
147
178
  * Defines if sky should be dithered.
148
179
  */
149
180
  this.dithering = (__runInitializers(this, _up_extraInitializers), __runInitializers(this, _dithering_initializers, false));
181
+ /**
182
+ * When enabled, the material emits scene-referred linear HDR: `luminance` acts as a plain linear
183
+ * gain (no filmic tonemap), the output is clamped to the bound render target's max representable
184
+ * value rather than [0, 1] (so a bright sun cannot overflow to +Inf), and no sRGB encode is
185
+ * applied. Enable this to bake the sky into an HDR (float / half-float) render target — e.g. an
186
+ * IBL environment cube — where the full dynamic range of the sun disc must be preserved. The
187
+ * clamp ceiling follows whatever target is bound at draw time (65504 for half-float, effectively
188
+ * unbounded for float); if the sky is drawn to an LDR target or the default framebuffer it falls
189
+ * back to [0, 1], so this flag is only meaningful when rendering into a float/half-float target.
190
+ * When disabled, the material produces tonemapped, display-referred output for direct viewing.
191
+ */
192
+ this.rawHdrOutput = (__runInitializers(this, _dithering_extraInitializers), __runInitializers(this, _rawHdrOutput_initializers, false));
193
+ /**
194
+ * Cloud cover over the sun in [0, 1] (0 = clear direct sun, default; 1 = sun fully hidden). This
195
+ * softens only the *sun disc* — the sky dome color itself is unchanged (there is no overcast
196
+ * graying or whitening of the sky). At 0 the sun is a sharp solar disc; above 0 a physically-
197
+ * based single-scattering cloud model attenuates the direct beam (Beer–Lambert) and redistributes
198
+ * the removed energy into a dual-lobe Henyey–Greenstein aureole, energy-conserving as it broadens
199
+ * (thin cloud → tight silver lining; heavy cloud → broad, directionless glow). See the sun-disc
200
+ * branch in sky.fragment for the model + references.
201
+ */
202
+ this.cloudiness = (__runInitializers(this, _rawHdrOutput_extraInitializers), __runInitializers(this, _cloudiness_initializers, 0));
150
203
  // Private members
151
- this._cameraPosition = (__runInitializers(this, _dithering_extraInitializers), Vector3.Zero());
204
+ this._cameraPosition = (__runInitializers(this, _cloudiness_extraInitializers), Vector3.Zero());
152
205
  this._skyOrientation = new Quaternion();
153
206
  }
154
207
  /**
@@ -203,6 +256,9 @@ let SkyMaterial = (() => {
203
256
  if (defines.DITHER !== this.dithering) {
204
257
  defines.markAsMiscDirty();
205
258
  }
259
+ if (defines.SKY_RAW_HDR_OUTPUT !== this.rawHdrOutput) {
260
+ defines.markAsMiscDirty();
261
+ }
206
262
  // Get correct effect
207
263
  if (defines.isDirty) {
208
264
  defines.markAsProcessed();
@@ -214,6 +270,7 @@ let SkyMaterial = (() => {
214
270
  }
215
271
  defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;
216
272
  defines.DITHER = this.dithering;
273
+ defines.SKY_RAW_HDR_OUTPUT = this.rawHdrOutput;
217
274
  //Attributes
218
275
  const attribs = [VertexBuffer.PositionKind];
219
276
  if (defines.VERTEXCOLOR) {
@@ -237,6 +294,8 @@ let SkyMaterial = (() => {
237
294
  "cameraPosition",
238
295
  "cameraOffset",
239
296
  "up",
297
+ "cloudiness",
298
+ "maxColorValue",
240
299
  ];
241
300
  AddClipPlaneUniforms(uniforms);
242
301
  const join = defines.toString();
@@ -295,8 +354,9 @@ let SkyMaterial = (() => {
295
354
  if (scene.fogEnabled && mesh.applyFog && scene.fogMode !== Scene.FOGMODE_NONE) {
296
355
  this._activeEffect.setMatrix("view", scene.getViewMatrix());
297
356
  }
298
- // Fog
299
- BindFogParameters(scene, mesh, this._activeEffect);
357
+ // Fog. In raw-HDR mode the shader output is linear scene-referred color, so the gamma-space
358
+ // scene.fogColor must be converted to linear before it is mixed in (linearSpace = true).
359
+ BindFogParameters(scene, mesh, this._activeEffect, this.rawHdrOutput);
300
360
  // Sky
301
361
  const camera = scene.activeCamera;
302
362
  if (camera) {
@@ -308,13 +368,23 @@ let SkyMaterial = (() => {
308
368
  }
309
369
  this._activeEffect.setVector3("cameraOffset", this.cameraOffset);
310
370
  this._activeEffect.setVector3("up", this.up);
311
- if (this.luminance > 0) {
371
+ // In raw-HDR mode `luminance` is a linear gain, so 0 is valid and must be uploaded (it
372
+ // produces black). The tonemapped path uses `luminance` as a divisor (0.1 / luminance,
373
+ // log2(2 / luminance^4)), where 0 is invalid — keep the guard that skips uploading it there.
374
+ if (this.rawHdrOutput || this.luminance > 0) {
312
375
  this._activeEffect.setFloat("luminance", this.luminance);
313
376
  }
314
377
  this._activeEffect.setFloat("turbidity", this.turbidity);
315
378
  this._activeEffect.setFloat("rayleigh", this.rayleigh);
316
379
  this._activeEffect.setFloat("mieCoefficient", this.mieCoefficient);
317
380
  this._activeEffect.setFloat("mieDirectionalG", this.mieDirectionalG);
381
+ this._activeEffect.setFloat("cloudiness", this.cloudiness);
382
+ if (this.rawHdrOutput) {
383
+ // Match the clamp ceiling to the render target the sky is drawn into (read at bind time,
384
+ // since the same material may bake into a half-float cube yet also draw to an LDR view).
385
+ const currentRenderTarget = scene.getEngine()._currentRenderTarget;
386
+ this._activeEffect.setFloat("maxColorValue", _MaxColorValueForRenderTarget(currentRenderTarget?.texture?.type));
387
+ }
318
388
  if (!this.useSunPosition) {
319
389
  const theta = Math.PI * (this.inclination - 0.5);
320
390
  const phi = 2 * Math.PI * (this.azimuth - 0.5);
@@ -392,6 +462,8 @@ let SkyMaterial = (() => {
392
462
  _cameraOffset_decorators = [serializeAsVector3()];
393
463
  _up_decorators = [serializeAsVector3()];
394
464
  _dithering_decorators = [serialize()];
465
+ _rawHdrOutput_decorators = [serialize()];
466
+ _cloudiness_decorators = [serialize()];
395
467
  __esDecorate(null, null, _luminance_decorators, { kind: "field", name: "luminance", static: false, private: false, access: { has: obj => "luminance" in obj, get: obj => obj.luminance, set: (obj, value) => { obj.luminance = value; } }, metadata: _metadata }, _luminance_initializers, _luminance_extraInitializers);
396
468
  __esDecorate(null, null, _turbidity_decorators, { kind: "field", name: "turbidity", static: false, private: false, access: { has: obj => "turbidity" in obj, get: obj => obj.turbidity, set: (obj, value) => { obj.turbidity = value; } }, metadata: _metadata }, _turbidity_initializers, _turbidity_extraInitializers);
397
469
  __esDecorate(null, null, _rayleigh_decorators, { kind: "field", name: "rayleigh", static: false, private: false, access: { has: obj => "rayleigh" in obj, get: obj => obj.rayleigh, set: (obj, value) => { obj.rayleigh = value; } }, metadata: _metadata }, _rayleigh_initializers, _rayleigh_extraInitializers);
@@ -405,6 +477,8 @@ let SkyMaterial = (() => {
405
477
  __esDecorate(null, null, _cameraOffset_decorators, { kind: "field", name: "cameraOffset", static: false, private: false, access: { has: obj => "cameraOffset" in obj, get: obj => obj.cameraOffset, set: (obj, value) => { obj.cameraOffset = value; } }, metadata: _metadata }, _cameraOffset_initializers, _cameraOffset_extraInitializers);
406
478
  __esDecorate(null, null, _up_decorators, { kind: "field", name: "up", static: false, private: false, access: { has: obj => "up" in obj, get: obj => obj.up, set: (obj, value) => { obj.up = value; } }, metadata: _metadata }, _up_initializers, _up_extraInitializers);
407
479
  __esDecorate(null, null, _dithering_decorators, { kind: "field", name: "dithering", static: false, private: false, access: { has: obj => "dithering" in obj, get: obj => obj.dithering, set: (obj, value) => { obj.dithering = value; } }, metadata: _metadata }, _dithering_initializers, _dithering_extraInitializers);
480
+ __esDecorate(null, null, _rawHdrOutput_decorators, { kind: "field", name: "rawHdrOutput", static: false, private: false, access: { has: obj => "rawHdrOutput" in obj, get: obj => obj.rawHdrOutput, set: (obj, value) => { obj.rawHdrOutput = value; } }, metadata: _metadata }, _rawHdrOutput_initializers, _rawHdrOutput_extraInitializers);
481
+ __esDecorate(null, null, _cloudiness_decorators, { kind: "field", name: "cloudiness", static: false, private: false, access: { has: obj => "cloudiness" in obj, get: obj => obj.cloudiness, set: (obj, value) => { obj.cloudiness = value; } }, metadata: _metadata }, _cloudiness_initializers, _cloudiness_extraInitializers);
408
482
  if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
409
483
  })(),
410
484
  _a._ShaderLoader = new _ShaderImportLoader(() => [import("./sky.vertex.js"), import("./sky.fragment.js")], () => [import("./wgsl/sky.vertex.js"), import("./wgsl/sky.fragment.js")]),
@@ -1 +1 @@
1
- {"version":3,"file":"skyMaterial.js","sourceRoot":"","sources":["../../../../dev/materials/src/sky/skyMaterial.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAe,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGtF,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGnE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAE9I,gBAAgB;AAChB,MAAM,kBAAmB,SAAQ,eAAe;IAgB5C;QACI,KAAK,EAAE,CAAC;QAhBL,cAAS,GAAG,KAAK,CAAC;QAClB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,cAAS,GAAG,KAAK,CAAC;QAClB,QAAG,GAAG,KAAK,CAAC;QACZ,gBAAW,GAAG,KAAK,CAAC;QACpB,gBAAW,GAAG,KAAK,CAAC;QACpB,+BAA0B,GAAG,KAAK,CAAC;QACnC,wBAAmB,GAAG,KAAK,CAAC;QAC5B,WAAM,GAAG,KAAK,CAAC;QACf,qBAAgB,GAAG,KAAK,CAAC;QAI5B,IAAI,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;CACJ;AAED;;;GAGG;IACU,WAAW;;sBAAS,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAAhC,WAAY,SAAQ,WAAY;YA6FzC;;;;;;;;eAQG;YACH,YAAY,IAAY,EAAE,KAAa,EAAE,SAAS,GAAG,KAAK;gBACtD,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBAtG7C;;mBAEG;gBAEI,cAAS,oDAAW,GAAG,EAAC;gBAE/B;;mBAEG;gBAEI,cAAS,4GAAW,IAAI,GAAC;gBAEhC;;mBAEG;gBAEI,aAAQ,2GAAW,GAAG,GAAC;gBAE9B;;mBAEG;gBAEI,mBAAc,gHAAW,KAAK,GAAC;gBAEtC;;mBAEG;gBAEI,oBAAe,uHAAW,GAAG,GAAC;gBAErC;;mBAEG;gBAEI,aAAQ,iHAAW,GAAG,GAAC;gBAE9B;;;mBAGG;gBAEI,gBAAW,6GAAW,IAAI,GAAC;gBAElC;;;mBAGG;gBAEI,YAAO,4GAAW,IAAI,GAAC;gBAE9B;;;mBAGG;gBAEI,gBAAW,4GAAY,IAAI,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAC;gBAErD;;;mBAGG;gBAEI,mBAAc,mHAAY,KAAK,GAAC;gBAEvC;;;mBAGG;gBAEI,iBAAY,oHAAY,OAAO,CAAC,IAAI,EAAE,GAAC;gBAE9C;;mBAEG;gBAEI,OAAE,wGAAY,OAAO,CAAC,EAAE,EAAE,GAAC;gBAElC;;mBAEG;gBAEI,cAAS,qGAAY,KAAK,GAAC;gBAElC,kBAAkB;gBACV,oBAAe,2DAAY,OAAO,CAAC,IAAI,EAAE,EAAC;gBAC1C,oBAAe,GAAe,IAAI,UAAU,EAAE,CAAC;YAkBvD,CAAC;YAED;;;eAGG;YACa,iBAAiB;gBAC7B,OAAO,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;YAC5B,CAAC;YAED;;;eAGG;YACa,gBAAgB;gBAC5B,OAAO,KAAK,CAAC;YACjB,CAAC;YAED;;;eAGG;YACa,mBAAmB;gBAC/B,OAAO,IAAI,CAAC;YAChB,CAAC;YAED;;;;;;eAMG;YACa,iBAAiB,CAAC,IAAkB,EAAE,OAAgB;gBAClE,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;gBAEzC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,mBAAmB,EAAE,CAAC;wBACxD,OAAO,IAAI,CAAC;oBAChB,CAAC;gBACL,CAAC;gBAED,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;oBAC3B,OAAO,CAAC,eAAe,GAAG,IAAI,kBAAkB,EAAE,CAAC;gBACvD,CAAC;gBAED,MAAM,OAAO,GAAuB,OAAO,CAAC,eAAe,CAAC;gBAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAE9B,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnC,OAAO,IAAI,CAAC;gBAChB,CAAC;gBAED,qBAAqB,CACjB,IAAI,EACJ,KAAK,EACL,IAAI,CAAC,oBAAoB,EACzB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,UAAU,EACf,KAAK,EACL,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,EACT,IAAI,CAAC,wBAAwB,CAChC,CAAC;gBAEF,UAAU;gBACV,2BAA2B,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBAExD,IAAI,OAAO,CAAC,0BAA0B,KAAK,KAAK,CAAC,4BAA4B,CAAC,kBAAkB,EAAE,CAAC;oBAC/F,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC9B,CAAC;gBAED,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;oBACpC,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC9B,CAAC;gBAED,qBAAqB;gBACrB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBAClB,OAAO,CAAC,eAAe,EAAE,CAAC;oBAE1B,KAAK,CAAC,mBAAmB,EAAE,CAAC;oBAE5B,YAAY;oBACZ,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;oBACxC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;wBACd,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;oBACpC,CAAC;oBAED,OAAO,CAAC,0BAA0B,GAAG,KAAK,CAAC,4BAA4B,CAAC,kBAAkB,CAAC;oBAC3F,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;oBAEhC,YAAY;oBACZ,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;oBAE5C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;wBACtB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;oBACzC,CAAC;oBAED,MAAM,UAAU,GAAG,KAAK,CAAC;oBAEzB,MAAM,QAAQ,GAAG;wBACb,OAAO;wBACP,gBAAgB;wBAChB,MAAM;wBACN,WAAW;wBACX,WAAW;wBACX,0BAA0B;wBAC1B,WAAW;wBACX,WAAW;wBACX,WAAW;wBACX,UAAU;wBACV,gBAAgB;wBAChB,iBAAiB;wBACjB,aAAa;wBACb,gBAAgB;wBAChB,cAAc;wBACd,IAAI;qBACP,CAAC;oBACF,oBAAoB,CAAC,QAAQ,CAAC,CAAC;oBAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAChC,OAAO,CAAC,SAAS,CACb,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,CAC1B,UAAU,EACc;wBACpB,UAAU,EAAE,OAAO;wBACnB,aAAa,EAAE,QAAQ;wBACvB,mBAAmB,EAAE,EAAE;wBACvB,QAAQ,EAAE,EAAE;wBACZ,OAAO,EAAE,IAAI;wBACb,SAAS,EAAE,SAAS;wBACpB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,cAAc,EAAE,IAAI,CAAC,eAAe;wBACpC,yBAAyB,EAAE,EAAW,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC;qBAC7F,EACD,KAAK,CAAC,SAAS,EAAE,CACpB,EACD,OAAO,EACP,IAAI,CAAC,gBAAgB,CACxB,CAAC;gBACN,CAAC;gBAED,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;oBAC/C,OAAO,KAAK,CAAC;gBACjB,CAAC;gBAED,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBACxC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC;gBAEvC,OAAO,IAAI,CAAC;YAChB,CAAC;YAED;;;;;eAKG;YACa,cAAc,CAAC,KAAa,EAAE,IAAU,EAAE,OAAgB;gBACtE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAE9B,MAAM,OAAO,GAAuB,OAAO,CAAC,eAAe,CAAC;gBAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,OAAO;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;oBACV,OAAO;gBACX,CAAC;gBACD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;gBAE5B,WAAW;gBACX,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAChC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;gBAE3E,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC3C,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;oBAEnC,aAAa;oBACb,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;wBACnB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC7D,CAAC;oBAED,aAAa;oBACb,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;wBAC5B,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;oBACzC,CAAC;gBACL,CAAC;gBAED,OAAO;gBACP,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC;oBAC5E,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;gBAChE,CAAC;gBAED,MAAM;gBACN,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBAEnD,MAAM;gBACN,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;gBAClC,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,iBAAiB,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;oBAClD,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACjD,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACjD,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACjD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBACtJ,CAAC;gBAED,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAEjE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBAE7C,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;oBACrB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7D,CAAC;gBAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBACzD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBACnE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBAErE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;oBACjD,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;oBAE/C,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACrE,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;oBACtD,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAErE,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;oBACnF,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACrF,CAAC;gBAED,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAE/D,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACvD,CAAC;YAED;;;eAGG;YACa,cAAc;gBAC1B,OAAO,EAAE,CAAC;YACd,CAAC;YAED;;;eAGG;YACa,OAAO,CAAC,kBAA4B;gBAChD,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC;YAED;;;;eAIG;YACa,KAAK,CAAC,IAAY;gBAC9B,OAAO,mBAAmB,CAAC,KAAK,CAAc,GAAG,EAAE,CAAC,IAAI,EAAW,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACtG,CAAC;YAED;;;eAGG;YACa,SAAS;gBACrB,MAAM,mBAAmB,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC9C,mBAAmB,CAAC,UAAU,GAAG,qBAAqB,CAAC;gBACvD,OAAO,mBAAmB,CAAC;YAC/B,CAAC;YAED;;;;eAIG;YACa,YAAY;gBACxB,OAAO,aAAa,CAAC;YACzB,CAAC;YAED;;;;;;eAMG;YACI,MAAM,CAAU,KAAK,CAAC,MAAW,EAAE,KAAY,EAAE,OAAe;gBACnE,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAW,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACxG,CAAC;;;;qCAzYA,SAAS,EAAE;qCAMX,SAAS,EAAE;oCAMX,SAAS,EAAE;0CAMX,SAAS,EAAE;2CAMX,SAAS,EAAE;oCAMX,SAAS,EAAE;uCAOX,SAAS,EAAE;mCAOX,SAAS,EAAE;uCAOX,kBAAkB,EAAE;0CAOpB,SAAS,EAAE;wCAOX,kBAAkB,EAAE;8BAMpB,kBAAkB,EAAE;qCAMpB,SAAS,EAAE;YA5EZ,6KAAO,SAAS,6BAAT,SAAS,6FAAe;YAM/B,6KAAO,SAAS,6BAAT,SAAS,6FAAgB;YAMhC,0KAAO,QAAQ,6BAAR,QAAQ,2FAAe;YAM9B,4LAAO,cAAc,6BAAd,cAAc,uGAAiB;YAMtC,+LAAO,eAAe,6BAAf,eAAe,yGAAe;YAMrC,0KAAO,QAAQ,6BAAR,QAAQ,2FAAe;YAO9B,mLAAO,WAAW,6BAAX,WAAW,iGAAgB;YAOlC,uKAAO,OAAO,6BAAP,OAAO,yFAAgB;YAO9B,mLAAO,WAAW,6BAAX,WAAW,iGAAmC;YAOrD,4LAAO,cAAc,6BAAd,cAAc,uGAAkB;YAOvC,sLAAO,YAAY,6BAAZ,YAAY,mGAA2B;YAM9C,wJAAO,EAAE,6BAAF,EAAE,+EAAyB;YAMlC,6KAAO,SAAS,6BAAT,SAAS,6FAAkB;;;QAMV,gBAAa,GAAiB,IAAI,mBAAmB,CACzE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,EACxD,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC,CACpE;;;SA3FO,WAAW;AAgZxB,aAAa,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { serializeAsVector3, serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector3, Quaternion, TmpVectors } from \"core/Maths/math.vector\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { _ShaderImportLoader } from \"core/Misc/shaderImportLoader\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\n\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"core/Materials/clipPlaneMaterialHelper\";\r\nimport { BindFogParameters, BindLogDepth, PrepareDefinesForAttributes, PrepareDefinesForMisc } from \"core/Materials/materialHelper.functions\";\r\n\r\n/** @internal */\r\nclass SkyMaterialDefines extends MaterialDefines {\r\n public CLIPPLANE = false;\r\n public CLIPPLANE2 = false;\r\n public CLIPPLANE3 = false;\r\n public CLIPPLANE4 = false;\r\n public CLIPPLANE5 = false;\r\n public CLIPPLANE6 = false;\r\n public POINTSIZE = false;\r\n public FOG = false;\r\n public VERTEXCOLOR = false;\r\n public VERTEXALPHA = false;\r\n public IMAGEPROCESSINGPOSTPROCESS = false;\r\n public SKIPFINALCOLORCLAMP = false;\r\n public DITHER = false;\r\n public LOGARITHMICDEPTH = false;\r\n\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * This is the sky material which allows to create dynamic and texture free effects for skyboxes.\r\n * @see https://doc.babylonjs.com/toolsAndResources/assetLibraries/materialsLibrary/skyMat\r\n */\r\nexport class SkyMaterial extends PushMaterial {\r\n /**\r\n * Defines the overall luminance of sky in interval ]0, 1[.\r\n */\r\n @serialize()\r\n public luminance: number = 1.0;\r\n\r\n /**\r\n * Defines the amount (scattering) of haze as opposed to molecules in atmosphere.\r\n */\r\n @serialize()\r\n public turbidity: number = 10.0;\r\n\r\n /**\r\n * Defines the sky appearance (light intensity).\r\n */\r\n @serialize()\r\n public rayleigh: number = 2.0;\r\n\r\n /**\r\n * Defines the mieCoefficient in interval [0, 0.1] which affects the property .mieDirectionalG.\r\n */\r\n @serialize()\r\n public mieCoefficient: number = 0.005;\r\n\r\n /**\r\n * Defines the amount of haze particles following the Mie scattering theory.\r\n */\r\n @serialize()\r\n public mieDirectionalG: number = 0.8;\r\n\r\n /**\r\n * Defines the distance of the sun according to the active scene camera.\r\n */\r\n @serialize()\r\n public distance: number = 500;\r\n\r\n /**\r\n * Defines the sun inclination, in interval [-0.5, 0.5]. When the inclination is not 0, the sun is said\r\n * \"inclined\".\r\n */\r\n @serialize()\r\n public inclination: number = 0.49;\r\n\r\n /**\r\n * Defines the solar azimuth in interval [0, 1]. The azimuth is the angle in the horizontal plan between\r\n * an object direction and a reference direction.\r\n */\r\n @serialize()\r\n public azimuth: number = 0.25;\r\n\r\n /**\r\n * Defines the sun position in the sky on (x,y,z). If the property .useSunPosition is set to false, then\r\n * the property is overridden by the inclination and the azimuth and can be read at any moment.\r\n */\r\n @serializeAsVector3()\r\n public sunPosition: Vector3 = new Vector3(0, 100, 0);\r\n\r\n /**\r\n * Defines if the sun position should be computed (inclination and azimuth) according to the given\r\n * .sunPosition property.\r\n */\r\n @serialize()\r\n public useSunPosition: boolean = false;\r\n\r\n /**\r\n * Defines an offset vector used to get a horizon offset.\r\n * @example skyMaterial.cameraOffset.y = camera.globalPosition.y // Set horizon relative to 0 on the Y axis\r\n */\r\n @serializeAsVector3()\r\n public cameraOffset: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * Defines the vector the skyMaterial should consider as up. (default is Vector3(0, 1, 0) as returned by Vector3.Up())\r\n */\r\n @serializeAsVector3()\r\n public up: Vector3 = Vector3.Up();\r\n\r\n /**\r\n * Defines if sky should be dithered.\r\n */\r\n @serialize()\r\n public dithering: boolean = false;\r\n\r\n // Private members\r\n private _cameraPosition: Vector3 = Vector3.Zero();\r\n private _skyOrientation: Quaternion = new Quaternion();\r\n\r\n private static readonly _ShaderLoader = /*#__PURE__*/ new _ShaderImportLoader(\r\n () => [import(\"./sky.vertex\"), import(\"./sky.fragment\")],\r\n () => [import(\"./wgsl/sky.vertex\"), import(\"./wgsl/sky.fragment\")]\r\n );\r\n\r\n /**\r\n * Instantiates a new sky material.\r\n * This material allows to create dynamic and texture free\r\n * effects for skyboxes by taking care of the atmosphere state.\r\n * @see https://doc.babylonjs.com/toolsAndResources/assetLibraries/materialsLibrary/skyMat\r\n * @param name Define the name of the material in the scene\r\n * @param scene Define the scene the material belong to\r\n * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n */\r\n constructor(name: string, scene?: Scene, forceGLSL = false) {\r\n super(name, scene, undefined, forceGLSL);\r\n }\r\n\r\n /**\r\n * Specifies if the material will require alpha blending\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return this.alpha < 1.0;\r\n }\r\n\r\n /**\r\n * Specifies if this material should be rendered in alpha test mode\r\n * @returns false as the sky material doesn't need alpha testing.\r\n */\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Get the texture used for alpha test purpose.\r\n * @returns null as the sky material has no texture.\r\n */\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Get if the submesh is ready to be used and all its information available.\r\n * Child classes can use it to update shaders\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new SkyMaterialDefines();\r\n }\r\n\r\n const defines = <SkyMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n false,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._isVertexOutputInvariant\r\n );\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, true, false);\r\n\r\n if (defines.IMAGEPROCESSINGPOSTPROCESS !== scene.imageProcessingConfiguration.applyByPostProcess) {\r\n defines.markAsMiscDirty();\r\n }\r\n\r\n if (defines.DITHER !== this.dithering) {\r\n defines.markAsMiscDirty();\r\n }\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n defines.DITHER = this.dithering;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n const shaderName = \"sky\";\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"viewProjection\",\r\n \"view\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"logarithmicDepthConstant\",\r\n \"pointSize\",\r\n \"luminance\",\r\n \"turbidity\",\r\n \"rayleigh\",\r\n \"mieCoefficient\",\r\n \"mieDirectionalG\",\r\n \"sunPosition\",\r\n \"cameraPosition\",\r\n \"cameraOffset\",\r\n \"up\",\r\n ];\r\n AddClipPlaneUniforms(uniforms);\r\n const join = defines.toString();\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: [],\r\n samplers: [],\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: SkyMaterial._ShaderLoader.getLoadCallback(this._shaderLanguage),\r\n },\r\n scene.getEngine()\r\n ),\r\n defines,\r\n this._materialContext\r\n );\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <SkyMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n\r\n if (this._mustRebind(scene, effect, subMesh)) {\r\n BindClipPlane(effect, this, scene);\r\n\r\n // Point size\r\n if (this.pointsCloud) {\r\n this._activeEffect.setFloat(\"pointSize\", this.pointSize);\r\n }\r\n\r\n // Log. depth\r\n if (this._useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n }\r\n\r\n // View\r\n if (scene.fogEnabled && mesh.applyFog && scene.fogMode !== Scene.FOGMODE_NONE) {\r\n this._activeEffect.setMatrix(\"view\", scene.getViewMatrix());\r\n }\r\n\r\n // Fog\r\n BindFogParameters(scene, mesh, this._activeEffect);\r\n\r\n // Sky\r\n const camera = scene.activeCamera;\r\n if (camera) {\r\n const cameraWorldMatrix = camera.getWorldMatrix();\r\n this._cameraPosition.x = cameraWorldMatrix.m[12];\r\n this._cameraPosition.y = cameraWorldMatrix.m[13];\r\n this._cameraPosition.z = cameraWorldMatrix.m[14];\r\n this._activeEffect.setVector3(\"cameraPosition\", TmpVectors.Vector3[0].copyFrom(this._cameraPosition).subtractInPlace(scene.floatingOriginOffset));\r\n }\r\n\r\n this._activeEffect.setVector3(\"cameraOffset\", this.cameraOffset);\r\n\r\n this._activeEffect.setVector3(\"up\", this.up);\r\n\r\n if (this.luminance > 0) {\r\n this._activeEffect.setFloat(\"luminance\", this.luminance);\r\n }\r\n\r\n this._activeEffect.setFloat(\"turbidity\", this.turbidity);\r\n this._activeEffect.setFloat(\"rayleigh\", this.rayleigh);\r\n this._activeEffect.setFloat(\"mieCoefficient\", this.mieCoefficient);\r\n this._activeEffect.setFloat(\"mieDirectionalG\", this.mieDirectionalG);\r\n\r\n if (!this.useSunPosition) {\r\n const theta = Math.PI * (this.inclination - 0.5);\r\n const phi = 2 * Math.PI * (this.azimuth - 0.5);\r\n\r\n this.sunPosition.x = this.distance * Math.cos(phi) * Math.cos(theta);\r\n this.sunPosition.y = this.distance * Math.sin(-theta);\r\n this.sunPosition.z = this.distance * Math.sin(phi) * Math.cos(theta);\r\n\r\n Quaternion.FromUnitVectorsToRef(Vector3.UpReadOnly, this.up, this._skyOrientation);\r\n this.sunPosition.rotateByQuaternionToRef(this._skyOrientation, this.sunPosition);\r\n }\r\n\r\n this._activeEffect.setVector3(\"sunPosition\", this.sunPosition);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n */\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the material, and gives it a new name\r\n * @param name defines the new name for the duplicated material\r\n * @returns the cloned material\r\n */\r\n public override clone(name: string): SkyMaterial {\r\n return SerializationHelper.Clone<SkyMaterial>(() => new SkyMaterial(name, this.getScene()), this);\r\n }\r\n\r\n /**\r\n * Serializes this material in a JSON representation\r\n * @returns the serialized material object\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.SkyMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"SkyMaterial\"\r\n * Mainly use in serialization.\r\n * @returns the class name\r\n */\r\n public override getClassName(): string {\r\n return \"SkyMaterial\";\r\n }\r\n\r\n /**\r\n * Creates a sky material from parsed material data\r\n * @param source defines the JSON representation of the material\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new sky material\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): SkyMaterial {\r\n return SerializationHelper.Parse(() => new SkyMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.SkyMaterial\", SkyMaterial);\r\n"]}
1
+ {"version":3,"file":"skyMaterial.js","sourceRoot":"","sources":["../../../../dev/materials/src/sky/skyMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { serializeAsVector3, serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector3, Quaternion, TmpVectors } from \"core/Maths/math.vector\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { _ShaderImportLoader } from \"core/Misc/shaderImportLoader\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\n\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"core/Materials/clipPlaneMaterialHelper\";\r\nimport { BindFogParameters, BindLogDepth, PrepareDefinesForAttributes, PrepareDefinesForMisc } from \"core/Materials/materialHelper.functions\";\r\n\r\n/** @internal */\r\nclass SkyMaterialDefines extends MaterialDefines {\r\n public CLIPPLANE = false;\r\n public CLIPPLANE2 = false;\r\n public CLIPPLANE3 = false;\r\n public CLIPPLANE4 = false;\r\n public CLIPPLANE5 = false;\r\n public CLIPPLANE6 = false;\r\n public POINTSIZE = false;\r\n public FOG = false;\r\n public VERTEXCOLOR = false;\r\n public VERTEXALPHA = false;\r\n public IMAGEPROCESSINGPOSTPROCESS = false;\r\n public SKIPFINALCOLORCLAMP = false;\r\n public DITHER = false;\r\n public LOGARITHMICDEPTH = false;\r\n public SKY_RAW_HDR_OUTPUT = false;\r\n\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * Max value the sky shader may write before the bound render target stores it as +Inf (which would\r\n * corrupt anything reading the texture back, e.g. an IBL CDF). Derived from the RT's texture type:\r\n * half-float caps at its 65504 ceiling; float is effectively unbounded (a huge finite +Inf guard);\r\n * anything else (8-bit LDR, or the default framebuffer when no RT is bound) is [0,1]. Only used when\r\n * `rawHdrOutput` is enabled.\r\n * @param textureType the bound render target's texture type (Constants.TEXTURETYPE_*), or undefined\r\n * @returns the maximum color value that can be stored without overflowing to +Inf\r\n * @internal\r\n */\r\nexport function _MaxColorValueForRenderTarget(textureType: number | undefined): number {\r\n switch (textureType) {\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n // IEEE-754 half-float max (core's `MaxHalfFloat`). Inlined, not imported: it's not on\r\n // the public `BABYLON` namespace, so the materials UMD build resolves the import to\r\n // `undefined` at runtime (→ NaN clamp ceiling).\r\n return 65504;\r\n case Constants.TEXTURETYPE_FLOAT:\r\n return 3.0e38;\r\n default:\r\n return 1.0;\r\n }\r\n}\r\n\r\n/**\r\n * This is the sky material which allows to create dynamic and texture free effects for skyboxes.\r\n * @see https://doc.babylonjs.com/toolsAndResources/assetLibraries/materialsLibrary/skyMat\r\n */\r\nexport class SkyMaterial extends PushMaterial {\r\n /**\r\n * Defines the overall luminance of sky in interval ]0, 1[.\r\n */\r\n @serialize()\r\n public luminance: number = 1.0;\r\n\r\n /**\r\n * Defines the amount (scattering) of haze as opposed to molecules in atmosphere.\r\n */\r\n @serialize()\r\n public turbidity: number = 10.0;\r\n\r\n /**\r\n * Defines the sky appearance (light intensity).\r\n */\r\n @serialize()\r\n public rayleigh: number = 2.0;\r\n\r\n /**\r\n * Defines the mieCoefficient in interval [0, 0.1] which affects the property .mieDirectionalG.\r\n */\r\n @serialize()\r\n public mieCoefficient: number = 0.005;\r\n\r\n /**\r\n * Defines the amount of haze particles following the Mie scattering theory.\r\n */\r\n @serialize()\r\n public mieDirectionalG: number = 0.8;\r\n\r\n /**\r\n * Defines the distance of the sun according to the active scene camera.\r\n */\r\n @serialize()\r\n public distance: number = 500;\r\n\r\n /**\r\n * Defines the sun inclination, in interval [-0.5, 0.5]. When the inclination is not 0, the sun is said\r\n * \"inclined\".\r\n */\r\n @serialize()\r\n public inclination: number = 0.49;\r\n\r\n /**\r\n * Defines the solar azimuth in interval [0, 1]. The azimuth is the angle in the horizontal plan between\r\n * an object direction and a reference direction.\r\n */\r\n @serialize()\r\n public azimuth: number = 0.25;\r\n\r\n /**\r\n * Defines the sun position in the sky on (x,y,z). If the property .useSunPosition is set to false, then\r\n * the property is overridden by the inclination and the azimuth and can be read at any moment.\r\n */\r\n @serializeAsVector3()\r\n public sunPosition: Vector3 = new Vector3(0, 100, 0);\r\n\r\n /**\r\n * Defines if the sun position should be computed (inclination and azimuth) according to the given\r\n * .sunPosition property.\r\n */\r\n @serialize()\r\n public useSunPosition: boolean = false;\r\n\r\n /**\r\n * Defines an offset vector used to get a horizon offset.\r\n * @example skyMaterial.cameraOffset.y = camera.globalPosition.y // Set horizon relative to 0 on the Y axis\r\n */\r\n @serializeAsVector3()\r\n public cameraOffset: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * Defines the vector the skyMaterial should consider as up. (default is Vector3(0, 1, 0) as returned by Vector3.Up())\r\n */\r\n @serializeAsVector3()\r\n public up: Vector3 = Vector3.Up();\r\n\r\n /**\r\n * Defines if sky should be dithered.\r\n */\r\n @serialize()\r\n public dithering: boolean = false;\r\n\r\n /**\r\n * When enabled, the material emits scene-referred linear HDR: `luminance` acts as a plain linear\r\n * gain (no filmic tonemap), the output is clamped to the bound render target's max representable\r\n * value rather than [0, 1] (so a bright sun cannot overflow to +Inf), and no sRGB encode is\r\n * applied. Enable this to bake the sky into an HDR (float / half-float) render target — e.g. an\r\n * IBL environment cube — where the full dynamic range of the sun disc must be preserved. The\r\n * clamp ceiling follows whatever target is bound at draw time (65504 for half-float, effectively\r\n * unbounded for float); if the sky is drawn to an LDR target or the default framebuffer it falls\r\n * back to [0, 1], so this flag is only meaningful when rendering into a float/half-float target.\r\n * When disabled, the material produces tonemapped, display-referred output for direct viewing.\r\n */\r\n @serialize()\r\n public rawHdrOutput: boolean = false;\r\n\r\n /**\r\n * Cloud cover over the sun in [0, 1] (0 = clear direct sun, default; 1 = sun fully hidden). This\r\n * softens only the *sun disc* — the sky dome color itself is unchanged (there is no overcast\r\n * graying or whitening of the sky). At 0 the sun is a sharp solar disc; above 0 a physically-\r\n * based single-scattering cloud model attenuates the direct beam (Beer–Lambert) and redistributes\r\n * the removed energy into a dual-lobe Henyey–Greenstein aureole, energy-conserving as it broadens\r\n * (thin cloud → tight silver lining; heavy cloud → broad, directionless glow). See the sun-disc\r\n * branch in sky.fragment for the model + references.\r\n */\r\n @serialize()\r\n public cloudiness: number = 0;\r\n\r\n // Private members\r\n private _cameraPosition: Vector3 = Vector3.Zero();\r\n private _skyOrientation: Quaternion = new Quaternion();\r\n\r\n private static readonly _ShaderLoader = /*#__PURE__*/ new _ShaderImportLoader(\r\n () => [import(\"./sky.vertex\"), import(\"./sky.fragment\")],\r\n () => [import(\"./wgsl/sky.vertex\"), import(\"./wgsl/sky.fragment\")]\r\n );\r\n\r\n /**\r\n * Instantiates a new sky material.\r\n * This material allows to create dynamic and texture free\r\n * effects for skyboxes by taking care of the atmosphere state.\r\n * @see https://doc.babylonjs.com/toolsAndResources/assetLibraries/materialsLibrary/skyMat\r\n * @param name Define the name of the material in the scene\r\n * @param scene Define the scene the material belong to\r\n * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n */\r\n constructor(name: string, scene?: Scene, forceGLSL = false) {\r\n super(name, scene, undefined, forceGLSL);\r\n }\r\n\r\n /**\r\n * Specifies if the material will require alpha blending\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return this.alpha < 1.0;\r\n }\r\n\r\n /**\r\n * Specifies if this material should be rendered in alpha test mode\r\n * @returns false as the sky material doesn't need alpha testing.\r\n */\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Get the texture used for alpha test purpose.\r\n * @returns null as the sky material has no texture.\r\n */\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Get if the submesh is ready to be used and all its information available.\r\n * Child classes can use it to update shaders\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new SkyMaterialDefines();\r\n }\r\n\r\n const defines = <SkyMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n false,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._isVertexOutputInvariant\r\n );\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, true, false);\r\n\r\n if (defines.IMAGEPROCESSINGPOSTPROCESS !== scene.imageProcessingConfiguration.applyByPostProcess) {\r\n defines.markAsMiscDirty();\r\n }\r\n\r\n if (defines.DITHER !== this.dithering) {\r\n defines.markAsMiscDirty();\r\n }\r\n\r\n if (defines.SKY_RAW_HDR_OUTPUT !== this.rawHdrOutput) {\r\n defines.markAsMiscDirty();\r\n }\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n defines.DITHER = this.dithering;\r\n defines.SKY_RAW_HDR_OUTPUT = this.rawHdrOutput;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n const shaderName = \"sky\";\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"viewProjection\",\r\n \"view\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"logarithmicDepthConstant\",\r\n \"pointSize\",\r\n \"luminance\",\r\n \"turbidity\",\r\n \"rayleigh\",\r\n \"mieCoefficient\",\r\n \"mieDirectionalG\",\r\n \"sunPosition\",\r\n \"cameraPosition\",\r\n \"cameraOffset\",\r\n \"up\",\r\n \"cloudiness\",\r\n \"maxColorValue\",\r\n ];\r\n AddClipPlaneUniforms(uniforms);\r\n const join = defines.toString();\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: [],\r\n samplers: [],\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: SkyMaterial._ShaderLoader.getLoadCallback(this._shaderLanguage),\r\n },\r\n scene.getEngine()\r\n ),\r\n defines,\r\n this._materialContext\r\n );\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <SkyMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n\r\n if (this._mustRebind(scene, effect, subMesh)) {\r\n BindClipPlane(effect, this, scene);\r\n\r\n // Point size\r\n if (this.pointsCloud) {\r\n this._activeEffect.setFloat(\"pointSize\", this.pointSize);\r\n }\r\n\r\n // Log. depth\r\n if (this._useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n }\r\n\r\n // View\r\n if (scene.fogEnabled && mesh.applyFog && scene.fogMode !== Scene.FOGMODE_NONE) {\r\n this._activeEffect.setMatrix(\"view\", scene.getViewMatrix());\r\n }\r\n\r\n // Fog. In raw-HDR mode the shader output is linear scene-referred color, so the gamma-space\r\n // scene.fogColor must be converted to linear before it is mixed in (linearSpace = true).\r\n BindFogParameters(scene, mesh, this._activeEffect, this.rawHdrOutput);\r\n\r\n // Sky\r\n const camera = scene.activeCamera;\r\n if (camera) {\r\n const cameraWorldMatrix = camera.getWorldMatrix();\r\n this._cameraPosition.x = cameraWorldMatrix.m[12];\r\n this._cameraPosition.y = cameraWorldMatrix.m[13];\r\n this._cameraPosition.z = cameraWorldMatrix.m[14];\r\n this._activeEffect.setVector3(\"cameraPosition\", TmpVectors.Vector3[0].copyFrom(this._cameraPosition).subtractInPlace(scene.floatingOriginOffset));\r\n }\r\n\r\n this._activeEffect.setVector3(\"cameraOffset\", this.cameraOffset);\r\n\r\n this._activeEffect.setVector3(\"up\", this.up);\r\n\r\n // In raw-HDR mode `luminance` is a linear gain, so 0 is valid and must be uploaded (it\r\n // produces black). The tonemapped path uses `luminance` as a divisor (0.1 / luminance,\r\n // log2(2 / luminance^4)), where 0 is invalid — keep the guard that skips uploading it there.\r\n if (this.rawHdrOutput || this.luminance > 0) {\r\n this._activeEffect.setFloat(\"luminance\", this.luminance);\r\n }\r\n\r\n this._activeEffect.setFloat(\"turbidity\", this.turbidity);\r\n this._activeEffect.setFloat(\"rayleigh\", this.rayleigh);\r\n this._activeEffect.setFloat(\"mieCoefficient\", this.mieCoefficient);\r\n this._activeEffect.setFloat(\"mieDirectionalG\", this.mieDirectionalG);\r\n this._activeEffect.setFloat(\"cloudiness\", this.cloudiness);\r\n\r\n if (this.rawHdrOutput) {\r\n // Match the clamp ceiling to the render target the sky is drawn into (read at bind time,\r\n // since the same material may bake into a half-float cube yet also draw to an LDR view).\r\n const currentRenderTarget = scene.getEngine()._currentRenderTarget;\r\n this._activeEffect.setFloat(\"maxColorValue\", _MaxColorValueForRenderTarget(currentRenderTarget?.texture?.type));\r\n }\r\n\r\n if (!this.useSunPosition) {\r\n const theta = Math.PI * (this.inclination - 0.5);\r\n const phi = 2 * Math.PI * (this.azimuth - 0.5);\r\n\r\n this.sunPosition.x = this.distance * Math.cos(phi) * Math.cos(theta);\r\n this.sunPosition.y = this.distance * Math.sin(-theta);\r\n this.sunPosition.z = this.distance * Math.sin(phi) * Math.cos(theta);\r\n\r\n Quaternion.FromUnitVectorsToRef(Vector3.UpReadOnly, this.up, this._skyOrientation);\r\n this.sunPosition.rotateByQuaternionToRef(this._skyOrientation, this.sunPosition);\r\n }\r\n\r\n this._activeEffect.setVector3(\"sunPosition\", this.sunPosition);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n */\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the material, and gives it a new name\r\n * @param name defines the new name for the duplicated material\r\n * @returns the cloned material\r\n */\r\n public override clone(name: string): SkyMaterial {\r\n return SerializationHelper.Clone<SkyMaterial>(() => new SkyMaterial(name, this.getScene()), this);\r\n }\r\n\r\n /**\r\n * Serializes this material in a JSON representation\r\n * @returns the serialized material object\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.SkyMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"SkyMaterial\"\r\n * Mainly use in serialization.\r\n * @returns the class name\r\n */\r\n public override getClassName(): string {\r\n return \"SkyMaterial\";\r\n }\r\n\r\n /**\r\n * Creates a sky material from parsed material data\r\n * @param source defines the JSON representation of the material\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new sky material\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): SkyMaterial {\r\n return SerializationHelper.Parse(() => new SkyMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.SkyMaterial\", SkyMaterial);\r\n"]}
@@ -14,10 +14,13 @@ const shader = `varying vPositionW: vec3f;
14
14
  varying vColor: vec4f;
15
15
  #endif
16
16
  #include<clipPlaneFragmentDeclaration>
17
- uniform cameraPosition: vec3f;uniform cameraOffset: vec3f;uniform up: vec3f;uniform luminance: f32;uniform turbidity: f32;uniform rayleigh: f32;uniform mieCoefficient: f32;uniform mieDirectionalG: f32;uniform sunPosition: vec3f;
17
+ uniform cameraPosition: vec3f;uniform cameraOffset: vec3f;uniform up: vec3f;uniform luminance: f32;uniform turbidity: f32;uniform rayleigh: f32;uniform mieCoefficient: f32;uniform mieDirectionalG: f32;uniform sunPosition: vec3f;uniform cloudiness: f32;
18
+ #ifdef SKY_RAW_HDR_OUTPUT
19
+ uniform maxColorValue: f32;
20
+ #endif
18
21
  #include<logDepthDeclaration>
19
22
  #include<fogFragmentDeclaration>
20
- const ce: f32=2.71828182845904523536028747135266249775724709369995957;const pi: f32=3.141592653589793238462643383279502884197169;const cn: f32=1.0003;const cN: f32=2.545E25;const pn: f32=0.035;const lambda: vec3f= vec3f(680E-9,550E-9,450E-9);const cK: vec3f= vec3f(0.686,0.678,0.666);const cv: f32=4.0;const rayleighZenithLength: f32=8.4E3;const mieZenithLength: f32=1.25E3;const EE: f32=1000.0;const sunAngularDiameterCos: f32=0.999956676946448443553574619906976478926848692873900859324;const cutoffAngle: f32=pi/1.95;const steepness: f32=1.5;fn totalRayleigh(lambdaIn: vec3f)->vec3f
23
+ const ce: f32=2.71828182845904523536028747135266249775724709369995957;const pi: f32=3.141592653589793238462643383279502884197169;const cn: f32=1.0003;const cN: f32=2.545E25;const pn: f32=0.035;const lambda: vec3f= vec3f(680E-9,550E-9,450E-9);const cK: vec3f= vec3f(0.686,0.678,0.666);const cv: f32=4.0;const rayleighZenithLength: f32=8.4E3;const mieZenithLength: f32=1.25E3;const EE: f32=1000.0;const sunAngularDiameterCos: f32=0.999956676946448443553574619906976478926848692873900859324;const cutoffAngle: f32=pi/1.95;const steepness: f32=1.5;const CLOUD_TAU_MAX: f32=15.0;const CLOUD_G: f32=0.5;const CLOUD_G_BACK: f32=-0.5;const CLOUD_BACK_WEIGHT: f32=0.2;fn totalRayleigh(lambdaIn: vec3f)->vec3f
21
24
  {return (8.0*pow(pi,3.0)*pow(pow(cn,2.0)-1.0,2.0)*(6.0+3.0*pn))/(3.0*cN*pow(lambdaIn, vec3f(4.0))*(6.0-7.0*pn));}
22
25
  fn simplifiedRayleigh()->vec3f
23
26
  {return vec3f(0.0005)/ vec3f(94,40,18);}
@@ -27,6 +30,8 @@ fn totalMie(lambdaIn: vec3f,KIn: vec3f,T: f32)->vec3f
27
30
  {var c: f32=(0.2*T)*10E-18;return 0.434*c*pi*pow((2.0*pi)/lambdaIn, vec3f(cv-2.0))*KIn;}
28
31
  fn hgPhase(cosTheta: f32,g: f32)->f32
29
32
  {return (1.0/(4.0*pi))*((1.0-pow(g,2.0))/pow(1.0-2.0*g*cosTheta+pow(g,2.0),1.5));}
33
+ fn cloudPhase(cosTheta: f32,gForward: f32)->f32
34
+ {return mix(hgPhase(cosTheta,gForward),hgPhase(cosTheta,CLOUD_G_BACK),CLOUD_BACK_WEIGHT);}
30
35
  fn sunIntensity(zenithAngleCos: f32)->f32
31
36
  {return EE*max(0.0,1.0-exp((-(cutoffAngle-acos(zenithAngleCos))/steepness)));}
32
37
  const A: f32=0.15;const B: f32=0.50;const C: f32=0.10;const D: f32=0.20;const EEE: f32=0.02;const F: f32=0.30;const W: f32=1000.0;fn Uncharted2Tonemap(x: vec3f)->vec3f
@@ -42,7 +47,14 @@ fn main(input: FragmentInputs)->FragmentOutputs {
42
47
  /**
43
48
  * Sky Color
44
49
  */
45
- var sunfade: f32=1.0-clamp(1.0-exp((uniforms.sunPosition.y/450000.0)),0.0,1.0);var rayleighCoefficient: f32=uniforms.rayleigh-(1.0*(1.0-sunfade));var sunDirection: vec3f=normalize(uniforms.sunPosition);var sunE: f32=sunIntensity(dot(sunDirection,uniforms.up));var betaR: vec3f=simplifiedRayleigh()*rayleighCoefficient;var betaM: vec3f=totalMie(lambda,cK,uniforms.turbidity)*uniforms.mieCoefficient;var zenithAngle: f32=acos(max(0.0,dot(uniforms.up,normalize(fragmentInputs.vPositionW-uniforms.cameraPosition+uniforms.cameraOffset))));var sR: f32=rayleighZenithLength/(cos(zenithAngle)+0.15*pow(93.885-((zenithAngle*180.0)/pi),-1.253));var sM: f32=mieZenithLength/(cos(zenithAngle)+0.15*pow(93.885-((zenithAngle*180.0)/pi),-1.253));var Fex: vec3f=exp(-(betaR*sR+betaM*sM));var cosTheta: f32=dot(normalize(fragmentInputs.vPositionW-uniforms.cameraPosition),sunDirection);var rPhase: f32=rayleighPhase(cosTheta*0.5+0.5);var betaRTheta: vec3f=betaR*rPhase;var mPhase: f32=hgPhase(cosTheta,uniforms.mieDirectionalG);var betaMTheta: vec3f=betaM*mPhase;var Lin: vec3f=pow(sunE*((betaRTheta+betaMTheta)/(betaR+betaM))*(1.0-Fex), vec3f(1.5));Lin=Lin*mix( vec3f(1.0),pow(sunE*((betaRTheta+betaMTheta)/(betaR+betaM))*Fex, vec3f(1.0/2.0)), vec3f(clamp(pow(1.0-dot(uniforms.up,sunDirection),5.0),0.0,1.0)));var direction: vec3f=normalize(fragmentInputs.vPositionW-uniforms.cameraPosition);var theta: f32=acos(direction.y);var phi: f32=atan2(direction.z,direction.x);var uv: vec2f= vec2f(phi,theta)/ vec2f(2.0*pi,pi)+ vec2f(0.5,0.0);var L0: vec3f= vec3f(0.1)*Fex;var sundisk: f32=smoothstep(sunAngularDiameterCos,sunAngularDiameterCos+0.00002,cosTheta);L0=L0+(sunE*19000.0*Fex)*sundisk;var whiteScale: vec3f=1.0/Uncharted2Tonemap( vec3f(W));var texColor: vec3f=(Lin+L0);texColor=texColor*0.04;texColor=texColor+ vec3f(0.0,0.001,0.0025)*0.3;var g_fMaxLuminance: f32=1.0;var fLumScaled: f32=0.1/uniforms.luminance;var fLumCompressed: f32=(fLumScaled*(1.0+(fLumScaled/(g_fMaxLuminance*g_fMaxLuminance))))/(1.0+fLumScaled);var ExposureBias: f32=fLumCompressed;var curr: vec3f=Uncharted2Tonemap((log2(2.0/pow(uniforms.luminance,4.0)))*texColor);var retColor: vec3f=curr*whiteScale;var alpha: f32=1.0;
50
+ var sunfade: f32=1.0-clamp(1.0-exp((uniforms.sunPosition.y/450000.0)),0.0,1.0);var rayleighCoefficient: f32=uniforms.rayleigh-(1.0*(1.0-sunfade));var sunDirection: vec3f=normalize(uniforms.sunPosition);var sunE: f32=sunIntensity(dot(sunDirection,uniforms.up));var betaR: vec3f=simplifiedRayleigh()*rayleighCoefficient;var betaM: vec3f=totalMie(lambda,cK,uniforms.turbidity)*uniforms.mieCoefficient;var zenithAngle: f32=acos(max(0.0,dot(uniforms.up,normalize(fragmentInputs.vPositionW-uniforms.cameraPosition+uniforms.cameraOffset))));var sR: f32=rayleighZenithLength/(cos(zenithAngle)+0.15*pow(93.885-((zenithAngle*180.0)/pi),-1.253));var sM: f32=mieZenithLength/(cos(zenithAngle)+0.15*pow(93.885-((zenithAngle*180.0)/pi),-1.253));var Fex: vec3f=exp(-(betaR*sR+betaM*sM));var cosTheta: f32=dot(normalize(fragmentInputs.vPositionW-uniforms.cameraPosition),sunDirection);var rPhase: f32=rayleighPhase(cosTheta*0.5+0.5);var betaRTheta: vec3f=betaR*rPhase;var mPhase: f32=hgPhase(cosTheta,uniforms.mieDirectionalG);var betaMTheta: vec3f=betaM*mPhase;var Lin: vec3f=pow(sunE*((betaRTheta+betaMTheta)/(betaR+betaM))*(1.0-Fex), vec3f(1.5));Lin=Lin*mix( vec3f(1.0),pow(sunE*((betaRTheta+betaMTheta)/(betaR+betaM))*Fex, vec3f(1.0/2.0)), vec3f(clamp(pow(1.0-dot(uniforms.up,sunDirection),5.0),0.0,1.0)));var direction: vec3f=normalize(fragmentInputs.vPositionW-uniforms.cameraPosition);var theta: f32=acos(direction.y);var phi: f32=atan2(direction.z,direction.x);var uv: vec2f= vec2f(phi,theta)/ vec2f(2.0*pi,pi)+ vec2f(0.5,0.0);var L0: vec3f= vec3f(0.1)*Fex;var sundiskTerm: f32=0.0;if (uniforms.cloudiness>0.0) {var cloudTau: f32=uniforms.cloudiness*CLOUD_TAU_MAX;var cloudT: f32=exp(-cloudTau);var cloudG: f32=CLOUD_G*cloudT;var omegaSun: f32=2.0*pi*(1.0-sunAngularDiameterCos);var sharpDisk: f32=smoothstep(sunAngularDiameterCos,sunAngularDiameterCos+0.00002,cosTheta);sundiskTerm=cloudT*sharpDisk+(1.0-cloudT)*omegaSun*cloudPhase(cosTheta,cloudG);} else {sundiskTerm=smoothstep(sunAngularDiameterCos,sunAngularDiameterCos+0.00002,cosTheta);}
51
+ L0=L0+(sunE*19000.0*Fex)*sundiskTerm;var texColor: vec3f=(Lin+L0);texColor=texColor*0.04;texColor=texColor+ vec3f(0.0,0.001,0.0025)*0.3;
52
+ #ifdef SKY_RAW_HDR_OUTPUT
53
+ var retColor: vec3f=texColor*uniforms.luminance;
54
+ #else
55
+ var whiteScale: vec3f=1.0/Uncharted2Tonemap( vec3f(W));var g_fMaxLuminance: f32=1.0;var fLumScaled: f32=0.1/uniforms.luminance;var fLumCompressed: f32=(fLumScaled*(1.0+(fLumScaled/(g_fMaxLuminance*g_fMaxLuminance))))/(1.0+fLumScaled);var ExposureBias: f32=fLumCompressed;var curr: vec3f=Uncharted2Tonemap((log2(2.0/pow(uniforms.luminance,4.0)))*texColor);var retColor: vec3f=curr*whiteScale;
56
+ #endif
57
+ var alpha: f32=1.0;
46
58
  #ifdef VERTEXCOLOR
47
59
  retColor=retColor.rgb*fragmentInputs.vColor.rgb;
48
60
  #endif
@@ -52,11 +64,17 @@ alpha*=fragmentInputs.vColor.a;
52
64
  #if DITHER
53
65
  retColor=retColor.rgb+dither(fragmentInputs.position.xy,0.5);
54
66
  #endif
67
+ #ifdef SKY_RAW_HDR_OUTPUT
68
+ var color: vec4f= vec4f(clamp(retColor.rgb, vec3f(0.0), vec3f(uniforms.maxColorValue)),alpha);
69
+ #else
55
70
  var color: vec4f=clamp( vec4f(retColor.rgb,alpha), vec4f(0.0), vec4f(1.0));
71
+ #endif
56
72
  #include<logDepthFragment>
57
73
  #include<fogFragment>
58
74
  fragmentOutputs.color=color;
75
+ #ifndef SKY_RAW_HDR_OUTPUT
59
76
  #include<imageProcessingCompatibility>
77
+ #endif
60
78
  #define CUSTOM_FRAGMENT_MAIN_END
61
79
  }
62
80
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"sky.fragment.js","sourceRoot":"","sources":["../../../../../dev/materials/src/sky/wgsl/sky.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gCAAgC,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAC9F,OAAO,EAAE,0BAA0B,EAAE,MAAM,wDAAwD,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,8DAA8D,CAAC;AAEhH,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAC9B,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,gCAAgC,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,eAAe,EAAE,gCAAgC,CAAC,CAAC;AAC9N,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAChE,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport { clipPlaneFragmentDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration\";\nimport { logDepthDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthDeclaration\";\nimport { fogFragmentDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/fogFragmentDeclaration\";\nimport { helperFunctionsWGSL } from \"core/ShadersWGSL/ShadersInclude/helperFunctions\";\nimport { clipPlaneFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneFragment\";\nimport { logDepthFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthFragment\";\nimport { fogFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/fogFragment\";\nimport { imageProcessingCompatibilityWGSL } from \"core/ShadersWGSL/ShadersInclude/imageProcessingCompatibility\";\n\nconst name = \"skyPixelShader\";\nconst shader = `varying vPositionW: vec3f;\n#ifdef VERTEXCOLOR\nvarying vColor: vec4f;\n#endif\n#include<clipPlaneFragmentDeclaration>\nuniform cameraPosition: vec3f;uniform cameraOffset: vec3f;uniform up: vec3f;uniform luminance: f32;uniform turbidity: f32;uniform rayleigh: f32;uniform mieCoefficient: f32;uniform mieDirectionalG: f32;uniform sunPosition: vec3f;\n#include<logDepthDeclaration>\n#include<fogFragmentDeclaration>\nconst ce: f32=2.71828182845904523536028747135266249775724709369995957;const pi: f32=3.141592653589793238462643383279502884197169;const cn: f32=1.0003;const cN: f32=2.545E25;const pn: f32=0.035;const lambda: vec3f= vec3f(680E-9,550E-9,450E-9);const cK: vec3f= vec3f(0.686,0.678,0.666);const cv: f32=4.0;const rayleighZenithLength: f32=8.4E3;const mieZenithLength: f32=1.25E3;const EE: f32=1000.0;const sunAngularDiameterCos: f32=0.999956676946448443553574619906976478926848692873900859324;const cutoffAngle: f32=pi/1.95;const steepness: f32=1.5;fn totalRayleigh(lambdaIn: vec3f)->vec3f\n{return (8.0*pow(pi,3.0)*pow(pow(cn,2.0)-1.0,2.0)*(6.0+3.0*pn))/(3.0*cN*pow(lambdaIn, vec3f(4.0))*(6.0-7.0*pn));}\nfn simplifiedRayleigh()->vec3f\n{return vec3f(0.0005)/ vec3f(94,40,18);}\nfn rayleighPhase(cosTheta: f32)->f32\n{return (3.0/(16.0*pi))*(1.0+pow(cosTheta,2.0));}\nfn totalMie(lambdaIn: vec3f,KIn: vec3f,T: f32)->vec3f\n{var c: f32=(0.2*T)*10E-18;return 0.434*c*pi*pow((2.0*pi)/lambdaIn, vec3f(cv-2.0))*KIn;}\nfn hgPhase(cosTheta: f32,g: f32)->f32\n{return (1.0/(4.0*pi))*((1.0-pow(g,2.0))/pow(1.0-2.0*g*cosTheta+pow(g,2.0),1.5));}\nfn sunIntensity(zenithAngleCos: f32)->f32\n{return EE*max(0.0,1.0-exp((-(cutoffAngle-acos(zenithAngleCos))/steepness)));}\nconst A: f32=0.15;const B: f32=0.50;const C: f32=0.10;const D: f32=0.20;const EEE: f32=0.02;const F: f32=0.30;const W: f32=1000.0;fn Uncharted2Tonemap(x: vec3f)->vec3f\n{return ((x*(A*x+C*B)+D*EEE)/(x*(A*x+B)+D*F))-EEE/F;}\n#if DITHER\n#include<helperFunctions>\n#endif\n#define CUSTOM_FRAGMENT_DEFINITIONS\n@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include<clipPlaneFragment>\n/**\n* Sky Color\n*/\nvar sunfade: f32=1.0-clamp(1.0-exp((uniforms.sunPosition.y/450000.0)),0.0,1.0);var rayleighCoefficient: f32=uniforms.rayleigh-(1.0*(1.0-sunfade));var sunDirection: vec3f=normalize(uniforms.sunPosition);var sunE: f32=sunIntensity(dot(sunDirection,uniforms.up));var betaR: vec3f=simplifiedRayleigh()*rayleighCoefficient;var betaM: vec3f=totalMie(lambda,cK,uniforms.turbidity)*uniforms.mieCoefficient;var zenithAngle: f32=acos(max(0.0,dot(uniforms.up,normalize(fragmentInputs.vPositionW-uniforms.cameraPosition+uniforms.cameraOffset))));var sR: f32=rayleighZenithLength/(cos(zenithAngle)+0.15*pow(93.885-((zenithAngle*180.0)/pi),-1.253));var sM: f32=mieZenithLength/(cos(zenithAngle)+0.15*pow(93.885-((zenithAngle*180.0)/pi),-1.253));var Fex: vec3f=exp(-(betaR*sR+betaM*sM));var cosTheta: f32=dot(normalize(fragmentInputs.vPositionW-uniforms.cameraPosition),sunDirection);var rPhase: f32=rayleighPhase(cosTheta*0.5+0.5);var betaRTheta: vec3f=betaR*rPhase;var mPhase: f32=hgPhase(cosTheta,uniforms.mieDirectionalG);var betaMTheta: vec3f=betaM*mPhase;var Lin: vec3f=pow(sunE*((betaRTheta+betaMTheta)/(betaR+betaM))*(1.0-Fex), vec3f(1.5));Lin=Lin*mix( vec3f(1.0),pow(sunE*((betaRTheta+betaMTheta)/(betaR+betaM))*Fex, vec3f(1.0/2.0)), vec3f(clamp(pow(1.0-dot(uniforms.up,sunDirection),5.0),0.0,1.0)));var direction: vec3f=normalize(fragmentInputs.vPositionW-uniforms.cameraPosition);var theta: f32=acos(direction.y);var phi: f32=atan2(direction.z,direction.x);var uv: vec2f= vec2f(phi,theta)/ vec2f(2.0*pi,pi)+ vec2f(0.5,0.0);var L0: vec3f= vec3f(0.1)*Fex;var sundisk: f32=smoothstep(sunAngularDiameterCos,sunAngularDiameterCos+0.00002,cosTheta);L0=L0+(sunE*19000.0*Fex)*sundisk;var whiteScale: vec3f=1.0/Uncharted2Tonemap( vec3f(W));var texColor: vec3f=(Lin+L0);texColor=texColor*0.04;texColor=texColor+ vec3f(0.0,0.001,0.0025)*0.3;var g_fMaxLuminance: f32=1.0;var fLumScaled: f32=0.1/uniforms.luminance;var fLumCompressed: f32=(fLumScaled*(1.0+(fLumScaled/(g_fMaxLuminance*g_fMaxLuminance))))/(1.0+fLumScaled);var ExposureBias: f32=fLumCompressed;var curr: vec3f=Uncharted2Tonemap((log2(2.0/pow(uniforms.luminance,4.0)))*texColor);var retColor: vec3f=curr*whiteScale;var alpha: f32=1.0;\n#ifdef VERTEXCOLOR\nretColor=retColor.rgb*fragmentInputs.vColor.rgb;\n#endif\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=fragmentInputs.vColor.a;\n#endif\n#if DITHER\nretColor=retColor.rgb+dither(fragmentInputs.position.xy,0.5);\n#endif\nvar color: vec4f=clamp( vec4f(retColor.rgb,alpha), vec4f(0.0), vec4f(1.0));\n#include<logDepthFragment>\n#include<fogFragment>\nfragmentOutputs.color=color;\n#include<imageProcessingCompatibility>\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\nconst includes = [clipPlaneFragmentDeclarationWGSL, logDepthDeclarationWGSL, fogFragmentDeclarationWGSL, helperFunctionsWGSL, clipPlaneFragmentWGSL, logDepthFragmentWGSL, fogFragmentWGSL, imageProcessingCompatibilityWGSL];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStoreWGSL[inc.name]) {\n ShaderStore.IncludesShadersStoreWGSL[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const skyPixelShaderWGSL = { name, shader };\n"]}
1
+ {"version":3,"file":"sky.fragment.js","sourceRoot":"","sources":["../../../../../dev/materials/src/sky/wgsl/sky.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gCAAgC,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAC9F,OAAO,EAAE,0BAA0B,EAAE,MAAM,wDAAwD,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,8DAA8D,CAAC;AAEhH,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAC9B,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoEd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,gCAAgC,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,eAAe,EAAE,gCAAgC,CAAC,CAAC;AAC9N,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAChE,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport { clipPlaneFragmentDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration\";\nimport { logDepthDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthDeclaration\";\nimport { fogFragmentDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/fogFragmentDeclaration\";\nimport { helperFunctionsWGSL } from \"core/ShadersWGSL/ShadersInclude/helperFunctions\";\nimport { clipPlaneFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneFragment\";\nimport { logDepthFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthFragment\";\nimport { fogFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/fogFragment\";\nimport { imageProcessingCompatibilityWGSL } from \"core/ShadersWGSL/ShadersInclude/imageProcessingCompatibility\";\n\nconst name = \"skyPixelShader\";\nconst shader = `varying vPositionW: vec3f;\n#ifdef VERTEXCOLOR\nvarying vColor: vec4f;\n#endif\n#include<clipPlaneFragmentDeclaration>\nuniform cameraPosition: vec3f;uniform cameraOffset: vec3f;uniform up: vec3f;uniform luminance: f32;uniform turbidity: f32;uniform rayleigh: f32;uniform mieCoefficient: f32;uniform mieDirectionalG: f32;uniform sunPosition: vec3f;uniform cloudiness: f32;\n#ifdef SKY_RAW_HDR_OUTPUT\nuniform maxColorValue: f32;\n#endif\n#include<logDepthDeclaration>\n#include<fogFragmentDeclaration>\nconst ce: f32=2.71828182845904523536028747135266249775724709369995957;const pi: f32=3.141592653589793238462643383279502884197169;const cn: f32=1.0003;const cN: f32=2.545E25;const pn: f32=0.035;const lambda: vec3f= vec3f(680E-9,550E-9,450E-9);const cK: vec3f= vec3f(0.686,0.678,0.666);const cv: f32=4.0;const rayleighZenithLength: f32=8.4E3;const mieZenithLength: f32=1.25E3;const EE: f32=1000.0;const sunAngularDiameterCos: f32=0.999956676946448443553574619906976478926848692873900859324;const cutoffAngle: f32=pi/1.95;const steepness: f32=1.5;const CLOUD_TAU_MAX: f32=15.0;const CLOUD_G: f32=0.5;const CLOUD_G_BACK: f32=-0.5;const CLOUD_BACK_WEIGHT: f32=0.2;fn totalRayleigh(lambdaIn: vec3f)->vec3f\n{return (8.0*pow(pi,3.0)*pow(pow(cn,2.0)-1.0,2.0)*(6.0+3.0*pn))/(3.0*cN*pow(lambdaIn, vec3f(4.0))*(6.0-7.0*pn));}\nfn simplifiedRayleigh()->vec3f\n{return vec3f(0.0005)/ vec3f(94,40,18);}\nfn rayleighPhase(cosTheta: f32)->f32\n{return (3.0/(16.0*pi))*(1.0+pow(cosTheta,2.0));}\nfn totalMie(lambdaIn: vec3f,KIn: vec3f,T: f32)->vec3f\n{var c: f32=(0.2*T)*10E-18;return 0.434*c*pi*pow((2.0*pi)/lambdaIn, vec3f(cv-2.0))*KIn;}\nfn hgPhase(cosTheta: f32,g: f32)->f32\n{return (1.0/(4.0*pi))*((1.0-pow(g,2.0))/pow(1.0-2.0*g*cosTheta+pow(g,2.0),1.5));}\nfn cloudPhase(cosTheta: f32,gForward: f32)->f32\n{return mix(hgPhase(cosTheta,gForward),hgPhase(cosTheta,CLOUD_G_BACK),CLOUD_BACK_WEIGHT);}\nfn sunIntensity(zenithAngleCos: f32)->f32\n{return EE*max(0.0,1.0-exp((-(cutoffAngle-acos(zenithAngleCos))/steepness)));}\nconst A: f32=0.15;const B: f32=0.50;const C: f32=0.10;const D: f32=0.20;const EEE: f32=0.02;const F: f32=0.30;const W: f32=1000.0;fn Uncharted2Tonemap(x: vec3f)->vec3f\n{return ((x*(A*x+C*B)+D*EEE)/(x*(A*x+B)+D*F))-EEE/F;}\n#if DITHER\n#include<helperFunctions>\n#endif\n#define CUSTOM_FRAGMENT_DEFINITIONS\n@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include<clipPlaneFragment>\n/**\n* Sky Color\n*/\nvar sunfade: f32=1.0-clamp(1.0-exp((uniforms.sunPosition.y/450000.0)),0.0,1.0);var rayleighCoefficient: f32=uniforms.rayleigh-(1.0*(1.0-sunfade));var sunDirection: vec3f=normalize(uniforms.sunPosition);var sunE: f32=sunIntensity(dot(sunDirection,uniforms.up));var betaR: vec3f=simplifiedRayleigh()*rayleighCoefficient;var betaM: vec3f=totalMie(lambda,cK,uniforms.turbidity)*uniforms.mieCoefficient;var zenithAngle: f32=acos(max(0.0,dot(uniforms.up,normalize(fragmentInputs.vPositionW-uniforms.cameraPosition+uniforms.cameraOffset))));var sR: f32=rayleighZenithLength/(cos(zenithAngle)+0.15*pow(93.885-((zenithAngle*180.0)/pi),-1.253));var sM: f32=mieZenithLength/(cos(zenithAngle)+0.15*pow(93.885-((zenithAngle*180.0)/pi),-1.253));var Fex: vec3f=exp(-(betaR*sR+betaM*sM));var cosTheta: f32=dot(normalize(fragmentInputs.vPositionW-uniforms.cameraPosition),sunDirection);var rPhase: f32=rayleighPhase(cosTheta*0.5+0.5);var betaRTheta: vec3f=betaR*rPhase;var mPhase: f32=hgPhase(cosTheta,uniforms.mieDirectionalG);var betaMTheta: vec3f=betaM*mPhase;var Lin: vec3f=pow(sunE*((betaRTheta+betaMTheta)/(betaR+betaM))*(1.0-Fex), vec3f(1.5));Lin=Lin*mix( vec3f(1.0),pow(sunE*((betaRTheta+betaMTheta)/(betaR+betaM))*Fex, vec3f(1.0/2.0)), vec3f(clamp(pow(1.0-dot(uniforms.up,sunDirection),5.0),0.0,1.0)));var direction: vec3f=normalize(fragmentInputs.vPositionW-uniforms.cameraPosition);var theta: f32=acos(direction.y);var phi: f32=atan2(direction.z,direction.x);var uv: vec2f= vec2f(phi,theta)/ vec2f(2.0*pi,pi)+ vec2f(0.5,0.0);var L0: vec3f= vec3f(0.1)*Fex;var sundiskTerm: f32=0.0;if (uniforms.cloudiness>0.0) {var cloudTau: f32=uniforms.cloudiness*CLOUD_TAU_MAX;var cloudT: f32=exp(-cloudTau);var cloudG: f32=CLOUD_G*cloudT;var omegaSun: f32=2.0*pi*(1.0-sunAngularDiameterCos);var sharpDisk: f32=smoothstep(sunAngularDiameterCos,sunAngularDiameterCos+0.00002,cosTheta);sundiskTerm=cloudT*sharpDisk+(1.0-cloudT)*omegaSun*cloudPhase(cosTheta,cloudG);} else {sundiskTerm=smoothstep(sunAngularDiameterCos,sunAngularDiameterCos+0.00002,cosTheta);}\nL0=L0+(sunE*19000.0*Fex)*sundiskTerm;var texColor: vec3f=(Lin+L0);texColor=texColor*0.04;texColor=texColor+ vec3f(0.0,0.001,0.0025)*0.3;\n#ifdef SKY_RAW_HDR_OUTPUT\nvar retColor: vec3f=texColor*uniforms.luminance;\n#else\nvar whiteScale: vec3f=1.0/Uncharted2Tonemap( vec3f(W));var g_fMaxLuminance: f32=1.0;var fLumScaled: f32=0.1/uniforms.luminance;var fLumCompressed: f32=(fLumScaled*(1.0+(fLumScaled/(g_fMaxLuminance*g_fMaxLuminance))))/(1.0+fLumScaled);var ExposureBias: f32=fLumCompressed;var curr: vec3f=Uncharted2Tonemap((log2(2.0/pow(uniforms.luminance,4.0)))*texColor);var retColor: vec3f=curr*whiteScale;\n#endif\nvar alpha: f32=1.0;\n#ifdef VERTEXCOLOR\nretColor=retColor.rgb*fragmentInputs.vColor.rgb;\n#endif\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=fragmentInputs.vColor.a;\n#endif\n#if DITHER\nretColor=retColor.rgb+dither(fragmentInputs.position.xy,0.5);\n#endif\n#ifdef SKY_RAW_HDR_OUTPUT\nvar color: vec4f= vec4f(clamp(retColor.rgb, vec3f(0.0), vec3f(uniforms.maxColorValue)),alpha);\n#else\nvar color: vec4f=clamp( vec4f(retColor.rgb,alpha), vec4f(0.0), vec4f(1.0));\n#endif\n#include<logDepthFragment>\n#include<fogFragment>\nfragmentOutputs.color=color;\n#ifndef SKY_RAW_HDR_OUTPUT\n#include<imageProcessingCompatibility>\n#endif\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\nconst includes = [clipPlaneFragmentDeclarationWGSL, logDepthDeclarationWGSL, fogFragmentDeclarationWGSL, helperFunctionsWGSL, clipPlaneFragmentWGSL, logDepthFragmentWGSL, fogFragmentWGSL, imageProcessingCompatibilityWGSL];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStoreWGSL[inc.name]) {\n ShaderStore.IncludesShadersStoreWGSL[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const skyPixelShaderWGSL = { name, shader };\n"]}
@@ -54,6 +54,7 @@ class WaterMaterialDefines extends MaterialDefines {
54
54
  this.BUMPAFFECTSREFLECTION = false;
55
55
  this.USE_WORLD_COORDINATES = false;
56
56
  this.IMAGEPROCESSING = false;
57
+ this.WHITEBALANCE = false;
57
58
  this.VIGNETTE = false;
58
59
  this.VIGNETTEBLENDMODEMULTIPLY = false;
59
60
  this.VIGNETTEBLENDMODEOPAQUE = false;