@babylonjs/core 8.32.1 → 8.32.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/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.d.ts +1 -0
- package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.js +1 -1
- package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/Layers/highlightLayerBlock.d.ts +1 -0
- package/FrameGraph/Node/Blocks/Layers/highlightLayerBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/PostProcesses/bloomPostProcessBlock.d.ts +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/bloomPostProcessBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/PostProcesses/convolutionPostProcessBlock.d.ts +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/convolutionPostProcessBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/PostProcesses/ssao2PostProcessBlock.d.ts +94 -0
- package/FrameGraph/Node/Blocks/PostProcesses/ssao2PostProcessBlock.js +312 -0
- package/FrameGraph/Node/Blocks/PostProcesses/ssao2PostProcessBlock.js.map +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/ssrPostProcessBlock.d.ts +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/ssrPostProcessBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/PostProcesses/taaPostProcessBlock.d.ts +55 -0
- package/FrameGraph/Node/Blocks/PostProcesses/taaPostProcessBlock.js +147 -0
- package/FrameGraph/Node/Blocks/PostProcesses/taaPostProcessBlock.js.map +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/tonemapPostProcessBlock.d.ts +1 -0
- package/FrameGraph/Node/Blocks/PostProcesses/tonemapPostProcessBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.d.ts +1 -0
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.d.ts +1 -0
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js +1 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/index.d.ts +2 -1
- package/FrameGraph/Node/Blocks/index.js +2 -1
- package/FrameGraph/Node/Blocks/index.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraph.js +1 -1
- package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
- package/FrameGraph/Tasks/Layers/baseLayerTask.js +1 -7
- package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/bloomTask.js +0 -6
- package/FrameGraph/Tasks/PostProcesses/bloomTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js +3 -4
- package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js +3 -4
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +3 -4
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js +0 -8
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +4 -11
- package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssao2BlurTask.d.ts +13 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2BlurTask.js +25 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2BlurTask.js.map +1 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.d.ts +76 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js +147 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js.map +1 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2Task.d.ts +14 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2Task.js +29 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2Task.js.map +1 -0
- package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js +2 -11
- package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssrTask.js +8 -9
- package/FrameGraph/Tasks/PostProcesses/ssrTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/taaTask.d.ts +29 -0
- package/FrameGraph/Tasks/PostProcesses/taaTask.js +102 -0
- package/FrameGraph/Tasks/PostProcesses/taaTask.js.map +1 -0
- package/FrameGraph/frameGraphTextureManager.d.ts +9 -0
- package/FrameGraph/frameGraphTextureManager.js +15 -0
- package/FrameGraph/frameGraphTextureManager.js.map +1 -1
- package/FrameGraph/index.d.ts +2 -1
- package/FrameGraph/index.js +2 -1
- package/FrameGraph/index.js.map +1 -1
- package/Lights/Clustered/clusteredLightContainer.js +4 -3
- package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
- package/Lights/pointLight.js +6 -4
- package/Lights/pointLight.js.map +1 -1
- package/Lights/rectAreaLight.js +6 -4
- package/Lights/rectAreaLight.js.map +1 -1
- package/Lights/spotLight.js +3 -2
- package/Lights/spotLight.js.map +1 -1
- package/Materials/Background/backgroundMaterial.js +1 -1
- package/Materials/Background/backgroundMaterial.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +11 -0
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +74 -27
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +4 -0
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +6 -0
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.js +1 -1
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/PBR/openPbrMaterial.js +1 -1
- package/Materials/PBR/openPbrMaterial.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +1 -1
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/material.d.ts +7 -3
- package/Materials/material.js +11 -7
- package/Materials/material.js.map +1 -1
- package/Materials/standardMaterial.js +1 -1
- package/Materials/standardMaterial.js.map +1 -1
- package/Maths/math.vector.d.ts +1 -1
- package/Maths/math.vector.js +1 -1
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/Node/nodeGeometry.js +1 -1
- package/Meshes/Node/nodeGeometry.js.map +1 -1
- package/Meshes/mesh.js +9 -0
- package/Meshes/mesh.js.map +1 -1
- package/Morph/morphTargetManager.d.ts +2 -0
- package/Morph/morphTargetManager.js +19 -1
- package/Morph/morphTargetManager.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.d.ts +14 -6
- package/Particles/Node/nodeParticleSystemSet.js +38 -7
- package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.d.ts +21 -30
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +163 -256
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.d.ts +1 -3
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.d.ts +0 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +4 -22
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/thinSSAO2RenderingPipeline.d.ts +130 -0
- package/PostProcesses/RenderPipeline/Pipelines/thinSSAO2RenderingPipeline.js +193 -0
- package/PostProcesses/RenderPipeline/Pipelines/thinSSAO2RenderingPipeline.js.map +1 -0
- package/PostProcesses/thinSSAO2BlurPostProcess.d.ts +26 -0
- package/PostProcesses/thinSSAO2BlurPostProcess.js +81 -0
- package/PostProcesses/thinSSAO2BlurPostProcess.js.map +1 -0
- package/PostProcesses/thinSSAO2CombinePostProcess.d.ts +15 -0
- package/PostProcesses/thinSSAO2CombinePostProcess.js +48 -0
- package/PostProcesses/thinSSAO2CombinePostProcess.js.map +1 -0
- package/PostProcesses/thinSSAO2PostProcess.d.ts +45 -0
- package/PostProcesses/thinSSAO2PostProcess.js +208 -0
- package/PostProcesses/thinSSAO2PostProcess.js.map +1 -0
- package/PostProcesses/thinTAAPostProcess.d.ts +10 -5
- package/PostProcesses/thinTAAPostProcess.js +37 -7
- package/PostProcesses/thinTAAPostProcess.js.map +1 -1
- package/Rendering/boundingBoxRenderer.js +6 -1
- package/Rendering/boundingBoxRenderer.js.map +1 -1
- package/Rendering/edgesRenderer.js +4 -0
- package/Rendering/edgesRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/gaussianSplatting.js +10 -2
- package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/Shaders/ShadersInclude/shadowsFragmentFunctions.js +29 -4
- package/Shaders/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
- package/Shaders/gaussianSplattingDepth.fragment.d.ts +5 -0
- package/Shaders/gaussianSplattingDepth.fragment.js +11 -0
- package/Shaders/gaussianSplattingDepth.fragment.js.map +1 -0
- package/Shaders/gaussianSplattingDepth.vertex.d.ts +8 -0
- package/Shaders/gaussianSplattingDepth.vertex.js +17 -0
- package/Shaders/gaussianSplattingDepth.vertex.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +7 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingDepth.fragment.d.ts +6 -0
- package/ShadersWGSL/gaussianSplattingDepth.fragment.js +17 -0
- package/ShadersWGSL/gaussianSplattingDepth.fragment.js.map +1 -0
- package/ShadersWGSL/gaussianSplattingDepth.vertex.d.ts +8 -0
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js +19 -0
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -0
- package/package.json +1 -1
- package/scene.js +6 -5
- package/scene.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.d.ts +0 -48
- package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js +0 -119
- package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js.map +0 -1
- package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.d.ts +0 -24
- package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +0 -109
- package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +0 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
+
import { Engine } from "../Engines/engine.js";
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export class ThinSSAO2BlurPostProcess extends EffectWrapper {
|
|
7
|
+
_gatherImports(useWebGPU, list) {
|
|
8
|
+
if (useWebGPU) {
|
|
9
|
+
this._webGPUReady = true;
|
|
10
|
+
list.push(import("../ShadersWGSL/ssao2.fragment.js"));
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
list.push(import("../Shaders/ssao2.fragment.js"));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
constructor(name, engine = null, isHorizontal, options) {
|
|
17
|
+
super({
|
|
18
|
+
...options,
|
|
19
|
+
name,
|
|
20
|
+
engine: engine || Engine.LastCreatedEngine,
|
|
21
|
+
useShaderStore: true,
|
|
22
|
+
useAsPostProcess: true,
|
|
23
|
+
fragmentShader: ThinSSAO2BlurPostProcess.FragmentUrl,
|
|
24
|
+
uniforms: ThinSSAO2BlurPostProcess.Uniforms,
|
|
25
|
+
samplers: ThinSSAO2BlurPostProcess.Samplers,
|
|
26
|
+
defines: "#define BLUR\n" + (isHorizontal ? "#define BLUR_H\n" : ""),
|
|
27
|
+
});
|
|
28
|
+
this._bypassBlur = false;
|
|
29
|
+
this.textureSize = 0;
|
|
30
|
+
this.bilateralSamples = 16;
|
|
31
|
+
this.bilateralSoften = 0;
|
|
32
|
+
this.bilateralTolerance = 0;
|
|
33
|
+
this._expensiveBlur = true;
|
|
34
|
+
this._isHorizontal = isHorizontal;
|
|
35
|
+
const defines = this._getDefinesForBlur(this.expensiveBlur, this.bypassBlur);
|
|
36
|
+
const samplers = this._getSamplersForBlur(this.bypassBlur);
|
|
37
|
+
this.updateEffect(defines, null, samplers);
|
|
38
|
+
}
|
|
39
|
+
set bypassBlur(b) {
|
|
40
|
+
const defines = this._getDefinesForBlur(this.expensiveBlur, b);
|
|
41
|
+
const samplers = this._getSamplersForBlur(b);
|
|
42
|
+
this.updateEffect(defines, null, samplers);
|
|
43
|
+
this._bypassBlur = b;
|
|
44
|
+
}
|
|
45
|
+
get bypassBlur() {
|
|
46
|
+
return this._bypassBlur;
|
|
47
|
+
}
|
|
48
|
+
set expensiveBlur(b) {
|
|
49
|
+
const defines = this._getDefinesForBlur(b, this._bypassBlur);
|
|
50
|
+
this.updateEffect(defines);
|
|
51
|
+
this._expensiveBlur = b;
|
|
52
|
+
}
|
|
53
|
+
get expensiveBlur() {
|
|
54
|
+
return this._expensiveBlur;
|
|
55
|
+
}
|
|
56
|
+
bind(noDefaultBindings = false) {
|
|
57
|
+
super.bind(noDefaultBindings);
|
|
58
|
+
const effect = this._drawWrapper.effect;
|
|
59
|
+
effect.setFloat("outSize", this.textureSize);
|
|
60
|
+
effect.setInt("samples", this.bilateralSamples);
|
|
61
|
+
effect.setFloat("soften", this.bilateralSoften);
|
|
62
|
+
effect.setFloat("tolerance", this.bilateralTolerance);
|
|
63
|
+
}
|
|
64
|
+
_getSamplersForBlur(disabled) {
|
|
65
|
+
return disabled ? ["textureSampler"] : ["textureSampler", "depthSampler"];
|
|
66
|
+
}
|
|
67
|
+
_getDefinesForBlur(bilateral, disabled) {
|
|
68
|
+
let define = "#define BLUR\n";
|
|
69
|
+
if (disabled) {
|
|
70
|
+
define += "#define BLUR_BYPASS\n";
|
|
71
|
+
}
|
|
72
|
+
if (!bilateral) {
|
|
73
|
+
define += "#define BLUR_LEGACY\n";
|
|
74
|
+
}
|
|
75
|
+
return this._isHorizontal ? define + "#define BLUR_H\n" : define;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
ThinSSAO2BlurPostProcess.FragmentUrl = "ssao2";
|
|
79
|
+
ThinSSAO2BlurPostProcess.Uniforms = ["outSize", "samples", "soften", "tolerance"];
|
|
80
|
+
ThinSSAO2BlurPostProcess.Samplers = ["textureSampler", "depthSampler"];
|
|
81
|
+
//# sourceMappingURL=thinSSAO2BlurPostProcess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinSSAO2BlurPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinSSAO2BlurPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { Engine } from \"../Engines/engine\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinSSAO2BlurPostProcess extends EffectWrapper {\r\n public static readonly FragmentUrl = \"ssao2\";\r\n\r\n public static readonly Uniforms = [\"outSize\", \"samples\", \"soften\", \"tolerance\"];\r\n\r\n public static readonly Samplers = [\"textureSampler\", \"depthSampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/ssao2.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/ssao2.fragment\"));\r\n }\r\n }\r\n\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, isHorizontal: boolean, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || Engine.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinSSAO2BlurPostProcess.FragmentUrl,\r\n uniforms: ThinSSAO2BlurPostProcess.Uniforms,\r\n samplers: ThinSSAO2BlurPostProcess.Samplers,\r\n defines: \"#define BLUR\\n\" + (isHorizontal ? \"#define BLUR_H\\n\" : \"\"),\r\n });\r\n\r\n this._isHorizontal = isHorizontal;\r\n\r\n const defines = this._getDefinesForBlur(this.expensiveBlur, this.bypassBlur);\r\n const samplers = this._getSamplersForBlur(this.bypassBlur);\r\n\r\n this.updateEffect(defines, null, samplers);\r\n }\r\n\r\n private readonly _isHorizontal: boolean;\r\n private _bypassBlur: boolean = false;\r\n\r\n public textureSize: number = 0;\r\n\r\n public bilateralSamples: number = 16;\r\n\r\n public bilateralSoften: number = 0;\r\n\r\n public bilateralTolerance: number = 0;\r\n\r\n public set bypassBlur(b: boolean) {\r\n const defines = this._getDefinesForBlur(this.expensiveBlur, b);\r\n const samplers = this._getSamplersForBlur(b);\r\n\r\n this.updateEffect(defines, null, samplers);\r\n\r\n this._bypassBlur = b;\r\n }\r\n public get bypassBlur(): boolean {\r\n return this._bypassBlur;\r\n }\r\n\r\n private _expensiveBlur: boolean = true;\r\n\r\n public set expensiveBlur(b: boolean) {\r\n const defines = this._getDefinesForBlur(b, this._bypassBlur);\r\n\r\n this.updateEffect(defines);\r\n\r\n this._expensiveBlur = b;\r\n }\r\n public get expensiveBlur(): boolean {\r\n return this._expensiveBlur;\r\n }\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n effect.setFloat(\"outSize\", this.textureSize);\r\n effect.setInt(\"samples\", this.bilateralSamples);\r\n effect.setFloat(\"soften\", this.bilateralSoften);\r\n effect.setFloat(\"tolerance\", this.bilateralTolerance);\r\n }\r\n\r\n private _getSamplersForBlur(disabled: boolean): Array<string> {\r\n return disabled ? [\"textureSampler\"] : [\"textureSampler\", \"depthSampler\"];\r\n }\r\n\r\n private _getDefinesForBlur(bilateral: boolean, disabled: boolean): string {\r\n let define = \"#define BLUR\\n\";\r\n if (disabled) {\r\n define += \"#define BLUR_BYPASS\\n\";\r\n }\r\n if (!bilateral) {\r\n define += \"#define BLUR_LEGACY\\n\";\r\n }\r\n return this._isHorizontal ? define + \"#define BLUR_H\\n\" : define;\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Nullable, AbstractEngine, EffectWrapperCreationOptions, Camera } from "../index.js";
|
|
2
|
+
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare class ThinSSAO2CombinePostProcess extends EffectWrapper {
|
|
7
|
+
static readonly FragmentUrl = "ssaoCombine";
|
|
8
|
+
static readonly Uniforms: string[];
|
|
9
|
+
static readonly Samplers: string[];
|
|
10
|
+
protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
|
|
11
|
+
constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
|
|
12
|
+
camera: Nullable<Camera>;
|
|
13
|
+
useViewportInCombineStage: boolean;
|
|
14
|
+
bind(noDefaultBindings?: boolean): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
+
import { Engine } from "../Engines/engine.js";
|
|
3
|
+
import { TmpVectors } from "../Maths/math.vector.js";
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export class ThinSSAO2CombinePostProcess extends EffectWrapper {
|
|
8
|
+
_gatherImports(useWebGPU, list) {
|
|
9
|
+
if (useWebGPU) {
|
|
10
|
+
this._webGPUReady = true;
|
|
11
|
+
list.push(import("../ShadersWGSL/ssaoCombine.fragment.js"));
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
list.push(import("../Shaders/ssaoCombine.fragment.js"));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
constructor(name, engine = null, options) {
|
|
18
|
+
super({
|
|
19
|
+
...options,
|
|
20
|
+
name,
|
|
21
|
+
engine: engine || Engine.LastCreatedEngine,
|
|
22
|
+
useShaderStore: true,
|
|
23
|
+
useAsPostProcess: true,
|
|
24
|
+
fragmentShader: ThinSSAO2CombinePostProcess.FragmentUrl,
|
|
25
|
+
uniforms: ThinSSAO2CombinePostProcess.Uniforms,
|
|
26
|
+
samplers: ThinSSAO2CombinePostProcess.Samplers,
|
|
27
|
+
});
|
|
28
|
+
this.camera = null;
|
|
29
|
+
this.useViewportInCombineStage = true;
|
|
30
|
+
}
|
|
31
|
+
bind(noDefaultBindings = false) {
|
|
32
|
+
super.bind(noDefaultBindings);
|
|
33
|
+
const effect = this._drawWrapper.effect;
|
|
34
|
+
if (this.camera) {
|
|
35
|
+
const viewport = this.camera.viewport;
|
|
36
|
+
if (this.useViewportInCombineStage) {
|
|
37
|
+
effect.setVector4("viewport", TmpVectors.Vector4[0].copyFromFloats(viewport.x, viewport.y, viewport.width, viewport.height));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
effect.setVector4("viewport", TmpVectors.Vector4[0].copyFromFloats(0, 0, 1, 1));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
ThinSSAO2CombinePostProcess.FragmentUrl = "ssaoCombine";
|
|
46
|
+
ThinSSAO2CombinePostProcess.Uniforms = ["viewport"];
|
|
47
|
+
ThinSSAO2CombinePostProcess.Samplers = ["originalColor"];
|
|
48
|
+
//# sourceMappingURL=thinSSAO2CombinePostProcess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinSSAO2CombinePostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinSSAO2CombinePostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,gCAA+B;AAEpD;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,aAAa;IAOvC,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAED,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,iBAAkB;YAC3C,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,2BAA2B,CAAC,WAAW;YACvD,QAAQ,EAAE,2BAA2B,CAAC,QAAQ;YAC9C,QAAQ,EAAE,2BAA2B,CAAC,QAAQ;SACjD,CAAC,CAAC;QAGA,WAAM,GAAqB,IAAI,CAAC;QAEhC,8BAAyB,GAAG,IAAI,CAAC;IAJxC,CAAC;IAMe,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC;QAEzC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACtC,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACjC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACjI,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACpF,CAAC;QACL,CAAC;IACL,CAAC;;AA7CsB,uCAAW,GAAG,aAAa,AAAhB,CAAiB;AAE5B,oCAAQ,GAAG,CAAC,UAAU,CAAC,AAAf,CAAgB;AAExB,oCAAQ,GAAG,CAAC,eAAe,CAAC,AAApB,CAAqB","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions, Camera } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { TmpVectors } from \"core/Maths/math.vector\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinSSAO2CombinePostProcess extends EffectWrapper {\r\n public static readonly FragmentUrl = \"ssaoCombine\";\r\n\r\n public static readonly Uniforms = [\"viewport\"];\r\n\r\n public static readonly Samplers = [\"originalColor\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/ssaoCombine.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/ssaoCombine.fragment\"));\r\n }\r\n }\r\n\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || Engine.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinSSAO2CombinePostProcess.FragmentUrl,\r\n uniforms: ThinSSAO2CombinePostProcess.Uniforms,\r\n samplers: ThinSSAO2CombinePostProcess.Samplers,\r\n });\r\n }\r\n\r\n public camera: Nullable<Camera> = null;\r\n\r\n public useViewportInCombineStage = true;\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n if (this.camera) {\r\n const viewport = this.camera.viewport;\r\n if (this.useViewportInCombineStage) {\r\n effect.setVector4(\"viewport\", TmpVectors.Vector4[0].copyFromFloats(viewport.x, viewport.y, viewport.width, viewport.height));\r\n } else {\r\n effect.setVector4(\"viewport\", TmpVectors.Vector4[0].copyFromFloats(0, 0, 1, 1));\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Nullable, Scene, EffectWrapperCreationOptions } from "../index.js";
|
|
2
|
+
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
3
|
+
import { Camera } from "../Cameras/camera.js";
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export declare class ThinSSAO2PostProcess extends EffectWrapper {
|
|
8
|
+
private static readonly ORTHO_DEPTH_PROJECTION;
|
|
9
|
+
private static readonly PERSPECTIVE_DEPTH_PROJECTION;
|
|
10
|
+
static readonly FragmentUrl = "ssao2";
|
|
11
|
+
static readonly Uniforms: string[];
|
|
12
|
+
static readonly Samplers: string[];
|
|
13
|
+
protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
|
|
14
|
+
camera: Nullable<Camera>;
|
|
15
|
+
private _textureWidth;
|
|
16
|
+
get textureWidth(): number;
|
|
17
|
+
set textureWidth(width: number);
|
|
18
|
+
private _textureHeight;
|
|
19
|
+
get textureHeight(): number;
|
|
20
|
+
set textureHeight(height: number);
|
|
21
|
+
private _samples;
|
|
22
|
+
set samples(n: number);
|
|
23
|
+
get samples(): number;
|
|
24
|
+
totalStrength: number;
|
|
25
|
+
radius: number;
|
|
26
|
+
maxZ: number;
|
|
27
|
+
minZAspect: number;
|
|
28
|
+
base: number;
|
|
29
|
+
private _epsilon;
|
|
30
|
+
set epsilon(n: number);
|
|
31
|
+
get epsilon(): number;
|
|
32
|
+
private _scene;
|
|
33
|
+
private _randomTexture;
|
|
34
|
+
private _sampleSphere;
|
|
35
|
+
constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions);
|
|
36
|
+
bind(noDefaultBindings?: boolean): void;
|
|
37
|
+
dispose(): void;
|
|
38
|
+
private _createRandomTexture;
|
|
39
|
+
private _bits;
|
|
40
|
+
private _radicalInverseVdC;
|
|
41
|
+
private _hammersley;
|
|
42
|
+
private _hemisphereSampleUniform;
|
|
43
|
+
private _generateHemisphere;
|
|
44
|
+
private _getDefinesForSSAO;
|
|
45
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
|
|
2
|
+
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
3
|
+
import { Vector2, Vector3 } from "../Maths/math.vector.js";
|
|
4
|
+
import { Camera } from "../Cameras/camera.js";
|
|
5
|
+
import { RawTexture } from "../Materials/Textures/rawTexture.js";
|
|
6
|
+
import { RandomRange } from "../Maths/math.scalar.functions.js";
|
|
7
|
+
import { Texture } from "../Materials/Textures/texture.js";
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export class ThinSSAO2PostProcess extends EffectWrapper {
|
|
12
|
+
_gatherImports(useWebGPU, list) {
|
|
13
|
+
if (useWebGPU) {
|
|
14
|
+
this._webGPUReady = true;
|
|
15
|
+
list.push(import("../ShadersWGSL/ssao2.fragment.js"));
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
list.push(import("../Shaders/ssao2.fragment.js"));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
get textureWidth() {
|
|
22
|
+
return this._textureWidth;
|
|
23
|
+
}
|
|
24
|
+
set textureWidth(width) {
|
|
25
|
+
if (this._textureWidth === width) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this._textureWidth = width;
|
|
29
|
+
}
|
|
30
|
+
get textureHeight() {
|
|
31
|
+
return this._textureHeight;
|
|
32
|
+
}
|
|
33
|
+
set textureHeight(height) {
|
|
34
|
+
if (this._textureHeight === height) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
this._textureHeight = height;
|
|
38
|
+
}
|
|
39
|
+
set samples(n) {
|
|
40
|
+
this._samples = n;
|
|
41
|
+
this.updateEffect(this._getDefinesForSSAO());
|
|
42
|
+
this._sampleSphere = this._generateHemisphere();
|
|
43
|
+
}
|
|
44
|
+
get samples() {
|
|
45
|
+
return this._samples;
|
|
46
|
+
}
|
|
47
|
+
set epsilon(n) {
|
|
48
|
+
this._epsilon = n;
|
|
49
|
+
this.updateEffect(this._getDefinesForSSAO());
|
|
50
|
+
}
|
|
51
|
+
get epsilon() {
|
|
52
|
+
return this._epsilon;
|
|
53
|
+
}
|
|
54
|
+
constructor(name, scene, options) {
|
|
55
|
+
super({
|
|
56
|
+
...options,
|
|
57
|
+
name,
|
|
58
|
+
engine: scene.getEngine(),
|
|
59
|
+
useShaderStore: true,
|
|
60
|
+
useAsPostProcess: true,
|
|
61
|
+
fragmentShader: ThinSSAO2PostProcess.FragmentUrl,
|
|
62
|
+
uniforms: ThinSSAO2PostProcess.Uniforms,
|
|
63
|
+
samplers: ThinSSAO2PostProcess.Samplers,
|
|
64
|
+
defines: `#define SSAO\n#define SAMPLES 8\n#define EPSILON 0.0001`,
|
|
65
|
+
shaderLanguage: scene.getEngine().isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
|
|
66
|
+
});
|
|
67
|
+
this.camera = null;
|
|
68
|
+
this._textureWidth = 0;
|
|
69
|
+
this._textureHeight = 0;
|
|
70
|
+
this._samples = 8;
|
|
71
|
+
this.totalStrength = 1.0;
|
|
72
|
+
this.radius = 2.0;
|
|
73
|
+
this.maxZ = 100.0;
|
|
74
|
+
this.minZAspect = 0.2;
|
|
75
|
+
this.base = 0;
|
|
76
|
+
this._epsilon = 0.02;
|
|
77
|
+
this._bits = new Uint32Array(1);
|
|
78
|
+
this._scene = scene;
|
|
79
|
+
this._createRandomTexture();
|
|
80
|
+
this.updateEffect(this._getDefinesForSSAO());
|
|
81
|
+
this._sampleSphere = this._generateHemisphere();
|
|
82
|
+
}
|
|
83
|
+
bind(noDefaultBindings = false) {
|
|
84
|
+
super.bind(noDefaultBindings);
|
|
85
|
+
const effect = this._drawWrapper.effect;
|
|
86
|
+
const camera = this.camera;
|
|
87
|
+
if (!camera) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const projectionMatrix = camera.getProjectionMatrix();
|
|
91
|
+
effect.setArray3("sampleSphere", this._sampleSphere);
|
|
92
|
+
effect.setFloat("randTextureTiles", 32.0);
|
|
93
|
+
effect.setFloat("samplesFactor", 1 / this.samples);
|
|
94
|
+
effect.setFloat("totalStrength", this.totalStrength);
|
|
95
|
+
effect.setFloat2("texelSize", 1 / this.textureWidth, 1 / this.textureHeight);
|
|
96
|
+
effect.setFloat("radius", this.radius);
|
|
97
|
+
effect.setFloat("maxZ", this.maxZ);
|
|
98
|
+
effect.setFloat("minZAspect", this.minZAspect);
|
|
99
|
+
effect.setFloat("base", this.base);
|
|
100
|
+
effect.setFloat("near", camera.minZ);
|
|
101
|
+
if (camera.mode === Camera.PERSPECTIVE_CAMERA) {
|
|
102
|
+
effect.setMatrix3x3("depthProjection", ThinSSAO2PostProcess.PERSPECTIVE_DEPTH_PROJECTION);
|
|
103
|
+
effect.setFloat("xViewport", Math.tan(camera.fov / 2) * this._scene.getEngine().getAspectRatio(camera, true));
|
|
104
|
+
effect.setFloat("yViewport", Math.tan(camera.fov / 2));
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const halfWidth = this._scene.getEngine().getRenderWidth() / 2.0;
|
|
108
|
+
const halfHeight = this._scene.getEngine().getRenderHeight() / 2.0;
|
|
109
|
+
const orthoLeft = camera.orthoLeft ?? -halfWidth;
|
|
110
|
+
const orthoRight = camera.orthoRight ?? halfWidth;
|
|
111
|
+
const orthoBottom = camera.orthoBottom ?? -halfHeight;
|
|
112
|
+
const orthoTop = camera.orthoTop ?? halfHeight;
|
|
113
|
+
effect.setMatrix3x3("depthProjection", ThinSSAO2PostProcess.ORTHO_DEPTH_PROJECTION);
|
|
114
|
+
effect.setFloat4("viewport", orthoLeft, orthoRight, orthoBottom, orthoTop);
|
|
115
|
+
}
|
|
116
|
+
effect.setMatrix("projection", projectionMatrix);
|
|
117
|
+
effect.setTexture("randomSampler", this._randomTexture);
|
|
118
|
+
}
|
|
119
|
+
dispose() {
|
|
120
|
+
this._randomTexture.dispose();
|
|
121
|
+
super.dispose();
|
|
122
|
+
}
|
|
123
|
+
_createRandomTexture() {
|
|
124
|
+
const size = 128;
|
|
125
|
+
const data = new Uint8Array(size * size * 4);
|
|
126
|
+
const randVector = Vector2.Zero();
|
|
127
|
+
for (let index = 0; index < data.length;) {
|
|
128
|
+
randVector.set(RandomRange(0, 1), RandomRange(0, 1)).normalize().scaleInPlace(255);
|
|
129
|
+
data[index++] = Math.floor(randVector.x);
|
|
130
|
+
data[index++] = Math.floor(randVector.y);
|
|
131
|
+
data[index++] = 0;
|
|
132
|
+
data[index++] = 255;
|
|
133
|
+
}
|
|
134
|
+
const texture = RawTexture.CreateRGBATexture(data, size, size, this._scene, false, false, 2);
|
|
135
|
+
texture.name = "SSAORandomTexture";
|
|
136
|
+
texture.wrapU = Texture.WRAP_ADDRESSMODE;
|
|
137
|
+
texture.wrapV = Texture.WRAP_ADDRESSMODE;
|
|
138
|
+
this._randomTexture = texture;
|
|
139
|
+
}
|
|
140
|
+
//Van der Corput radical inverse
|
|
141
|
+
_radicalInverseVdC(i) {
|
|
142
|
+
this._bits[0] = i;
|
|
143
|
+
this._bits[0] = ((this._bits[0] << 16) | (this._bits[0] >> 16)) >>> 0;
|
|
144
|
+
this._bits[0] = ((this._bits[0] & 0x55555555) << 1) | (((this._bits[0] & 0xaaaaaaaa) >>> 1) >>> 0);
|
|
145
|
+
this._bits[0] = ((this._bits[0] & 0x33333333) << 2) | (((this._bits[0] & 0xcccccccc) >>> 2) >>> 0);
|
|
146
|
+
this._bits[0] = ((this._bits[0] & 0x0f0f0f0f) << 4) | (((this._bits[0] & 0xf0f0f0f0) >>> 4) >>> 0);
|
|
147
|
+
this._bits[0] = ((this._bits[0] & 0x00ff00ff) << 8) | (((this._bits[0] & 0xff00ff00) >>> 8) >>> 0);
|
|
148
|
+
return this._bits[0] * 2.3283064365386963e-10; // / 0x100000000 or / 4294967296
|
|
149
|
+
}
|
|
150
|
+
_hammersley(i, n) {
|
|
151
|
+
return [i / n, this._radicalInverseVdC(i)];
|
|
152
|
+
}
|
|
153
|
+
_hemisphereSampleUniform(u, v) {
|
|
154
|
+
const phi = v * 2.0 * Math.PI;
|
|
155
|
+
// rejecting samples that are close to tangent plane to avoid z-fighting artifacts
|
|
156
|
+
const cosTheta = 1.0 - u * 0.85;
|
|
157
|
+
const sinTheta = Math.sqrt(1.0 - cosTheta * cosTheta);
|
|
158
|
+
return new Vector3(Math.cos(phi) * sinTheta, Math.sin(phi) * sinTheta, cosTheta);
|
|
159
|
+
}
|
|
160
|
+
_generateHemisphere() {
|
|
161
|
+
const numSamples = this.samples;
|
|
162
|
+
const result = [];
|
|
163
|
+
let vector;
|
|
164
|
+
let i = 0;
|
|
165
|
+
while (i < numSamples) {
|
|
166
|
+
if (numSamples < 16) {
|
|
167
|
+
vector = this._hemisphereSampleUniform(Math.random(), Math.random());
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
const rand = this._hammersley(i, numSamples);
|
|
171
|
+
vector = this._hemisphereSampleUniform(rand[0], rand[1]);
|
|
172
|
+
}
|
|
173
|
+
result.push(vector.x, vector.y, vector.z);
|
|
174
|
+
i++;
|
|
175
|
+
}
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
_getDefinesForSSAO() {
|
|
179
|
+
let defines = `#define SSAO\n#define SAMPLES ${this.samples}\n#define EPSILON ${this.epsilon.toFixed(4)}`;
|
|
180
|
+
if (this.camera?.mode === Camera.ORTHOGRAPHIC_CAMERA) {
|
|
181
|
+
defines += `\n#define ORTHOGRAPHIC_CAMERA`;
|
|
182
|
+
}
|
|
183
|
+
return defines;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
ThinSSAO2PostProcess.ORTHO_DEPTH_PROJECTION = [1, 0, 0, 0, 1, 0, 0, 0, 1];
|
|
187
|
+
ThinSSAO2PostProcess.PERSPECTIVE_DEPTH_PROJECTION = [0, 0, 0, 0, 0, 0, 1, 1, 1];
|
|
188
|
+
ThinSSAO2PostProcess.FragmentUrl = "ssao2";
|
|
189
|
+
ThinSSAO2PostProcess.Uniforms = [
|
|
190
|
+
"sampleSphere",
|
|
191
|
+
"samplesFactor",
|
|
192
|
+
"randTextureTiles",
|
|
193
|
+
"totalStrength",
|
|
194
|
+
"radius",
|
|
195
|
+
"base",
|
|
196
|
+
"range",
|
|
197
|
+
"projection",
|
|
198
|
+
"near",
|
|
199
|
+
"texelSize",
|
|
200
|
+
"xViewport",
|
|
201
|
+
"yViewport",
|
|
202
|
+
"viewport",
|
|
203
|
+
"maxZ",
|
|
204
|
+
"minZAspect",
|
|
205
|
+
"depthProjection",
|
|
206
|
+
];
|
|
207
|
+
ThinSSAO2PostProcess.Samplers = ["randomSampler", "depthSampler", "normalSampler"];
|
|
208
|
+
//# sourceMappingURL=thinSSAO2PostProcess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinSSAO2PostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinSSAO2PostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, Scene, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { RandomRange } from \"core/Maths/math.scalar.functions\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinSSAO2PostProcess extends EffectWrapper {\r\n private static readonly ORTHO_DEPTH_PROJECTION = [1, 0, 0, 0, 1, 0, 0, 0, 1];\r\n\r\n private static readonly PERSPECTIVE_DEPTH_PROJECTION = [0, 0, 0, 0, 0, 0, 1, 1, 1];\r\n\r\n public static readonly FragmentUrl = \"ssao2\";\r\n\r\n public static readonly Uniforms = [\r\n \"sampleSphere\",\r\n \"samplesFactor\",\r\n \"randTextureTiles\",\r\n \"totalStrength\",\r\n \"radius\",\r\n \"base\",\r\n \"range\",\r\n \"projection\",\r\n \"near\",\r\n \"texelSize\",\r\n \"xViewport\",\r\n \"yViewport\",\r\n \"viewport\",\r\n \"maxZ\",\r\n \"minZAspect\",\r\n \"depthProjection\",\r\n ];\r\n\r\n public static readonly Samplers = [\"randomSampler\", \"depthSampler\", \"normalSampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/ssao2.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/ssao2.fragment\"));\r\n }\r\n }\r\n\r\n public camera: Nullable<Camera> = null;\r\n\r\n private _textureWidth = 0;\r\n\r\n public get textureWidth() {\r\n return this._textureWidth;\r\n }\r\n\r\n public set textureWidth(width: number) {\r\n if (this._textureWidth === width) {\r\n return;\r\n }\r\n this._textureWidth = width;\r\n }\r\n\r\n private _textureHeight = 0;\r\n\r\n public get textureHeight() {\r\n return this._textureHeight;\r\n }\r\n\r\n public set textureHeight(height: number) {\r\n if (this._textureHeight === height) {\r\n return;\r\n }\r\n this._textureHeight = height;\r\n }\r\n\r\n private _samples: number = 8;\r\n\r\n public set samples(n: number) {\r\n this._samples = n;\r\n this.updateEffect(this._getDefinesForSSAO());\r\n this._sampleSphere = this._generateHemisphere();\r\n }\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n public totalStrength: number = 1.0;\r\n\r\n public radius: number = 2.0;\r\n\r\n public maxZ: number = 100.0;\r\n\r\n public minZAspect: number = 0.2;\r\n\r\n public base: number = 0;\r\n\r\n private _epsilon: number = 0.02;\r\n\r\n public set epsilon(n: number) {\r\n this._epsilon = n;\r\n this.updateEffect(this._getDefinesForSSAO());\r\n }\r\n public get epsilon(): number {\r\n return this._epsilon;\r\n }\r\n\r\n private _scene: Scene;\r\n private _randomTexture: Texture;\r\n private _sampleSphere: number[];\r\n\r\n constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: scene.getEngine(),\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinSSAO2PostProcess.FragmentUrl,\r\n uniforms: ThinSSAO2PostProcess.Uniforms,\r\n samplers: ThinSSAO2PostProcess.Samplers,\r\n defines: `#define SSAO\\n#define SAMPLES 8\\n#define EPSILON 0.0001`,\r\n shaderLanguage: scene.getEngine().isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n });\r\n\r\n this._scene = scene;\r\n\r\n this._createRandomTexture();\r\n\r\n this.updateEffect(this._getDefinesForSSAO());\r\n this._sampleSphere = this._generateHemisphere();\r\n }\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n const camera = this.camera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n const projectionMatrix = camera.getProjectionMatrix();\r\n\r\n effect.setArray3(\"sampleSphere\", this._sampleSphere);\r\n effect.setFloat(\"randTextureTiles\", 32.0);\r\n effect.setFloat(\"samplesFactor\", 1 / this.samples);\r\n effect.setFloat(\"totalStrength\", this.totalStrength);\r\n effect.setFloat2(\"texelSize\", 1 / this.textureWidth, 1 / this.textureHeight);\r\n effect.setFloat(\"radius\", this.radius);\r\n effect.setFloat(\"maxZ\", this.maxZ);\r\n effect.setFloat(\"minZAspect\", this.minZAspect);\r\n effect.setFloat(\"base\", this.base);\r\n effect.setFloat(\"near\", camera.minZ);\r\n if (camera.mode === Camera.PERSPECTIVE_CAMERA) {\r\n effect.setMatrix3x3(\"depthProjection\", ThinSSAO2PostProcess.PERSPECTIVE_DEPTH_PROJECTION);\r\n effect.setFloat(\"xViewport\", Math.tan(camera.fov / 2) * this._scene.getEngine().getAspectRatio(camera, true));\r\n effect.setFloat(\"yViewport\", Math.tan(camera.fov / 2));\r\n } else {\r\n const halfWidth = this._scene.getEngine().getRenderWidth() / 2.0;\r\n const halfHeight = this._scene.getEngine().getRenderHeight() / 2.0;\r\n const orthoLeft = camera.orthoLeft ?? -halfWidth;\r\n const orthoRight = camera.orthoRight ?? halfWidth;\r\n const orthoBottom = camera.orthoBottom ?? -halfHeight;\r\n const orthoTop = camera.orthoTop ?? halfHeight;\r\n effect.setMatrix3x3(\"depthProjection\", ThinSSAO2PostProcess.ORTHO_DEPTH_PROJECTION);\r\n effect.setFloat4(\"viewport\", orthoLeft, orthoRight, orthoBottom, orthoTop);\r\n }\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n\r\n effect.setTexture(\"randomSampler\", this._randomTexture);\r\n }\r\n\r\n public override dispose() {\r\n this._randomTexture.dispose();\r\n\r\n super.dispose();\r\n }\r\n\r\n private _createRandomTexture(): void {\r\n const size = 128;\r\n\r\n const data = new Uint8Array(size * size * 4);\r\n const randVector = Vector2.Zero();\r\n for (let index = 0; index < data.length; ) {\r\n randVector.set(RandomRange(0, 1), RandomRange(0, 1)).normalize().scaleInPlace(255);\r\n data[index++] = Math.floor(randVector.x);\r\n data[index++] = Math.floor(randVector.y);\r\n data[index++] = 0;\r\n data[index++] = 255;\r\n }\r\n\r\n const texture = RawTexture.CreateRGBATexture(data, size, size, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE);\r\n texture.name = \"SSAORandomTexture\";\r\n texture.wrapU = Texture.WRAP_ADDRESSMODE;\r\n texture.wrapV = Texture.WRAP_ADDRESSMODE;\r\n this._randomTexture = texture;\r\n }\r\n\r\n private _bits = new Uint32Array(1);\r\n\r\n //Van der Corput radical inverse\r\n private _radicalInverseVdC(i: number) {\r\n this._bits[0] = i;\r\n this._bits[0] = ((this._bits[0] << 16) | (this._bits[0] >> 16)) >>> 0;\r\n this._bits[0] = ((this._bits[0] & 0x55555555) << 1) | (((this._bits[0] & 0xaaaaaaaa) >>> 1) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x33333333) << 2) | (((this._bits[0] & 0xcccccccc) >>> 2) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x0f0f0f0f) << 4) | (((this._bits[0] & 0xf0f0f0f0) >>> 4) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x00ff00ff) << 8) | (((this._bits[0] & 0xff00ff00) >>> 8) >>> 0);\r\n return this._bits[0] * 2.3283064365386963e-10; // / 0x100000000 or / 4294967296\r\n }\r\n\r\n private _hammersley(i: number, n: number) {\r\n return [i / n, this._radicalInverseVdC(i)];\r\n }\r\n\r\n private _hemisphereSampleUniform(u: number, v: number): Vector3 {\r\n const phi = v * 2.0 * Math.PI;\r\n // rejecting samples that are close to tangent plane to avoid z-fighting artifacts\r\n const cosTheta = 1.0 - u * 0.85;\r\n const sinTheta = Math.sqrt(1.0 - cosTheta * cosTheta);\r\n return new Vector3(Math.cos(phi) * sinTheta, Math.sin(phi) * sinTheta, cosTheta);\r\n }\r\n\r\n private _generateHemisphere(): number[] {\r\n const numSamples = this.samples;\r\n const result = [];\r\n let vector;\r\n\r\n let i = 0;\r\n while (i < numSamples) {\r\n if (numSamples < 16) {\r\n vector = this._hemisphereSampleUniform(Math.random(), Math.random());\r\n } else {\r\n const rand = this._hammersley(i, numSamples);\r\n vector = this._hemisphereSampleUniform(rand[0], rand[1]);\r\n }\r\n\r\n result.push(vector.x, vector.y, vector.z);\r\n i++;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getDefinesForSSAO() {\r\n let defines = `#define SSAO\\n#define SAMPLES ${this.samples}\\n#define EPSILON ${this.epsilon.toFixed(4)}`;\r\n\r\n if (this.camera?.mode === Camera.ORTHOGRAPHIC_CAMERA) {\r\n defines += `\\n#define ORTHOGRAPHIC_CAMERA`;\r\n }\r\n\r\n return defines;\r\n }\r\n}\r\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Nullable,
|
|
1
|
+
import type { Nullable, EffectWrapperCreationOptions, Scene } from "../index.js";
|
|
2
2
|
import { Camera } from "../Cameras/camera.js";
|
|
3
3
|
import { Vector2 } from "../Maths/math.vector.js";
|
|
4
4
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
@@ -71,19 +71,24 @@ export declare class ThinTAAPostProcess extends EffectWrapper {
|
|
|
71
71
|
*/
|
|
72
72
|
get clampHistory(): boolean;
|
|
73
73
|
set clampHistory(clamp: boolean);
|
|
74
|
+
private _scene;
|
|
74
75
|
private _hs;
|
|
75
76
|
private _firstUpdate;
|
|
77
|
+
private _taaMaterialManager;
|
|
76
78
|
/**
|
|
77
79
|
* Constructs a new TAA post process
|
|
78
80
|
* @param name Name of the effect
|
|
79
|
-
* @param
|
|
81
|
+
* @param scene The scene the post process belongs to
|
|
80
82
|
* @param options Options to configure the effect
|
|
81
83
|
*/
|
|
82
|
-
constructor(name: string,
|
|
84
|
+
constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions);
|
|
83
85
|
/** @internal */
|
|
84
86
|
_reset(): void;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
/** @internal */
|
|
88
|
+
_updateJitter(): void;
|
|
89
|
+
protected _nextJitterOffset(output?: Vector2): Vector2;
|
|
90
|
+
protected _updateProjectionMatrix(): void;
|
|
87
91
|
bind(noDefaultBindings?: boolean): void;
|
|
92
|
+
dispose(): void;
|
|
88
93
|
private _updateEffect;
|
|
89
94
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Camera } from "../Cameras/camera.js";
|
|
2
2
|
import { Halton2DSequence } from "../Maths/halton2DSequence.js";
|
|
3
3
|
import { Vector2 } from "../Maths/math.vector.js";
|
|
4
|
-
import { Engine } from "../Engines/engine.js";
|
|
5
4
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
5
|
+
import { TAAMaterialManager } from "./RenderPipeline/Pipelines/taaMaterialManager.js";
|
|
6
6
|
/**
|
|
7
7
|
* Simple implementation of Temporal Anti-Aliasing (TAA).
|
|
8
8
|
* This can be used to improve image quality for still pictures (screenshots for e.g.).
|
|
@@ -41,6 +41,9 @@ export class ThinTAAPostProcess extends EffectWrapper {
|
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
this._disabled = value;
|
|
44
|
+
if (this._taaMaterialManager) {
|
|
45
|
+
this._taaMaterialManager.isEnabled = !value && this.reprojectHistory;
|
|
46
|
+
}
|
|
44
47
|
this._reset();
|
|
45
48
|
}
|
|
46
49
|
/**
|
|
@@ -81,6 +84,16 @@ export class ThinTAAPostProcess extends EffectWrapper {
|
|
|
81
84
|
return;
|
|
82
85
|
}
|
|
83
86
|
this._reprojectHistory = reproject;
|
|
87
|
+
if (reproject) {
|
|
88
|
+
if (!this._taaMaterialManager) {
|
|
89
|
+
this._taaMaterialManager = new TAAMaterialManager(this._scene);
|
|
90
|
+
}
|
|
91
|
+
// The velocity buffer may be old so reset for one frame
|
|
92
|
+
this._reset();
|
|
93
|
+
}
|
|
94
|
+
if (this._taaMaterialManager) {
|
|
95
|
+
this._taaMaterialManager.isEnabled = reproject && !this._disabled;
|
|
96
|
+
}
|
|
84
97
|
this._updateEffect();
|
|
85
98
|
}
|
|
86
99
|
/**
|
|
@@ -100,14 +113,14 @@ export class ThinTAAPostProcess extends EffectWrapper {
|
|
|
100
113
|
/**
|
|
101
114
|
* Constructs a new TAA post process
|
|
102
115
|
* @param name Name of the effect
|
|
103
|
-
* @param
|
|
116
|
+
* @param scene The scene the post process belongs to
|
|
104
117
|
* @param options Options to configure the effect
|
|
105
118
|
*/
|
|
106
|
-
constructor(name,
|
|
119
|
+
constructor(name, scene, options) {
|
|
107
120
|
super({
|
|
108
121
|
...options,
|
|
109
122
|
name,
|
|
110
|
-
engine:
|
|
123
|
+
engine: scene.getEngine(),
|
|
111
124
|
useShaderStore: true,
|
|
112
125
|
useAsPostProcess: true,
|
|
113
126
|
fragmentShader: ThinTAAPostProcess.FragmentUrl,
|
|
@@ -130,6 +143,7 @@ export class ThinTAAPostProcess extends EffectWrapper {
|
|
|
130
143
|
this._reprojectHistory = false;
|
|
131
144
|
this._clampHistory = false;
|
|
132
145
|
this._firstUpdate = true;
|
|
146
|
+
this._scene = scene;
|
|
133
147
|
this._hs = new Halton2DSequence(this.samples);
|
|
134
148
|
}
|
|
135
149
|
/** @internal */
|
|
@@ -138,14 +152,26 @@ export class ThinTAAPostProcess extends EffectWrapper {
|
|
|
138
152
|
this._hs.next();
|
|
139
153
|
this._firstUpdate = true;
|
|
140
154
|
}
|
|
141
|
-
|
|
142
|
-
|
|
155
|
+
/** @internal */
|
|
156
|
+
_updateJitter() {
|
|
157
|
+
if (this.reprojectHistory && this._taaMaterialManager) {
|
|
158
|
+
// Applying jitter to the projection matrix messes with the velocity buffer,
|
|
159
|
+
// so we do it as a final vertex step in a material plugin instead
|
|
160
|
+
this._nextJitterOffset(this._taaMaterialManager.jitter);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// Use the projection matrix by default since it supports most materials
|
|
164
|
+
this._updateProjectionMatrix();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
_nextJitterOffset(output = new Vector2()) {
|
|
168
|
+
if (!this.camera || !this.camera.hasMoved || !this.disableOnCameraMove) {
|
|
143
169
|
this._hs.next();
|
|
144
170
|
}
|
|
145
171
|
output.set(this._hs.x, this._hs.y);
|
|
146
172
|
return output;
|
|
147
173
|
}
|
|
148
|
-
|
|
174
|
+
_updateProjectionMatrix() {
|
|
149
175
|
if (this.disabled) {
|
|
150
176
|
return;
|
|
151
177
|
}
|
|
@@ -171,6 +197,10 @@ export class ThinTAAPostProcess extends EffectWrapper {
|
|
|
171
197
|
effect.setFloat("factor", (this.camera?.hasMoved && this.disableOnCameraMove) || this._firstUpdate ? 1 : this.factor);
|
|
172
198
|
this._firstUpdate = false;
|
|
173
199
|
}
|
|
200
|
+
dispose() {
|
|
201
|
+
this._taaMaterialManager?.dispose();
|
|
202
|
+
super.dispose();
|
|
203
|
+
}
|
|
174
204
|
_updateEffect() {
|
|
175
205
|
const defines = [];
|
|
176
206
|
// There seems to be an issue where `updateEffect` sometimes doesn't include the initial samplers
|