@babylonjs/core 7.48.1 → 7.48.3
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.
- package/Engines/Native/nativeInterfaces.d.ts +6 -0
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/nativeEngine.d.ts +5 -1
- package/Engines/nativeEngine.js +13 -0
- package/Engines/nativeEngine.js.map +1 -1
- package/Materials/Textures/Filtering/hdrFiltering.d.ts +1 -3
- package/Materials/Textures/Filtering/hdrFiltering.js +8 -18
- package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.d.ts +1 -3
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +11 -27
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
- package/Materials/effect.d.ts +5 -0
- package/Materials/effect.js +9 -0
- package/Materials/effect.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { BaseTexture } from "../baseTexture";
|
|
2
2
|
import type { AbstractEngine } from "../../../Engines/abstractEngine";
|
|
3
|
-
import type { Nullable } from "../../../types";
|
|
4
3
|
/**
|
|
5
4
|
* Options for texture filtering
|
|
6
5
|
*/
|
|
@@ -54,9 +53,8 @@ export declare class HDRFiltering {
|
|
|
54
53
|
* This has to be done once the map is loaded, and has not been prefiltered by a third party software.
|
|
55
54
|
* See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information
|
|
56
55
|
* @param texture Texture to filter
|
|
57
|
-
* @param onFinished Callback when filtering is done
|
|
58
56
|
* @returns Promise called when prefiltering is done
|
|
59
57
|
*/
|
|
60
|
-
prefilter(texture: BaseTexture
|
|
58
|
+
prefilter(texture: BaseTexture): Promise<void>;
|
|
61
59
|
}
|
|
62
60
|
export {};
|
|
@@ -2,7 +2,6 @@ import { Vector3 } from "../../../Maths/math.js";
|
|
|
2
2
|
import { ILog2 } from "../../../Maths/math.scalar.functions.js";
|
|
3
3
|
|
|
4
4
|
import { EffectWrapper, EffectRenderer } from "../../../Materials/effectRenderer.js";
|
|
5
|
-
import { Logger } from "../../../Misc/logger.js";
|
|
6
5
|
/**
|
|
7
6
|
* Filters HDR maps to get correct renderings of PBR reflections
|
|
8
7
|
*/
|
|
@@ -151,27 +150,18 @@ export class HDRFiltering {
|
|
|
151
150
|
* This has to be done once the map is loaded, and has not been prefiltered by a third party software.
|
|
152
151
|
* See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information
|
|
153
152
|
* @param texture Texture to filter
|
|
154
|
-
* @param onFinished Callback when filtering is done
|
|
155
153
|
* @returns Promise called when prefiltering is done
|
|
156
154
|
*/
|
|
157
|
-
prefilter(texture
|
|
155
|
+
async prefilter(texture) {
|
|
158
156
|
if (!this._engine._features.allowTexturePrefiltering) {
|
|
159
|
-
|
|
160
|
-
return Promise.reject("HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.");
|
|
157
|
+
throw new Error("HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.");
|
|
161
158
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
this._effectWrapper.dispose();
|
|
169
|
-
resolve();
|
|
170
|
-
if (onFinished) {
|
|
171
|
-
onFinished();
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
});
|
|
159
|
+
this._effectRenderer = new EffectRenderer(this._engine);
|
|
160
|
+
this._effectWrapper = this._createEffect(texture);
|
|
161
|
+
await this._effectWrapper.effect.whenCompiledAsync();
|
|
162
|
+
this._prefilterInternal(texture);
|
|
163
|
+
this._effectRenderer.dispose();
|
|
164
|
+
this._effectWrapper.dispose();
|
|
175
165
|
}
|
|
176
166
|
}
|
|
177
167
|
//# sourceMappingURL=hdrFiltering.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hdrFiltering.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Materials/Textures/Filtering/hdrFiltering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,sCAAsC,CAAC;AAI7D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGlF,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAmB9C;;GAEG;AACH,MAAM,OAAO,YAAY;IAmBrB;;;;;OAKG;IACH,YAAY,MAAsB,EAAE,UAAgC,EAAE;QApB9D,yBAAoB,GAAW,CAAC,CAAC;QACjC,wBAAmB,GAAW,GAAG,CAAC;QAE1C;;;WAGG;QACI,YAAO,GAAW,SAAS,CAAC,iCAAiC,CAAC;QAErE;;WAEG;QACI,aAAQ,GAAW,CAAC,CAAC;QASxB,OAAO;QACP,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;IACnD,CAAC;IAEO,mBAAmB,CAAC,IAAY;QACpC,IAAI,WAAW,GAAG,SAAS,CAAC,yBAAyB,CAAC;QACtD,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,sBAAsB,EAAE,CAAC;YAChD,WAAW,GAAG,SAAS,CAAC,sBAAsB,CAAC;QACnD,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,kBAAkB,EAAE,CAAC;YACnD,WAAW,GAAG,SAAS,CAAC,iBAAiB,CAAC;QAC9C,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,EAAE;YAC/D,MAAM,EAAE,SAAS,CAAC,kBAAkB;YACpC,IAAI,EAAE,WAAW;YACjB,aAAa,EAAE,IAAI;YACnB,eAAe,EAAE,KAAK;YACtB,mBAAmB,EAAE,KAAK;YAC1B,qBAAqB,EAAE,KAAK;YAC5B,YAAY,EAAE,SAAS,CAAC,4BAA4B;YACpD,KAAK,EAAE,+BAA+B;SACzC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,SAAS,CAAC,OAAQ,EAAE,SAAS,CAAC,yBAAyB,EAAE,SAAS,CAAC,yBAAyB,EAAE,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAE1K,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,SAAS,CAAC,8BAA8B,EAAE,SAAS,CAAC,OAAQ,EAAE,IAAI,CAAC,CAAC;QAE3G,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,kBAAkB,CAAC,OAAoB;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;QACtC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;QAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QAEnC,MAAM,UAAU,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAChD,IAAI,UAAU,EAAE,CAAC;YACb,0CAA0C;YAC1C,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,SAAS,CAAC,8BAA8B,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QACvG,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE7D,MAAM,UAAU,GAAG;YACf,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY;YAClF,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY;YAClF,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY;YAChF,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY;YAClF,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY;YACjF,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY;SACtF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC1E,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAE3C,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;YAClC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEhD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,YAAY,EAAE,GAAG,EAAE,EAAE,CAAC;gBAC1C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;gBACnF,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAE7D,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC;gBAC9F,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;oBACZ,KAAK,GAAG,CAAC,CAAC;gBACd,CAAC;gBAED,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAEjC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAChC,CAAC;QACL,CAAC;QAED,UAAU;QACV,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,QAAS,CAAC,CAAC;QAEhD,gBAAgB;QAChB,MAAM,IAAI,GAAG,aAAa,CAAC,OAAQ,CAAC,IAAI,CAAC;QACzC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAQ,CAAC,MAAM,CAAC;QAE7C,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,QAAS,CAAC,CAAC;QAE7C,OAAO,CAAC,QAAS,CAAC,IAAI,GAAG,IAAI,CAAC;QAC9B,OAAO,CAAC,QAAS,CAAC,MAAM,GAAG,MAAM,CAAC;QAElC,eAAe;QACf,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC;QAC3B,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACxD,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACtD,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;QAE5B,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,aAAa,CAAC,OAAoB,EAAE,UAA+C;QACvF,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe;QAE1E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QAEvC,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC;YACpC,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE,cAAc;YAC5B,cAAc,EAAE,cAAc;YAC9B,YAAY,EAAE,CAAC,cAAc,CAAC;YAC9B,YAAY,EAAE,CAAC,mBAAmB,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,CAAC;YAC/G,cAAc,EAAE,IAAI;YACpB,OAAO;YACP,UAAU,EAAE,UAAU;YACtB,cAAc,EAAE,QAAQ,CAAC,CAAC,6BAAqB,CAAC,4BAAoB;YACpE,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBAClC,IAAI,QAAQ,EAAE,CAAC;oBACX,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,0CAA0C,CAAC,EAAE,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC,CAAC;gBAClI,CAAC;qBAAM,CAAC;oBACJ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,sCAAsC,CAAC,EAAE,MAAM,CAAC,wCAAwC,CAAC,CAAC,CAAC,CAAC;gBAC1H,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,OAAoB;QAC/B,OAAO,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACrE,CAAC;IAED;;;;;;;;OAQG;IACI,SAAS,CAAC,OAAoB,EAAE,aAAmC,IAAI;QAC1E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,wBAAwB,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;YACvG,OAAO,OAAO,CAAC,MAAM,CAAC,yFAAyF,CAAC,CAAC;QACrH,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE;gBAChD,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC/B,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC9B,OAAO,EAAE,CAAC;gBACV,IAAI,UAAU,EAAE,CAAC;oBACb,UAAU,EAAE,CAAC;gBACjB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;CACJ","sourcesContent":["import { Vector3 } from \"../../../Maths/math\";\r\nimport { ILog2 } from \"../../../Maths/math.scalar.functions\";\r\nimport type { BaseTexture } from \"../baseTexture\";\r\nimport type { AbstractEngine } from \"../../../Engines/abstractEngine\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport { EffectWrapper, EffectRenderer } from \"../../../Materials/effectRenderer\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport type { RenderTargetWrapper } from \"../../../Engines/renderTargetWrapper\";\r\nimport { Logger } from \"../../../Misc/logger\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Options for texture filtering\r\n */\r\ninterface IHDRFilteringOptions {\r\n /**\r\n * Scales pixel intensity for the input HDR map.\r\n */\r\n hdrScale?: number;\r\n\r\n /**\r\n * Quality of the filter. Should be `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` for prefiltering\r\n */\r\n quality?: number;\r\n}\r\n\r\n/**\r\n * Filters HDR maps to get correct renderings of PBR reflections\r\n */\r\nexport class HDRFiltering {\r\n private _engine: AbstractEngine;\r\n private _effectRenderer: EffectRenderer;\r\n private _effectWrapper: EffectWrapper;\r\n\r\n private _lodGenerationOffset: number = 0;\r\n private _lodGenerationScale: number = 0.8;\r\n\r\n /**\r\n * Quality switch for prefiltering. Should be set to `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` unless\r\n * you care about baking speed.\r\n */\r\n public quality: number = Constants.TEXTURE_FILTERING_QUALITY_OFFLINE;\r\n\r\n /**\r\n * Scales pixel intensity for the input HDR map.\r\n */\r\n public hdrScale: number = 1;\r\n\r\n /**\r\n * Instantiates HDR filter for reflection maps\r\n *\r\n * @param engine Thin engine\r\n * @param options Options\r\n */\r\n constructor(engine: AbstractEngine, options: IHDRFilteringOptions = {}) {\r\n // pass\r\n this._engine = engine;\r\n this.hdrScale = options.hdrScale || this.hdrScale;\r\n this.quality = options.quality || this.quality;\r\n }\r\n\r\n private _createRenderTarget(size: number): RenderTargetWrapper {\r\n let textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n if (this._engine.getCaps().textureHalfFloatRender) {\r\n textureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n } else if (this._engine.getCaps().textureFloatRender) {\r\n textureType = Constants.TEXTURETYPE_FLOAT;\r\n }\r\n\r\n const rtWrapper = this._engine.createRenderTargetCubeTexture(size, {\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n type: textureType,\r\n createMipMaps: true,\r\n generateMipMaps: false,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n label: \"HDR_Radiance_Filtering_Target\",\r\n });\r\n this._engine.updateTextureWrappingMode(rtWrapper.texture!, Constants.TEXTURE_CLAMP_ADDRESSMODE, Constants.TEXTURE_CLAMP_ADDRESSMODE, Constants.TEXTURE_CLAMP_ADDRESSMODE);\r\n\r\n this._engine.updateTextureSamplingMode(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE, rtWrapper.texture!, true);\r\n\r\n return rtWrapper;\r\n }\r\n\r\n private _prefilterInternal(texture: BaseTexture): BaseTexture {\r\n const width = texture.getSize().width;\r\n const mipmapsCount = ILog2(width) + 1;\r\n\r\n const effect = this._effectWrapper.effect;\r\n const outputTexture = this._createRenderTarget(width);\r\n this._effectRenderer.saveStates();\r\n this._effectRenderer.setViewport();\r\n\r\n const intTexture = texture.getInternalTexture();\r\n if (intTexture) {\r\n // Just in case generate fresh clean mips.\r\n this._engine.updateTextureSamplingMode(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE, intTexture, true);\r\n }\r\n\r\n this._effectRenderer.applyEffectWrapper(this._effectWrapper);\r\n\r\n const directions = [\r\n [new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(1, 0, 0)], // PositiveX\r\n [new Vector3(0, 0, 1), new Vector3(0, -1, 0), new Vector3(-1, 0, 0)], // NegativeX\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 1, 0)], // PositiveY\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, -1), new Vector3(0, -1, 0)], // NegativeY\r\n [new Vector3(1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1)], // PositiveZ\r\n [new Vector3(-1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, -1)], // NegativeZ\r\n ];\r\n\r\n effect.setFloat(\"hdrScale\", this.hdrScale);\r\n effect.setFloat2(\"vFilteringInfo\", texture.getSize().width, mipmapsCount);\r\n effect.setTexture(\"inputTexture\", texture);\r\n\r\n for (let face = 0; face < 6; face++) {\r\n effect.setVector3(\"up\", directions[face][0]);\r\n effect.setVector3(\"right\", directions[face][1]);\r\n effect.setVector3(\"front\", directions[face][2]);\r\n\r\n for (let lod = 0; lod < mipmapsCount; lod++) {\r\n this._engine.bindFramebuffer(outputTexture, face, undefined, undefined, true, lod);\r\n this._effectRenderer.applyEffectWrapper(this._effectWrapper);\r\n\r\n let alpha = Math.pow(2, (lod - this._lodGenerationOffset) / this._lodGenerationScale) / width;\r\n if (lod === 0) {\r\n alpha = 0;\r\n }\r\n\r\n effect.setFloat(\"alphaG\", alpha);\r\n\r\n this._effectRenderer.draw();\r\n }\r\n }\r\n\r\n // Cleanup\r\n this._effectRenderer.restoreStates();\r\n this._engine.restoreDefaultFramebuffer();\r\n this._engine._releaseTexture(texture._texture!);\r\n\r\n // Internal Swap\r\n const type = outputTexture.texture!.type;\r\n const format = outputTexture.texture!.format;\r\n\r\n outputTexture._swapAndDie(texture._texture!);\r\n\r\n texture._texture!.type = type;\r\n texture._texture!.format = format;\r\n\r\n // New settings\r\n texture.gammaSpace = false;\r\n texture.lodGenerationOffset = this._lodGenerationOffset;\r\n texture.lodGenerationScale = this._lodGenerationScale;\r\n texture._prefiltered = true;\r\n\r\n return texture;\r\n }\r\n\r\n private _createEffect(texture: BaseTexture, onCompiled?: Nullable<(effect: Effect) => void>): EffectWrapper {\r\n const defines = [];\r\n if (texture.gammaSpace) {\r\n defines.push(\"#define GAMMA_INPUT\");\r\n }\r\n\r\n defines.push(\"#define NUM_SAMPLES \" + this.quality + \"u\"); // unsigned int\r\n\r\n const isWebGPU = this._engine.isWebGPU;\r\n\r\n const effectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n name: \"hdrFiltering\",\r\n vertexShader: \"hdrFiltering\",\r\n fragmentShader: \"hdrFiltering\",\r\n samplerNames: [\"inputTexture\"],\r\n uniformNames: [\"vSampleDirections\", \"vWeights\", \"up\", \"right\", \"front\", \"vFilteringInfo\", \"hdrScale\", \"alphaG\"],\r\n useShaderStore: true,\r\n defines,\r\n onCompiled: onCompiled,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../../ShadersWGSL/hdrFiltering.vertex\"), import(\"../../../ShadersWGSL/hdrFiltering.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../../Shaders/hdrFiltering.vertex\"), import(\"../../../Shaders/hdrFiltering.fragment\")]);\r\n }\r\n },\r\n });\r\n\r\n return effectWrapper;\r\n }\r\n\r\n /**\r\n * Get a value indicating if the filter is ready to be used\r\n * @param texture Texture to filter\r\n * @returns true if the filter is ready\r\n */\r\n public isReady(texture: BaseTexture) {\r\n return texture.isReady() && this._effectWrapper.effect.isReady();\r\n }\r\n\r\n /**\r\n * Prefilters a cube texture to have mipmap levels representing roughness values.\r\n * Prefiltering will be invoked at the end of next rendering pass.\r\n * This has to be done once the map is loaded, and has not been prefiltered by a third party software.\r\n * See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information\r\n * @param texture Texture to filter\r\n * @param onFinished Callback when filtering is done\r\n * @returns Promise called when prefiltering is done\r\n */\r\n public prefilter(texture: BaseTexture, onFinished: Nullable<() => void> = null): Promise<void> {\r\n if (!this._engine._features.allowTexturePrefiltering) {\r\n Logger.Warn(\"HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.\");\r\n return Promise.reject(\"HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.\");\r\n }\r\n\r\n return new Promise((resolve) => {\r\n this._effectRenderer = new EffectRenderer(this._engine);\r\n this._effectWrapper = this._createEffect(texture);\r\n this._effectWrapper.effect.executeWhenCompiled(() => {\r\n this._prefilterInternal(texture);\r\n this._effectRenderer.dispose();\r\n this._effectWrapper.dispose();\r\n resolve();\r\n if (onFinished) {\r\n onFinished();\r\n }\r\n });\r\n });\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"hdrFiltering.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Materials/Textures/Filtering/hdrFiltering.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"../../../Maths/math\";\r\nimport { ILog2 } from \"../../../Maths/math.scalar.functions\";\r\nimport type { BaseTexture } from \"../baseTexture\";\r\nimport type { AbstractEngine } from \"../../../Engines/abstractEngine\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport { EffectWrapper, EffectRenderer } from \"../../../Materials/effectRenderer\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport type { RenderTargetWrapper } from \"../../../Engines/renderTargetWrapper\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Options for texture filtering\r\n */\r\ninterface IHDRFilteringOptions {\r\n /**\r\n * Scales pixel intensity for the input HDR map.\r\n */\r\n hdrScale?: number;\r\n\r\n /**\r\n * Quality of the filter. Should be `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` for prefiltering\r\n */\r\n quality?: number;\r\n}\r\n\r\n/**\r\n * Filters HDR maps to get correct renderings of PBR reflections\r\n */\r\nexport class HDRFiltering {\r\n private _engine: AbstractEngine;\r\n private _effectRenderer: EffectRenderer;\r\n private _effectWrapper: EffectWrapper;\r\n\r\n private _lodGenerationOffset: number = 0;\r\n private _lodGenerationScale: number = 0.8;\r\n\r\n /**\r\n * Quality switch for prefiltering. Should be set to `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` unless\r\n * you care about baking speed.\r\n */\r\n public quality: number = Constants.TEXTURE_FILTERING_QUALITY_OFFLINE;\r\n\r\n /**\r\n * Scales pixel intensity for the input HDR map.\r\n */\r\n public hdrScale: number = 1;\r\n\r\n /**\r\n * Instantiates HDR filter for reflection maps\r\n *\r\n * @param engine Thin engine\r\n * @param options Options\r\n */\r\n constructor(engine: AbstractEngine, options: IHDRFilteringOptions = {}) {\r\n // pass\r\n this._engine = engine;\r\n this.hdrScale = options.hdrScale || this.hdrScale;\r\n this.quality = options.quality || this.quality;\r\n }\r\n\r\n private _createRenderTarget(size: number): RenderTargetWrapper {\r\n let textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n if (this._engine.getCaps().textureHalfFloatRender) {\r\n textureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n } else if (this._engine.getCaps().textureFloatRender) {\r\n textureType = Constants.TEXTURETYPE_FLOAT;\r\n }\r\n\r\n const rtWrapper = this._engine.createRenderTargetCubeTexture(size, {\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n type: textureType,\r\n createMipMaps: true,\r\n generateMipMaps: false,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n label: \"HDR_Radiance_Filtering_Target\",\r\n });\r\n this._engine.updateTextureWrappingMode(rtWrapper.texture!, Constants.TEXTURE_CLAMP_ADDRESSMODE, Constants.TEXTURE_CLAMP_ADDRESSMODE, Constants.TEXTURE_CLAMP_ADDRESSMODE);\r\n\r\n this._engine.updateTextureSamplingMode(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE, rtWrapper.texture!, true);\r\n\r\n return rtWrapper;\r\n }\r\n\r\n private _prefilterInternal(texture: BaseTexture): BaseTexture {\r\n const width = texture.getSize().width;\r\n const mipmapsCount = ILog2(width) + 1;\r\n\r\n const effect = this._effectWrapper.effect;\r\n const outputTexture = this._createRenderTarget(width);\r\n this._effectRenderer.saveStates();\r\n this._effectRenderer.setViewport();\r\n\r\n const intTexture = texture.getInternalTexture();\r\n if (intTexture) {\r\n // Just in case generate fresh clean mips.\r\n this._engine.updateTextureSamplingMode(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE, intTexture, true);\r\n }\r\n\r\n this._effectRenderer.applyEffectWrapper(this._effectWrapper);\r\n\r\n const directions = [\r\n [new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(1, 0, 0)], // PositiveX\r\n [new Vector3(0, 0, 1), new Vector3(0, -1, 0), new Vector3(-1, 0, 0)], // NegativeX\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 1, 0)], // PositiveY\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, -1), new Vector3(0, -1, 0)], // NegativeY\r\n [new Vector3(1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1)], // PositiveZ\r\n [new Vector3(-1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, -1)], // NegativeZ\r\n ];\r\n\r\n effect.setFloat(\"hdrScale\", this.hdrScale);\r\n effect.setFloat2(\"vFilteringInfo\", texture.getSize().width, mipmapsCount);\r\n effect.setTexture(\"inputTexture\", texture);\r\n\r\n for (let face = 0; face < 6; face++) {\r\n effect.setVector3(\"up\", directions[face][0]);\r\n effect.setVector3(\"right\", directions[face][1]);\r\n effect.setVector3(\"front\", directions[face][2]);\r\n\r\n for (let lod = 0; lod < mipmapsCount; lod++) {\r\n this._engine.bindFramebuffer(outputTexture, face, undefined, undefined, true, lod);\r\n this._effectRenderer.applyEffectWrapper(this._effectWrapper);\r\n\r\n let alpha = Math.pow(2, (lod - this._lodGenerationOffset) / this._lodGenerationScale) / width;\r\n if (lod === 0) {\r\n alpha = 0;\r\n }\r\n\r\n effect.setFloat(\"alphaG\", alpha);\r\n\r\n this._effectRenderer.draw();\r\n }\r\n }\r\n\r\n // Cleanup\r\n this._effectRenderer.restoreStates();\r\n this._engine.restoreDefaultFramebuffer();\r\n this._engine._releaseTexture(texture._texture!);\r\n\r\n // Internal Swap\r\n const type = outputTexture.texture!.type;\r\n const format = outputTexture.texture!.format;\r\n\r\n outputTexture._swapAndDie(texture._texture!);\r\n\r\n texture._texture!.type = type;\r\n texture._texture!.format = format;\r\n\r\n // New settings\r\n texture.gammaSpace = false;\r\n texture.lodGenerationOffset = this._lodGenerationOffset;\r\n texture.lodGenerationScale = this._lodGenerationScale;\r\n texture._prefiltered = true;\r\n\r\n return texture;\r\n }\r\n\r\n private _createEffect(texture: BaseTexture, onCompiled?: Nullable<(effect: Effect) => void>): EffectWrapper {\r\n const defines = [];\r\n if (texture.gammaSpace) {\r\n defines.push(\"#define GAMMA_INPUT\");\r\n }\r\n\r\n defines.push(\"#define NUM_SAMPLES \" + this.quality + \"u\"); // unsigned int\r\n\r\n const isWebGPU = this._engine.isWebGPU;\r\n\r\n const effectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n name: \"hdrFiltering\",\r\n vertexShader: \"hdrFiltering\",\r\n fragmentShader: \"hdrFiltering\",\r\n samplerNames: [\"inputTexture\"],\r\n uniformNames: [\"vSampleDirections\", \"vWeights\", \"up\", \"right\", \"front\", \"vFilteringInfo\", \"hdrScale\", \"alphaG\"],\r\n useShaderStore: true,\r\n defines,\r\n onCompiled: onCompiled,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../../ShadersWGSL/hdrFiltering.vertex\"), import(\"../../../ShadersWGSL/hdrFiltering.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../../Shaders/hdrFiltering.vertex\"), import(\"../../../Shaders/hdrFiltering.fragment\")]);\r\n }\r\n },\r\n });\r\n\r\n return effectWrapper;\r\n }\r\n\r\n /**\r\n * Get a value indicating if the filter is ready to be used\r\n * @param texture Texture to filter\r\n * @returns true if the filter is ready\r\n */\r\n public isReady(texture: BaseTexture) {\r\n return texture.isReady() && this._effectWrapper.effect.isReady();\r\n }\r\n\r\n /**\r\n * Prefilters a cube texture to have mipmap levels representing roughness values.\r\n * Prefiltering will be invoked at the end of next rendering pass.\r\n * This has to be done once the map is loaded, and has not been prefiltered by a third party software.\r\n * See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information\r\n * @param texture Texture to filter\r\n * @returns Promise called when prefiltering is done\r\n */\r\n public async prefilter(texture: BaseTexture): Promise<void> {\r\n if (!this._engine._features.allowTexturePrefiltering) {\r\n throw new Error(\"HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.\");\r\n }\r\n\r\n this._effectRenderer = new EffectRenderer(this._engine);\r\n this._effectWrapper = this._createEffect(texture);\r\n\r\n await this._effectWrapper.effect.whenCompiledAsync();\r\n\r\n this._prefilterInternal(texture);\r\n this._effectRenderer.dispose();\r\n this._effectWrapper.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { BaseTexture } from "../baseTexture";
|
|
2
2
|
import type { AbstractEngine } from "../../../Engines/abstractEngine";
|
|
3
|
-
import type { Nullable } from "../../../types";
|
|
4
3
|
/**
|
|
5
4
|
* Options for texture filtering
|
|
6
5
|
*/
|
|
@@ -61,9 +60,8 @@ export declare class HDRIrradianceFiltering {
|
|
|
61
60
|
* This has to be done once the map is loaded, and has not been prefiltered by a third party software.
|
|
62
61
|
* See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information
|
|
63
62
|
* @param texture Texture to filter
|
|
64
|
-
* @param onFinished Callback when filtering is done
|
|
65
63
|
* @returns Promise called when prefiltering is done
|
|
66
64
|
*/
|
|
67
|
-
prefilter(texture: BaseTexture
|
|
65
|
+
prefilter(texture: BaseTexture): Promise<BaseTexture>;
|
|
68
66
|
}
|
|
69
67
|
export {};
|
|
@@ -3,7 +3,6 @@ import { ILog2 } from "../../../Maths/math.scalar.functions.js";
|
|
|
3
3
|
import { BaseTexture } from "../baseTexture.js";
|
|
4
4
|
|
|
5
5
|
import { EffectWrapper, EffectRenderer } from "../../../Materials/effectRenderer.js";
|
|
6
|
-
import { Logger } from "../../../Misc/logger.js";
|
|
7
6
|
import { IblCdfGenerator } from "../../../Rendering/iblCdfGenerator.js";
|
|
8
7
|
/**
|
|
9
8
|
* Filters HDR maps to get correct renderings of PBR reflections
|
|
@@ -148,40 +147,25 @@ export class HDRIrradianceFiltering {
|
|
|
148
147
|
* This has to be done once the map is loaded, and has not been prefiltered by a third party software.
|
|
149
148
|
* See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information
|
|
150
149
|
* @param texture Texture to filter
|
|
151
|
-
* @param onFinished Callback when filtering is done
|
|
152
150
|
* @returns Promise called when prefiltering is done
|
|
153
151
|
*/
|
|
154
|
-
prefilter(texture
|
|
152
|
+
async prefilter(texture) {
|
|
155
153
|
if (!this._engine._features.allowTexturePrefiltering) {
|
|
156
|
-
|
|
157
|
-
return Promise.reject("HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.");
|
|
154
|
+
throw new Error("HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.");
|
|
158
155
|
}
|
|
159
|
-
let cdfGeneratedPromise = Promise.resolve(null);
|
|
160
156
|
if (this.useCdf) {
|
|
161
157
|
this._cdfGenerator = new IblCdfGenerator(this._engine);
|
|
162
158
|
this._cdfGenerator.iblSource = texture;
|
|
163
|
-
|
|
164
|
-
this._cdfGenerator.onGeneratedObservable.addOnce(() => {
|
|
165
|
-
resolve(null);
|
|
166
|
-
});
|
|
167
|
-
});
|
|
159
|
+
await this._cdfGenerator.renderWhenReady();
|
|
168
160
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
this._cdfGenerator?.dispose();
|
|
178
|
-
resolve(irradianceTexture);
|
|
179
|
-
if (onFinished) {
|
|
180
|
-
onFinished();
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
});
|
|
161
|
+
this._effectRenderer = new EffectRenderer(this._engine);
|
|
162
|
+
this._effectWrapper = this._createEffect(texture);
|
|
163
|
+
await this._effectWrapper.effect.whenCompiledAsync();
|
|
164
|
+
const irradianceTexture = this._prefilterInternal(texture);
|
|
165
|
+
this._effectRenderer.dispose();
|
|
166
|
+
this._effectWrapper.dispose();
|
|
167
|
+
this._cdfGenerator?.dispose();
|
|
168
|
+
return irradianceTexture;
|
|
185
169
|
}
|
|
186
170
|
}
|
|
187
171
|
//# sourceMappingURL=hdrIrradianceFiltering.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hdrIrradianceFiltering.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Materials/Textures/Filtering/hdrIrradianceFiltering.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"../../../Maths/math\";\r\nimport { ILog2 } from \"../../../Maths/math.scalar.functions\";\r\nimport { BaseTexture } from \"../baseTexture\";\r\nimport type { AbstractEngine } from \"../../../Engines/abstractEngine\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport { EffectWrapper, EffectRenderer } from \"../../../Materials/effectRenderer\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport type { RenderTargetWrapper } from \"../../../Engines/renderTargetWrapper\";\r\nimport { Logger } from \"../../../Misc/logger\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { IblCdfGenerator } from \"../../../Rendering/iblCdfGenerator\";\r\n\r\n/**\r\n * Options for texture filtering\r\n */\r\ninterface IHDRIrradianceFilteringOptions {\r\n /**\r\n * Scales pixel intensity for the input HDR map.\r\n */\r\n hdrScale?: number;\r\n\r\n /**\r\n * Quality of the filter. Should be `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` for prefiltering\r\n */\r\n quality?: number;\r\n\r\n /**\r\n * Use the Cumulative Distribution Function (CDF) for filtering\r\n */\r\n useCdf?: boolean;\r\n}\r\n\r\n/**\r\n * Filters HDR maps to get correct renderings of PBR reflections\r\n */\r\nexport class HDRIrradianceFiltering {\r\n private _engine: AbstractEngine;\r\n private _effectRenderer: EffectRenderer;\r\n private _effectWrapper: EffectWrapper;\r\n private _cdfGenerator: IblCdfGenerator;\r\n\r\n /**\r\n * Quality switch for prefiltering. Should be set to `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` unless\r\n * you care about baking speed.\r\n */\r\n public quality: number = Constants.TEXTURE_FILTERING_QUALITY_OFFLINE;\r\n\r\n /**\r\n * Scales pixel intensity for the input HDR map.\r\n */\r\n public hdrScale: number = 1;\r\n\r\n /**\r\n * Use the Cumulative Distribution Function (CDF) for filtering\r\n */\r\n public useCdf: boolean = false;\r\n\r\n /**\r\n * Instantiates HDR filter for irradiance map\r\n *\r\n * @param engine Thin engine\r\n * @param options Options\r\n */\r\n constructor(engine: AbstractEngine, options: IHDRIrradianceFilteringOptions = {}) {\r\n // pass\r\n this._engine = engine;\r\n this.hdrScale = options.hdrScale || this.hdrScale;\r\n this.quality = options.quality || this.quality;\r\n this.useCdf = options.useCdf || this.useCdf;\r\n }\r\n\r\n private _createRenderTarget(size: number): RenderTargetWrapper {\r\n let textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n if (this._engine.getCaps().textureHalfFloatRender) {\r\n textureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n } else if (this._engine.getCaps().textureFloatRender) {\r\n textureType = Constants.TEXTURETYPE_FLOAT;\r\n }\r\n\r\n const rtWrapper = this._engine.createRenderTargetCubeTexture(size, {\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n type: textureType,\r\n createMipMaps: false,\r\n generateMipMaps: false,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n label: \"HDR_Irradiance_Filtering_Target\",\r\n });\r\n this._engine.updateTextureWrappingMode(rtWrapper.texture!, Constants.TEXTURE_CLAMP_ADDRESSMODE, Constants.TEXTURE_CLAMP_ADDRESSMODE, Constants.TEXTURE_CLAMP_ADDRESSMODE);\r\n\r\n return rtWrapper;\r\n }\r\n\r\n private _prefilterInternal(texture: BaseTexture): BaseTexture {\r\n const width = texture.getSize().width;\r\n const mipmapsCount = ILog2(width);\r\n\r\n const effect = this._effectWrapper.effect;\r\n // Choose a power of 2 size for the irradiance map.\r\n // It can be much smaller than the original texture.\r\n const irradianceSize = Math.max(32, 1 << ILog2(width >> 3));\r\n const outputTexture = this._createRenderTarget(irradianceSize);\r\n this._effectRenderer.saveStates();\r\n this._effectRenderer.setViewport();\r\n\r\n this._effectRenderer.applyEffectWrapper(this._effectWrapper);\r\n\r\n const directions = [\r\n [new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(1, 0, 0)], // PositiveX\r\n [new Vector3(0, 0, 1), new Vector3(0, -1, 0), new Vector3(-1, 0, 0)], // NegativeX\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 1, 0)], // PositiveY\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, -1), new Vector3(0, -1, 0)], // NegativeY\r\n [new Vector3(1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1)], // PositiveZ\r\n [new Vector3(-1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, -1)], // NegativeZ\r\n ];\r\n\r\n effect.setFloat(\"hdrScale\", this.hdrScale);\r\n effect.setFloat2(\"vFilteringInfo\", texture.getSize().width, mipmapsCount);\r\n effect.setTexture(\"inputTexture\", texture);\r\n if (this._cdfGenerator) {\r\n effect.setTexture(\"icdfTexture\", this._cdfGenerator.getIcdfTexture());\r\n }\r\n\r\n for (let face = 0; face < 6; face++) {\r\n effect.setVector3(\"up\", directions[face][0]);\r\n effect.setVector3(\"right\", directions[face][1]);\r\n effect.setVector3(\"front\", directions[face][2]);\r\n\r\n this._engine.bindFramebuffer(outputTexture, face, undefined, undefined, true);\r\n this._effectRenderer.applyEffectWrapper(this._effectWrapper);\r\n\r\n this._effectRenderer.draw();\r\n }\r\n\r\n // Cleanup\r\n this._effectRenderer.restoreStates();\r\n this._engine.restoreDefaultFramebuffer();\r\n effect.setTexture(\"inputTexture\", null);\r\n effect.setTexture(\"icdfTexture\", null);\r\n const irradianceTexture = new BaseTexture(texture.getScene(), outputTexture.texture!);\r\n irradianceTexture.name = texture.name + \"_irradiance\";\r\n irradianceTexture.displayName = texture.name + \"_irradiance\";\r\n irradianceTexture.gammaSpace = false;\r\n return irradianceTexture;\r\n }\r\n\r\n private _createEffect(texture: BaseTexture, onCompiled?: Nullable<(effect: Effect) => void>): EffectWrapper {\r\n const defines = [];\r\n if (texture.gammaSpace) {\r\n defines.push(\"#define GAMMA_INPUT\");\r\n }\r\n\r\n defines.push(\"#define NUM_SAMPLES \" + this.quality + \"u\"); // unsigned int\r\n\r\n const isWebGPU = this._engine.isWebGPU;\r\n const samplers = [\"inputTexture\"];\r\n if (this._cdfGenerator) {\r\n samplers.push(\"icdfTexture\");\r\n defines.push(\"#define IBL_CDF_FILTERING\");\r\n }\r\n const effectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n name: \"HDRIrradianceFiltering\",\r\n vertexShader: \"hdrIrradianceFiltering\",\r\n fragmentShader: \"hdrIrradianceFiltering\",\r\n samplerNames: samplers,\r\n uniformNames: [\"vSampleDirections\", \"vWeights\", \"up\", \"right\", \"front\", \"vFilteringInfo\", \"hdrScale\"],\r\n useShaderStore: true,\r\n defines,\r\n onCompiled: onCompiled,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../../ShadersWGSL/hdrIrradianceFiltering.vertex\"), import(\"../../../ShadersWGSL/hdrIrradianceFiltering.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../../Shaders/hdrIrradianceFiltering.vertex\"), import(\"../../../Shaders/hdrIrradianceFiltering.fragment\")]);\r\n }\r\n },\r\n });\r\n\r\n return effectWrapper;\r\n }\r\n\r\n /**\r\n * Get a value indicating if the filter is ready to be used\r\n * @param texture Texture to filter\r\n * @returns true if the filter is ready\r\n */\r\n public isReady(texture: BaseTexture) {\r\n return texture.isReady() && this._effectWrapper.effect.isReady();\r\n }\r\n\r\n /**\r\n * Prefilters a cube texture to contain IBL irradiance.\r\n * Prefiltering will be invoked at the end of next rendering pass.\r\n * This has to be done once the map is loaded, and has not been prefiltered by a third party software.\r\n * See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information\r\n * @param texture Texture to filter\r\n * @param onFinished Callback when filtering is done\r\n * @returns Promise called when prefiltering is done\r\n */\r\n public prefilter(texture: BaseTexture, onFinished: Nullable<() => void> = null): Promise<BaseTexture> {\r\n if (!this._engine._features.allowTexturePrefiltering) {\r\n Logger.Warn(\"HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.\");\r\n return Promise.reject(\"HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.\");\r\n }\r\n let cdfGeneratedPromise: Promise<Nullable<BaseTexture>> = Promise.resolve(null);\r\n if (this.useCdf) {\r\n this._cdfGenerator = new IblCdfGenerator(this._engine);\r\n this._cdfGenerator.iblSource = texture;\r\n cdfGeneratedPromise = new Promise((resolve) => {\r\n this._cdfGenerator.onGeneratedObservable.addOnce(() => {\r\n resolve(null);\r\n });\r\n });\r\n }\r\n\r\n return cdfGeneratedPromise.then(() => {\r\n return new Promise((resolve) => {\r\n this._effectRenderer = new EffectRenderer(this._engine);\r\n this._effectWrapper = this._createEffect(texture);\r\n this._effectWrapper.effect.executeWhenCompiled(() => {\r\n const irradianceTexture = this._prefilterInternal(texture);\r\n this._effectRenderer.dispose();\r\n this._effectWrapper.dispose();\r\n this._cdfGenerator?.dispose();\r\n resolve(irradianceTexture);\r\n if (onFinished) {\r\n onFinished();\r\n }\r\n });\r\n });\r\n });\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"hdrIrradianceFiltering.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Materials/Textures/Filtering/hdrIrradianceFiltering.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"../../../Maths/math\";\r\nimport { ILog2 } from \"../../../Maths/math.scalar.functions\";\r\nimport { BaseTexture } from \"../baseTexture\";\r\nimport type { AbstractEngine } from \"../../../Engines/abstractEngine\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport { EffectWrapper, EffectRenderer } from \"../../../Materials/effectRenderer\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport type { RenderTargetWrapper } from \"../../../Engines/renderTargetWrapper\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { IblCdfGenerator } from \"../../../Rendering/iblCdfGenerator\";\r\n\r\n/**\r\n * Options for texture filtering\r\n */\r\ninterface IHDRIrradianceFilteringOptions {\r\n /**\r\n * Scales pixel intensity for the input HDR map.\r\n */\r\n hdrScale?: number;\r\n\r\n /**\r\n * Quality of the filter. Should be `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` for prefiltering\r\n */\r\n quality?: number;\r\n\r\n /**\r\n * Use the Cumulative Distribution Function (CDF) for filtering\r\n */\r\n useCdf?: boolean;\r\n}\r\n\r\n/**\r\n * Filters HDR maps to get correct renderings of PBR reflections\r\n */\r\nexport class HDRIrradianceFiltering {\r\n private _engine: AbstractEngine;\r\n private _effectRenderer: EffectRenderer;\r\n private _effectWrapper: EffectWrapper;\r\n private _cdfGenerator: IblCdfGenerator;\r\n\r\n /**\r\n * Quality switch for prefiltering. Should be set to `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` unless\r\n * you care about baking speed.\r\n */\r\n public quality: number = Constants.TEXTURE_FILTERING_QUALITY_OFFLINE;\r\n\r\n /**\r\n * Scales pixel intensity for the input HDR map.\r\n */\r\n public hdrScale: number = 1;\r\n\r\n /**\r\n * Use the Cumulative Distribution Function (CDF) for filtering\r\n */\r\n public useCdf: boolean = false;\r\n\r\n /**\r\n * Instantiates HDR filter for irradiance map\r\n *\r\n * @param engine Thin engine\r\n * @param options Options\r\n */\r\n constructor(engine: AbstractEngine, options: IHDRIrradianceFilteringOptions = {}) {\r\n // pass\r\n this._engine = engine;\r\n this.hdrScale = options.hdrScale || this.hdrScale;\r\n this.quality = options.quality || this.quality;\r\n this.useCdf = options.useCdf || this.useCdf;\r\n }\r\n\r\n private _createRenderTarget(size: number): RenderTargetWrapper {\r\n let textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n if (this._engine.getCaps().textureHalfFloatRender) {\r\n textureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n } else if (this._engine.getCaps().textureFloatRender) {\r\n textureType = Constants.TEXTURETYPE_FLOAT;\r\n }\r\n\r\n const rtWrapper = this._engine.createRenderTargetCubeTexture(size, {\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n type: textureType,\r\n createMipMaps: false,\r\n generateMipMaps: false,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n label: \"HDR_Irradiance_Filtering_Target\",\r\n });\r\n this._engine.updateTextureWrappingMode(rtWrapper.texture!, Constants.TEXTURE_CLAMP_ADDRESSMODE, Constants.TEXTURE_CLAMP_ADDRESSMODE, Constants.TEXTURE_CLAMP_ADDRESSMODE);\r\n\r\n return rtWrapper;\r\n }\r\n\r\n private _prefilterInternal(texture: BaseTexture): BaseTexture {\r\n const width = texture.getSize().width;\r\n const mipmapsCount = ILog2(width);\r\n\r\n const effect = this._effectWrapper.effect;\r\n // Choose a power of 2 size for the irradiance map.\r\n // It can be much smaller than the original texture.\r\n const irradianceSize = Math.max(32, 1 << ILog2(width >> 3));\r\n const outputTexture = this._createRenderTarget(irradianceSize);\r\n this._effectRenderer.saveStates();\r\n this._effectRenderer.setViewport();\r\n\r\n this._effectRenderer.applyEffectWrapper(this._effectWrapper);\r\n\r\n const directions = [\r\n [new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(1, 0, 0)], // PositiveX\r\n [new Vector3(0, 0, 1), new Vector3(0, -1, 0), new Vector3(-1, 0, 0)], // NegativeX\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 1, 0)], // PositiveY\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, -1), new Vector3(0, -1, 0)], // NegativeY\r\n [new Vector3(1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1)], // PositiveZ\r\n [new Vector3(-1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, -1)], // NegativeZ\r\n ];\r\n\r\n effect.setFloat(\"hdrScale\", this.hdrScale);\r\n effect.setFloat2(\"vFilteringInfo\", texture.getSize().width, mipmapsCount);\r\n effect.setTexture(\"inputTexture\", texture);\r\n if (this._cdfGenerator) {\r\n effect.setTexture(\"icdfTexture\", this._cdfGenerator.getIcdfTexture());\r\n }\r\n\r\n for (let face = 0; face < 6; face++) {\r\n effect.setVector3(\"up\", directions[face][0]);\r\n effect.setVector3(\"right\", directions[face][1]);\r\n effect.setVector3(\"front\", directions[face][2]);\r\n\r\n this._engine.bindFramebuffer(outputTexture, face, undefined, undefined, true);\r\n this._effectRenderer.applyEffectWrapper(this._effectWrapper);\r\n\r\n this._effectRenderer.draw();\r\n }\r\n\r\n // Cleanup\r\n this._effectRenderer.restoreStates();\r\n this._engine.restoreDefaultFramebuffer();\r\n effect.setTexture(\"inputTexture\", null);\r\n effect.setTexture(\"icdfTexture\", null);\r\n const irradianceTexture = new BaseTexture(texture.getScene(), outputTexture.texture!);\r\n irradianceTexture.name = texture.name + \"_irradiance\";\r\n irradianceTexture.displayName = texture.name + \"_irradiance\";\r\n irradianceTexture.gammaSpace = false;\r\n return irradianceTexture;\r\n }\r\n\r\n private _createEffect(texture: BaseTexture, onCompiled?: Nullable<(effect: Effect) => void>): EffectWrapper {\r\n const defines = [];\r\n if (texture.gammaSpace) {\r\n defines.push(\"#define GAMMA_INPUT\");\r\n }\r\n\r\n defines.push(\"#define NUM_SAMPLES \" + this.quality + \"u\"); // unsigned int\r\n\r\n const isWebGPU = this._engine.isWebGPU;\r\n const samplers = [\"inputTexture\"];\r\n if (this._cdfGenerator) {\r\n samplers.push(\"icdfTexture\");\r\n defines.push(\"#define IBL_CDF_FILTERING\");\r\n }\r\n const effectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n name: \"HDRIrradianceFiltering\",\r\n vertexShader: \"hdrIrradianceFiltering\",\r\n fragmentShader: \"hdrIrradianceFiltering\",\r\n samplerNames: samplers,\r\n uniformNames: [\"vSampleDirections\", \"vWeights\", \"up\", \"right\", \"front\", \"vFilteringInfo\", \"hdrScale\"],\r\n useShaderStore: true,\r\n defines,\r\n onCompiled: onCompiled,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../../ShadersWGSL/hdrIrradianceFiltering.vertex\"), import(\"../../../ShadersWGSL/hdrIrradianceFiltering.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../../Shaders/hdrIrradianceFiltering.vertex\"), import(\"../../../Shaders/hdrIrradianceFiltering.fragment\")]);\r\n }\r\n },\r\n });\r\n\r\n return effectWrapper;\r\n }\r\n\r\n /**\r\n * Get a value indicating if the filter is ready to be used\r\n * @param texture Texture to filter\r\n * @returns true if the filter is ready\r\n */\r\n public isReady(texture: BaseTexture) {\r\n return texture.isReady() && this._effectWrapper.effect.isReady();\r\n }\r\n\r\n /**\r\n * Prefilters a cube texture to contain IBL irradiance.\r\n * Prefiltering will be invoked at the end of next rendering pass.\r\n * This has to be done once the map is loaded, and has not been prefiltered by a third party software.\r\n * See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information\r\n * @param texture Texture to filter\r\n * @returns Promise called when prefiltering is done\r\n */\r\n public async prefilter(texture: BaseTexture): Promise<BaseTexture> {\r\n if (!this._engine._features.allowTexturePrefiltering) {\r\n throw new Error(\"HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.\");\r\n }\r\n\r\n if (this.useCdf) {\r\n this._cdfGenerator = new IblCdfGenerator(this._engine);\r\n this._cdfGenerator.iblSource = texture;\r\n\r\n await this._cdfGenerator.renderWhenReady();\r\n }\r\n\r\n this._effectRenderer = new EffectRenderer(this._engine);\r\n this._effectWrapper = this._createEffect(texture);\r\n await this._effectWrapper.effect.whenCompiledAsync();\r\n\r\n const irradianceTexture = this._prefilterInternal(texture);\r\n this._effectRenderer.dispose();\r\n this._effectWrapper.dispose();\r\n this._cdfGenerator?.dispose();\r\n\r\n return irradianceTexture;\r\n }\r\n}\r\n"]}
|
package/Materials/effect.d.ts
CHANGED
|
@@ -367,6 +367,11 @@ export declare class Effect implements IDisposable {
|
|
|
367
367
|
* @returns true if all fallbacks were used
|
|
368
368
|
*/
|
|
369
369
|
allFallbacksProcessed(): boolean;
|
|
370
|
+
/**
|
|
371
|
+
* Wait until compilation before fulfilling.
|
|
372
|
+
* @returns a promise to wait for completion.
|
|
373
|
+
*/
|
|
374
|
+
whenCompiledAsync(): Promise<Effect>;
|
|
370
375
|
/**
|
|
371
376
|
* Adds a callback to the onCompiled observable and call the callback immediately if already ready.
|
|
372
377
|
* @param func The callback to be used.
|
package/Materials/effect.js
CHANGED
|
@@ -361,6 +361,15 @@ export class Effect {
|
|
|
361
361
|
allFallbacksProcessed() {
|
|
362
362
|
return this._allFallbacksProcessed;
|
|
363
363
|
}
|
|
364
|
+
/**
|
|
365
|
+
* Wait until compilation before fulfilling.
|
|
366
|
+
* @returns a promise to wait for completion.
|
|
367
|
+
*/
|
|
368
|
+
whenCompiledAsync() {
|
|
369
|
+
return new Promise((resolve) => {
|
|
370
|
+
this.executeWhenCompiled(resolve);
|
|
371
|
+
});
|
|
372
|
+
}
|
|
364
373
|
/**
|
|
365
374
|
* Adds a callback to the onCompiled observable and call the callback immediately if already ready.
|
|
366
375
|
* @param func The callback to be used.
|