@babylonjs/core 8.39.1 → 8.39.2
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/Cameras/arcRotateCamera.js +4 -5
- package/Cameras/arcRotateCamera.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/FrameGraph/Node/Blocks/lightingVolumeBlock.d.ts +0 -3
- package/FrameGraph/Node/Blocks/lightingVolumeBlock.js +0 -13
- package/FrameGraph/Node/Blocks/lightingVolumeBlock.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js +2 -35
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js.map +1 -1
- package/Lights/lightingVolume.d.ts +3 -6
- package/Lights/lightingVolume.js +30 -28
- package/Lights/lightingVolume.js.map +1 -1
- package/package.json +1 -1
|
@@ -23,9 +23,6 @@ export declare class NodeRenderGraphLightingVolumeBlock extends NodeRenderGraphB
|
|
|
23
23
|
/** Gets or sets the refresh frequency parameter */
|
|
24
24
|
get frequency(): number;
|
|
25
25
|
set frequency(value: number);
|
|
26
|
-
/** Indicates whether to build the full volume (true) or only the far plane (false). Default is false. */
|
|
27
|
-
get buildFullVolume(): boolean;
|
|
28
|
-
set buildFullVolume(value: boolean);
|
|
29
26
|
/**
|
|
30
27
|
* Gets the current class name
|
|
31
28
|
* @returns the class name
|
|
@@ -41,13 +41,6 @@ export class NodeRenderGraphLightingVolumeBlock extends NodeRenderGraphBlock {
|
|
|
41
41
|
set frequency(value) {
|
|
42
42
|
this._frameGraphTask.lightingVolume.frequency = value;
|
|
43
43
|
}
|
|
44
|
-
/** Indicates whether to build the full volume (true) or only the far plane (false). Default is false. */
|
|
45
|
-
get buildFullVolume() {
|
|
46
|
-
return this._frameGraphTask.lightingVolume.buildFullVolume;
|
|
47
|
-
}
|
|
48
|
-
set buildFullVolume(value) {
|
|
49
|
-
this._frameGraphTask.lightingVolume.buildFullVolume = value;
|
|
50
|
-
}
|
|
51
44
|
/**
|
|
52
45
|
* Gets the current class name
|
|
53
46
|
* @returns the class name
|
|
@@ -76,21 +69,18 @@ export class NodeRenderGraphLightingVolumeBlock extends NodeRenderGraphBlock {
|
|
|
76
69
|
const codes = [];
|
|
77
70
|
codes.push(`${this._codeVariableName}.tesselation = ${this.tesselation};`);
|
|
78
71
|
codes.push(`${this._codeVariableName}.frequency = ${this.frequency};`);
|
|
79
|
-
codes.push(`${this._codeVariableName}.buildFullVolume = ${this.buildFullVolume};`);
|
|
80
72
|
return super._dumpPropertiesCode() + codes.join("\n");
|
|
81
73
|
}
|
|
82
74
|
serialize() {
|
|
83
75
|
const serializationObject = super.serialize();
|
|
84
76
|
serializationObject.tesselation = this.tesselation;
|
|
85
77
|
serializationObject.frequency = this.frequency;
|
|
86
|
-
serializationObject.buildFullVolume = this.buildFullVolume;
|
|
87
78
|
return serializationObject;
|
|
88
79
|
}
|
|
89
80
|
_deserialize(serializationObject) {
|
|
90
81
|
super._deserialize(serializationObject);
|
|
91
82
|
this.tesselation = serializationObject.tesselation;
|
|
92
83
|
this.frequency = serializationObject.frequency;
|
|
93
|
-
this.buildFullVolume = !!serializationObject.buildFullVolume;
|
|
94
84
|
}
|
|
95
85
|
}
|
|
96
86
|
__decorate([
|
|
@@ -99,8 +89,5 @@ __decorate([
|
|
|
99
89
|
__decorate([
|
|
100
90
|
editableInPropertyPage("Refresh frequency", 2 /* PropertyTypeForEdition.Int */, "PROPERTIES")
|
|
101
91
|
], NodeRenderGraphLightingVolumeBlock.prototype, "frequency", null);
|
|
102
|
-
__decorate([
|
|
103
|
-
editableInPropertyPage("Build full volume", 0 /* PropertyTypeForEdition.Boolean */, "PROPERTIES")
|
|
104
|
-
], NodeRenderGraphLightingVolumeBlock.prototype, "buildFullVolume", null);
|
|
105
92
|
RegisterClass("BABYLON.NodeRenderGraphLightingVolumeBlock", NodeRenderGraphLightingVolumeBlock);
|
|
106
93
|
//# sourceMappingURL=lightingVolumeBlock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lightingVolumeBlock.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Node/Blocks/lightingVolumeBlock.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,4BAA4B,EAAE,+CAAsD;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAA0B,MAAM,mCAAmC,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,wCAAwC,EAAE,MAAM,+BAA+B,CAAC;AAEzF;;GAEG;AACH,MAAM,OAAO,kCAAmC,SAAQ,oBAAoB;IAGxE;;OAEG;IACH,IAAoB,IAAI;QACpB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED;;;;;OAKG;IACH,YAAmB,IAAY,EAAE,UAAsB,EAAE,KAAY;QACjE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAE/B,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,wCAAwC,CAAC,eAAe,CAAC,CAAC;QAEhG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,wCAAwC,CAAC,UAAU,CAAC,CAAC;QAEnF,IAAI,CAAC,eAAe,GAAG,IAAI,4BAA4B,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;IAED,6CAA6C;IAE7C,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,WAAW,CAAC;IAC3D,CAAC;IAED,IAAW,WAAW,CAAC,KAAa;QAChC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,WAAW,GAAG,KAAK,CAAC;IAC5D,CAAC;IAED,mDAAmD;IAEnD,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,SAAS,CAAC;IACzD,CAAC;IAED,IAAW,SAAS,CAAC,KAAa;QAC9B,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,SAAS,GAAG,KAAK,CAAC;IAC1D,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"lightingVolumeBlock.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Node/Blocks/lightingVolumeBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraph, FrameGraphShadowGeneratorTask, NodeRenderGraphBuildState, NodeRenderGraphConnectionPoint, Scene } from \"core/index\";\r\nimport { FrameGraphLightingVolumeTask } from \"core/FrameGraph/Tasks/Misc/lightingVolumeTask\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../Decorators/nodeDecorator\";\r\nimport { NodeRenderGraphBlock } from \"../nodeRenderGraphBlock\";\r\nimport { NodeRenderGraphBlockConnectionPointTypes } from \"../Types/nodeRenderGraphTypes\";\r\n\r\n/**\r\n * Block that implements the lighting volume\r\n */\r\nexport class NodeRenderGraphLightingVolumeBlock extends NodeRenderGraphBlock {\r\n protected override _frameGraphTask: FrameGraphLightingVolumeTask;\r\n\r\n /**\r\n * Gets the frame graph task associated with this block\r\n */\r\n public override get task() {\r\n return this._frameGraphTask;\r\n }\r\n\r\n /**\r\n * Create a new NodeRenderGraphLightingVolumeBlock\r\n * @param name defines the block name\r\n * @param frameGraph defines the hosting frame graph\r\n * @param scene defines the hosting scene\r\n */\r\n public constructor(name: string, frameGraph: FrameGraph, scene: Scene) {\r\n super(name, frameGraph, scene);\r\n\r\n this.registerInput(\"shadowGenerator\", NodeRenderGraphBlockConnectionPointTypes.ShadowGenerator);\r\n\r\n this._addDependenciesInput();\r\n\r\n this.registerOutput(\"output\", NodeRenderGraphBlockConnectionPointTypes.ObjectList);\r\n\r\n this._frameGraphTask = new FrameGraphLightingVolumeTask(name, frameGraph);\r\n }\r\n\r\n /** Gets or sets the tesselation parameter */\r\n @editableInPropertyPage(\"Tesselation\", PropertyTypeForEdition.Int, \"PROPERTIES\", { min: 1, max: 4096 })\r\n public get tesselation(): number {\r\n return this._frameGraphTask.lightingVolume.tesselation;\r\n }\r\n\r\n public set tesselation(value: number) {\r\n this._frameGraphTask.lightingVolume.tesselation = value;\r\n }\r\n\r\n /** Gets or sets the refresh frequency parameter */\r\n @editableInPropertyPage(\"Refresh frequency\", PropertyTypeForEdition.Int, \"PROPERTIES\")\r\n public get frequency(): number {\r\n return this._frameGraphTask.lightingVolume.frequency;\r\n }\r\n\r\n public set frequency(value: number) {\r\n this._frameGraphTask.lightingVolume.frequency = value;\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"NodeRenderGraphLightingVolumeBlock\";\r\n }\r\n\r\n /**\r\n * Gets the shadow generator input component\r\n */\r\n public get shadowGenerator(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeRenderGraphConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n protected override _buildBlock(state: NodeRenderGraphBuildState) {\r\n super._buildBlock(state);\r\n\r\n this.output.value = this._frameGraphTask.outputMeshLightingVolume;\r\n\r\n this._frameGraphTask.shadowGenerator = this.shadowGenerator.connectedPoint?.value as FrameGraphShadowGeneratorTask;\r\n }\r\n\r\n protected override _dumpPropertiesCode() {\r\n const codes: string[] = [];\r\n codes.push(`${this._codeVariableName}.tesselation = ${this.tesselation};`);\r\n codes.push(`${this._codeVariableName}.frequency = ${this.frequency};`);\r\n return super._dumpPropertiesCode() + codes.join(\"\\n\");\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.tesselation = this.tesselation;\r\n serializationObject.frequency = this.frequency;\r\n return serializationObject;\r\n }\r\n\r\n public override _deserialize(serializationObject: any) {\r\n super._deserialize(serializationObject);\r\n this.tesselation = serializationObject.tesselation;\r\n this.frequency = serializationObject.frequency;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.NodeRenderGraphLightingVolumeBlock\", NodeRenderGraphLightingVolumeBlock);\r\n"]}
|
|
@@ -97,11 +97,6 @@ export class FrameGraphVolumetricLightingTask extends FrameGraphTask {
|
|
|
97
97
|
});
|
|
98
98
|
this._renderLightingVolumeMaterial.backFaceCulling = false;
|
|
99
99
|
this._renderLightingVolumeMaterial.alphaMode = 1;
|
|
100
|
-
this._renderLightingVolumeMaterial.depthFunction = 519;
|
|
101
|
-
this._renderLightingVolumeMaterial.stencil.enabled = this.enableExtinction;
|
|
102
|
-
this._renderLightingVolumeMaterial.stencil.func = 519;
|
|
103
|
-
this._renderLightingVolumeMaterial.stencil.backFunc = 519;
|
|
104
|
-
this._renderLightingVolumeMaterial.stencil.funcRef = 1;
|
|
105
100
|
this._renderLightingVolumeMaterial.onBindObservable.add(() => {
|
|
106
101
|
this._renderLightingVolumeMaterial.bindEyePosition(this._renderLightingVolumeMaterial.getEffect());
|
|
107
102
|
});
|
|
@@ -132,12 +127,11 @@ export class FrameGraphVolumetricLightingTask extends FrameGraphTask {
|
|
|
132
127
|
}
|
|
133
128
|
this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);
|
|
134
129
|
const textureManager = this._frameGraph.textureManager;
|
|
135
|
-
const targetTextureCreationOptions = textureManager.getTextureCreationOptions(this.targetTexture);
|
|
136
|
-
const targetTextureSamples = targetTextureCreationOptions.options.samples || 1;
|
|
137
130
|
let lightingVolumeTexture = this.lightingVolumeTexture;
|
|
138
131
|
if (!lightingVolumeTexture) {
|
|
132
|
+
const targetTextureCreationOptions = textureManager.getTextureCreationOptions(this.targetTexture);
|
|
139
133
|
targetTextureCreationOptions.options.labels = ["InScattering"];
|
|
140
|
-
targetTextureCreationOptions.options.samples =
|
|
134
|
+
targetTextureCreationOptions.options.samples = 1;
|
|
141
135
|
lightingVolumeTexture = textureManager.createRenderTargetTexture(`${this.name} - lighting volume texture`, targetTextureCreationOptions);
|
|
142
136
|
}
|
|
143
137
|
this.lightingVolumeMesh.meshes[0].material = this._renderLightingVolumeMaterial;
|
|
@@ -149,50 +143,23 @@ export class FrameGraphVolumetricLightingTask extends FrameGraphTask {
|
|
|
149
143
|
this._renderLightingVolumeMaterial.setMatrix("invViewProjection", InvViewProjectionMatrix);
|
|
150
144
|
this._renderLightingVolumeMaterial.setVector3("lightDir", this.light.direction.normalizeToRef(TmpVectors.Vector3[0]));
|
|
151
145
|
});
|
|
152
|
-
const ligthingVolumeTextureCreationOptions = textureManager.getTextureCreationOptions(lightingVolumeTexture);
|
|
153
|
-
ligthingVolumeTextureCreationOptions.options.formats = [
|
|
154
|
-
this._frameGraph.engine.isWebGPU ? 19 : 17,
|
|
155
|
-
];
|
|
156
|
-
ligthingVolumeTextureCreationOptions.options.labels = ["InScatteringStencil"];
|
|
157
|
-
ligthingVolumeTextureCreationOptions.options.samples = targetTextureSamples;
|
|
158
|
-
const lightingVolumeStencilTexture = this.enableExtinction
|
|
159
|
-
? textureManager.createRenderTargetTexture(`${this.name} - lighting volume stencil texture`, ligthingVolumeTextureCreationOptions)
|
|
160
|
-
: undefined;
|
|
161
146
|
this._clearLightingVolumeTextureTask.clearColor = true;
|
|
162
147
|
this._clearLightingVolumeTextureTask.clearStencil = this.enableExtinction;
|
|
163
148
|
this._clearLightingVolumeTextureTask.color = new Color4(0, 0, 0, 1);
|
|
164
149
|
this._clearLightingVolumeTextureTask.stencilValue = 0;
|
|
165
150
|
this._clearLightingVolumeTextureTask.targetTexture = lightingVolumeTexture;
|
|
166
|
-
this._clearLightingVolumeTextureTask.depthTexture = lightingVolumeStencilTexture;
|
|
167
151
|
this._clearLightingVolumeTextureTask.record(true);
|
|
168
152
|
this._renderLightingVolumeTask.targetTexture = this._clearLightingVolumeTextureTask.outputTexture;
|
|
169
|
-
this._renderLightingVolumeTask.depthTexture = this.enableExtinction ? this._clearLightingVolumeTextureTask.outputDepthTexture : undefined;
|
|
170
153
|
this._renderLightingVolumeTask.objectList = this.lightingVolumeMesh;
|
|
171
154
|
this._renderLightingVolumeTask.camera = this.camera;
|
|
172
155
|
this._renderLightingVolumeTask.disableImageProcessing = true;
|
|
173
156
|
this._renderLightingVolumeTask.depthTest = false;
|
|
174
157
|
this._renderLightingVolumeTask.record(true);
|
|
175
158
|
this._blendLightingVolumeTask.sourceTexture = this._renderLightingVolumeTask.outputTexture;
|
|
176
|
-
this._blendLightingVolumeTask.depthAttachmentTexture = this.enableExtinction ? this._renderLightingVolumeTask.outputDepthTexture : undefined;
|
|
177
159
|
this._blendLightingVolumeTask.sourceSamplingMode = this.sourceSamplingMode;
|
|
178
160
|
this._blendLightingVolumeTask.targetTexture = this.targetTexture;
|
|
179
161
|
this._blendLightingVolumeTask.depthTexture = this.depthTexture;
|
|
180
162
|
this._blendLightingVolumeTask.camera = this.camera;
|
|
181
|
-
this._blendLightingVolumeTask.depthTest = false;
|
|
182
|
-
this._blendLightingVolumeTask.stencilState = {
|
|
183
|
-
enabled: this.enableExtinction,
|
|
184
|
-
funcRef: 1,
|
|
185
|
-
mask: 0xff,
|
|
186
|
-
funcMask: 0xff,
|
|
187
|
-
func: 514,
|
|
188
|
-
opStencilFail: 7680,
|
|
189
|
-
opDepthFail: 7680,
|
|
190
|
-
opStencilDepthPass: 7680,
|
|
191
|
-
backFunc: 514,
|
|
192
|
-
backOpStencilFail: 7680,
|
|
193
|
-
backOpDepthFail: 7680,
|
|
194
|
-
backOpStencilDepthPass: 7680,
|
|
195
|
-
};
|
|
196
163
|
this._blendLightingVolumeTask.record(true);
|
|
197
164
|
if (!skipCreationOfDisabledPasses) {
|
|
198
165
|
const disabledPass = this._frameGraph.addPass(this.name + "_disabled", true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"volumetricLightingTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Camera, DirectionalLight, FrameGraph, FrameGraphObjectList, FrameGraphTextureHandle } from \"core/index\";\r\nimport { FrameGraphVolumetricLightingBlendVolumeTask } from \"./volumetricLightingBlendVolumeTask\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { FrameGraphClearTextureTask } from \"../Texture/clearTextureTask\";\r\nimport { FrameGraphObjectRendererTask } from \"../Rendering/objectRendererTask\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nimport \"core/Shaders/volumetricLightingRenderVolume.vertex\";\r\nimport \"core/Shaders/volumetricLightingRenderVolume.fragment\";\r\nimport \"core/ShadersWGSL/volumetricLightingRenderVolume.vertex\";\r\nimport \"core/ShadersWGSL/volumetricLightingRenderVolume.fragment\";\r\n\r\nconst InvViewProjectionMatrix = new Matrix();\r\n\r\n/**\r\n * A frame graph task that performs volumetric lighting.\r\n */\r\nexport class FrameGraphVolumetricLightingTask extends FrameGraphTask {\r\n /**\r\n * The target texture to which the volumetric lighting will be applied.\r\n */\r\n public targetTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The sampling mode to use when blending the volumetric lighting texture with targetTexture.\r\n */\r\n public sourceSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n\r\n /**\r\n * The depth texture used for volumetric lighting calculations.\r\n * It must be the depth texture used to generate targetTexture.\r\n */\r\n public depthTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The camera used for volumetric lighting calculations.\r\n */\r\n public camera: Camera;\r\n\r\n /**\r\n * The mesh representing the lighting volume.\r\n * This is the mesh that will be rendered to create the volumetric lighting effect.\r\n */\r\n public lightingVolumeMesh: FrameGraphObjectList;\r\n\r\n /**\r\n * The directional light used for volumetric lighting.\r\n */\r\n public light: DirectionalLight;\r\n\r\n /**\r\n * The lighting volume texture (optional).\r\n * If not provided, a new texture will be created, which the same size, format and type as targetTexture.\r\n * This is the texture that will store the volumetric lighting information, before being blended to targetTexture.\r\n */\r\n public lightingVolumeTexture?: FrameGraphTextureHandle;\r\n\r\n private _extinctionPhaseG = new Vector4(0, 0, 0, 0);\r\n\r\n /**\r\n * The phase G parameter for the volumetric lighting effect (default: 0).\r\n * This parameter controls the anisotropy of the scattering.\r\n * A value of 0 means isotropic scattering, while a value of 1 means forward scattering and -1 means backward scattering.\r\n */\r\n public get phaseG() {\r\n return this._extinctionPhaseG.w;\r\n }\r\n\r\n public set phaseG(value: number) {\r\n this._extinctionPhaseG.w = value;\r\n this._renderLightingVolumeMaterial.setVector4(\"extinctionPhaseG\", this._extinctionPhaseG);\r\n }\r\n\r\n /**\r\n * Whether to enable extinction in the volumetric lighting effect (default: false).\r\n * Read-only property set in the constructor.\r\n */\r\n public readonly enableExtinction: boolean;\r\n\r\n /**\r\n * The extinction coefficient for the volumetric lighting effect (default: (0, 0, 0) - no extinction).\r\n * This parameter controls how much light is absorbed and scattered as it travels through the medium.\r\n */\r\n public get extinction() {\r\n return this._blendLightingVolumeTask.postProcess.extinction;\r\n }\r\n\r\n public set extinction(value: Vector3) {\r\n this._extinctionPhaseG.x = Math.max(value.x, 1e-6);\r\n this._extinctionPhaseG.y = Math.max(value.y, 1e-6);\r\n this._extinctionPhaseG.z = Math.max(value.z, 1e-6);\r\n this._renderLightingVolumeMaterial.setVector4(\"extinctionPhaseG\", this._extinctionPhaseG);\r\n this._blendLightingVolumeTask.postProcess.extinction.copyFromFloats(this._extinctionPhaseG.x, this._extinctionPhaseG.y, this._extinctionPhaseG.z);\r\n }\r\n\r\n private _lightPower = new Color3(1, 1, 1);\r\n\r\n /**\r\n * The light power/color for the volumetric lighting effect (default: (1, 1, 1)).\r\n * This parameter controls the intensity and color of the light used for volumetric lighting.\r\n */\r\n public get lightPower() {\r\n return this._lightPower;\r\n }\r\n\r\n public set lightPower(value: Color3) {\r\n this._lightPower.copyFrom(value);\r\n this._renderLightingVolumeMaterial.setColor3(\"lightPower\", this._lightPower);\r\n }\r\n\r\n public override get name() {\r\n return this._name;\r\n }\r\n\r\n public override set name(name: string) {\r\n this._name = name;\r\n if (this._renderLightingVolumeMaterial) {\r\n this._renderLightingVolumeMaterial.name = `${name} - render lighting volume`;\r\n }\r\n if (this._clearLightingVolumeTextureTask) {\r\n this._clearLightingVolumeTextureTask.name = `${name} - clear lighting volume texture`;\r\n }\r\n if (this._renderLightingVolumeTask) {\r\n this._renderLightingVolumeTask.name = `${name} - render lighting volume`;\r\n }\r\n if (this._blendLightingVolumeTask) {\r\n this._blendLightingVolumeTask.name = `${name} - blend lighting volume`;\r\n }\r\n }\r\n\r\n /**\r\n * The output texture of the task.\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n private readonly _clearLightingVolumeTextureTask: FrameGraphClearTextureTask;\r\n private readonly _renderLightingVolumeTask: FrameGraphObjectRendererTask;\r\n private readonly _blendLightingVolumeTask: FrameGraphVolumetricLightingBlendVolumeTask;\r\n private _renderLightingVolumeMaterial: ShaderMaterial;\r\n\r\n /**\r\n * Creates a new FrameGraphVolumetricLightingTask.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph to which the task belongs.\r\n * @param enableExtinction Whether to enable extinction in the volumetric lighting effect (default: false). If you don't plan to set extinction to something different than (0, 0, 0), you can disable this to save some performance.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, enableExtinction = false) {\r\n super(name, frameGraph);\r\n\r\n this.enableExtinction = enableExtinction;\r\n\r\n const isWebGPU = this._frameGraph.engine.isWebGPU;\r\n\r\n this._renderLightingVolumeMaterial = new ShaderMaterial(`${name} - render lighting volume`, this._frameGraph.scene, \"volumetricLightingRenderVolume\", {\r\n attributes: [\"position\"],\r\n uniformBuffers: [\"Scene\", \"Mesh\"],\r\n uniforms: [\"world\", \"viewProjection\", \"vEyePosition\", \"lightDir\", \"invViewProjection\", \"outputTextureSize\", \"extinctionPhaseG\", \"lightPower\"],\r\n samplers: [\"depthTexture\"],\r\n defines: enableExtinction ? [\"USE_EXTINCTION\"] : [],\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n needAlphaBlending: true,\r\n });\r\n this._renderLightingVolumeMaterial.backFaceCulling = false;\r\n this._renderLightingVolumeMaterial.alphaMode = Constants.ALPHA_ADD;\r\n this._renderLightingVolumeMaterial.depthFunction = Constants.ALWAYS;\r\n this._renderLightingVolumeMaterial.stencil.enabled = this.enableExtinction;\r\n this._renderLightingVolumeMaterial.stencil.func = Constants.ALWAYS;\r\n this._renderLightingVolumeMaterial.stencil.backFunc = Constants.ALWAYS;\r\n this._renderLightingVolumeMaterial.stencil.funcRef = 1;\r\n this._renderLightingVolumeMaterial.onBindObservable.add(() => {\r\n this._renderLightingVolumeMaterial.bindEyePosition(this._renderLightingVolumeMaterial.getEffect());\r\n });\r\n\r\n this._clearLightingVolumeTextureTask = new FrameGraphClearTextureTask(`${name} - clear lighting volume texture`, frameGraph);\r\n this._renderLightingVolumeTask = new FrameGraphObjectRendererTask(`${name} - render lighting volume`, frameGraph, frameGraph.scene);\r\n this._blendLightingVolumeTask = new FrameGraphVolumetricLightingBlendVolumeTask(`${name} - blend lighting volume`, frameGraph, enableExtinction);\r\n\r\n this.onTexturesAllocatedObservable.add(() => {\r\n this._renderLightingVolumeMaterial.setInternalTexture(\"depthTexture\", frameGraph.textureManager.getTextureFromHandle(this.depthTexture)!);\r\n });\r\n\r\n this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n\r\n // Triggers the setters to set the uniforms\r\n this.phaseG = this._extinctionPhaseG.w;\r\n this.extinction = new Vector3(this.extinction.x, this.extinction.y, this.extinction.z);\r\n this.lightPower = this._lightPower;\r\n }\r\n\r\n public override isReady() {\r\n return (\r\n this._renderLightingVolumeMaterial.isReady() &&\r\n this._clearLightingVolumeTextureTask.isReady() &&\r\n this._renderLightingVolumeMaterial.isReady() &&\r\n this._blendLightingVolumeTask.isReady()\r\n );\r\n }\r\n\r\n public override record(skipCreationOfDisabledPasses = false) {\r\n if (this.targetTexture === undefined || this.depthTexture === undefined || this.camera === undefined || this.lightingVolumeMesh === undefined || this.light === undefined) {\r\n throw new Error(`FrameGraphVolumetricLightingTask \"${this.name}\": targetTexture, depthTexture, camera, lightingVolumeMesh and light are required`);\r\n }\r\n if (!this.lightingVolumeMesh.meshes || this.lightingVolumeMesh.meshes.length === 0) {\r\n throw new Error(`FrameGraphVolumetricLightingTask \"${this.name}\": lightingVolumeMesh is empty`);\r\n }\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);\r\n\r\n const textureManager = this._frameGraph.textureManager;\r\n\r\n const targetTextureCreationOptions = textureManager.getTextureCreationOptions(this.targetTexture);\r\n const targetTextureSamples = targetTextureCreationOptions.options.samples || 1;\r\n\r\n let lightingVolumeTexture = this.lightingVolumeTexture;\r\n if (!lightingVolumeTexture) {\r\n targetTextureCreationOptions.options.labels = [\"InScattering\"];\r\n targetTextureCreationOptions.options.samples = this.enableExtinction ? targetTextureSamples : 1;\r\n\r\n lightingVolumeTexture = textureManager.createRenderTargetTexture(`${this.name} - lighting volume texture`, targetTextureCreationOptions);\r\n }\r\n\r\n this.lightingVolumeMesh.meshes[0].material = this._renderLightingVolumeMaterial;\r\n\r\n const volumeTextureSize = textureManager.getTextureAbsoluteDimensions(lightingVolumeTexture);\r\n\r\n this._renderLightingVolumeMaterial.setVector2(\"outputTextureSize\", new Vector2(volumeTextureSize.width, volumeTextureSize.height));\r\n\r\n const pass = this._frameGraph.addPass(this.name);\r\n\r\n pass.setExecuteFunc(() => {\r\n this.camera.getTransformationMatrix().invertToRef(InvViewProjectionMatrix);\r\n\r\n this._renderLightingVolumeMaterial.setMatrix(\"invViewProjection\", InvViewProjectionMatrix);\r\n this._renderLightingVolumeMaterial.setVector3(\"lightDir\", this.light.direction.normalizeToRef(TmpVectors.Vector3[0]));\r\n });\r\n\r\n const ligthingVolumeTextureCreationOptions = textureManager.getTextureCreationOptions(lightingVolumeTexture);\r\n\r\n ligthingVolumeTextureCreationOptions.options.formats = [\r\n this._frameGraph.engine.isWebGPU ? Constants.TEXTUREFORMAT_STENCIL8 : Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8,\r\n ];\r\n ligthingVolumeTextureCreationOptions.options.labels = [\"InScatteringStencil\"];\r\n ligthingVolumeTextureCreationOptions.options.samples = targetTextureSamples;\r\n\r\n const lightingVolumeStencilTexture = this.enableExtinction\r\n ? textureManager.createRenderTargetTexture(`${this.name} - lighting volume stencil texture`, ligthingVolumeTextureCreationOptions)\r\n : undefined;\r\n\r\n this._clearLightingVolumeTextureTask.clearColor = true;\r\n this._clearLightingVolumeTextureTask.clearStencil = this.enableExtinction;\r\n this._clearLightingVolumeTextureTask.color = new Color4(0, 0, 0, 1);\r\n this._clearLightingVolumeTextureTask.stencilValue = 0;\r\n this._clearLightingVolumeTextureTask.targetTexture = lightingVolumeTexture;\r\n this._clearLightingVolumeTextureTask.depthTexture = lightingVolumeStencilTexture;\r\n this._clearLightingVolumeTextureTask.record(true);\r\n\r\n this._renderLightingVolumeTask.targetTexture = this._clearLightingVolumeTextureTask.outputTexture;\r\n this._renderLightingVolumeTask.depthTexture = this.enableExtinction ? this._clearLightingVolumeTextureTask.outputDepthTexture : undefined;\r\n this._renderLightingVolumeTask.objectList = this.lightingVolumeMesh;\r\n this._renderLightingVolumeTask.camera = this.camera;\r\n this._renderLightingVolumeTask.disableImageProcessing = true;\r\n this._renderLightingVolumeTask.depthTest = false;\r\n this._renderLightingVolumeTask.record(true);\r\n\r\n this._blendLightingVolumeTask.sourceTexture = this._renderLightingVolumeTask.outputTexture;\r\n this._blendLightingVolumeTask.depthAttachmentTexture = this.enableExtinction ? this._renderLightingVolumeTask.outputDepthTexture : undefined;\r\n this._blendLightingVolumeTask.sourceSamplingMode = this.sourceSamplingMode;\r\n this._blendLightingVolumeTask.targetTexture = this.targetTexture;\r\n this._blendLightingVolumeTask.depthTexture = this.depthTexture;\r\n this._blendLightingVolumeTask.camera = this.camera;\r\n this._blendLightingVolumeTask.depthTest = false;\r\n this._blendLightingVolumeTask.stencilState = {\r\n enabled: this.enableExtinction,\r\n\r\n funcRef: 1,\r\n\r\n mask: 0xff,\r\n funcMask: 0xff,\r\n\r\n func: Constants.EQUAL,\r\n opStencilFail: Constants.KEEP,\r\n opDepthFail: Constants.KEEP,\r\n opStencilDepthPass: Constants.KEEP,\r\n\r\n backFunc: Constants.EQUAL,\r\n backOpStencilFail: Constants.KEEP,\r\n backOpDepthFail: Constants.KEEP,\r\n backOpStencilDepthPass: Constants.KEEP,\r\n };\r\n this._blendLightingVolumeTask.record(true);\r\n\r\n if (!skipCreationOfDisabledPasses) {\r\n const disabledPass = this._frameGraph.addPass(this.name + \"_disabled\", true);\r\n\r\n disabledPass.setExecuteFunc(() => {});\r\n }\r\n }\r\n\r\n public override dispose() {\r\n this._renderLightingVolumeMaterial?.dispose();\r\n this._clearLightingVolumeTextureTask.dispose();\r\n this._renderLightingVolumeTask.dispose();\r\n this._blendLightingVolumeTask.dispose();\r\n super.dispose();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"volumetricLightingTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Camera, DirectionalLight, FrameGraph, FrameGraphObjectList, FrameGraphTextureHandle } from \"core/index\";\r\nimport { FrameGraphVolumetricLightingBlendVolumeTask } from \"./volumetricLightingBlendVolumeTask\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { FrameGraphClearTextureTask } from \"../Texture/clearTextureTask\";\r\nimport { FrameGraphObjectRendererTask } from \"../Rendering/objectRendererTask\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nimport \"core/Shaders/volumetricLightingRenderVolume.vertex\";\r\nimport \"core/Shaders/volumetricLightingRenderVolume.fragment\";\r\nimport \"core/ShadersWGSL/volumetricLightingRenderVolume.vertex\";\r\nimport \"core/ShadersWGSL/volumetricLightingRenderVolume.fragment\";\r\n\r\nconst InvViewProjectionMatrix = new Matrix();\r\n\r\n/**\r\n * A frame graph task that performs volumetric lighting.\r\n */\r\nexport class FrameGraphVolumetricLightingTask extends FrameGraphTask {\r\n /**\r\n * The target texture to which the volumetric lighting will be applied.\r\n */\r\n public targetTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The sampling mode to use when blending the volumetric lighting texture with targetTexture.\r\n */\r\n public sourceSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n\r\n /**\r\n * The depth texture used for volumetric lighting calculations.\r\n * It must be the depth texture used to generate targetTexture.\r\n */\r\n public depthTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The camera used for volumetric lighting calculations.\r\n */\r\n public camera: Camera;\r\n\r\n /**\r\n * The mesh representing the lighting volume.\r\n * This is the mesh that will be rendered to create the volumetric lighting effect.\r\n */\r\n public lightingVolumeMesh: FrameGraphObjectList;\r\n\r\n /**\r\n * The directional light used for volumetric lighting.\r\n */\r\n public light: DirectionalLight;\r\n\r\n /**\r\n * The lighting volume texture (optional).\r\n * If not provided, a new texture will be created, which the same size, format and type as targetTexture.\r\n * This is the texture that will store the volumetric lighting information, before being blended to targetTexture.\r\n */\r\n public lightingVolumeTexture?: FrameGraphTextureHandle;\r\n\r\n private _extinctionPhaseG = new Vector4(0, 0, 0, 0);\r\n\r\n /**\r\n * The phase G parameter for the volumetric lighting effect (default: 0).\r\n * This parameter controls the anisotropy of the scattering.\r\n * A value of 0 means isotropic scattering, while a value of 1 means forward scattering and -1 means backward scattering.\r\n */\r\n public get phaseG() {\r\n return this._extinctionPhaseG.w;\r\n }\r\n\r\n public set phaseG(value: number) {\r\n this._extinctionPhaseG.w = value;\r\n this._renderLightingVolumeMaterial.setVector4(\"extinctionPhaseG\", this._extinctionPhaseG);\r\n }\r\n\r\n /**\r\n * Whether to enable extinction in the volumetric lighting effect (default: false).\r\n * Read-only property set in the constructor.\r\n */\r\n public readonly enableExtinction: boolean;\r\n\r\n /**\r\n * The extinction coefficient for the volumetric lighting effect (default: (0, 0, 0) - no extinction).\r\n * This parameter controls how much light is absorbed and scattered as it travels through the medium.\r\n */\r\n public get extinction() {\r\n return this._blendLightingVolumeTask.postProcess.extinction;\r\n }\r\n\r\n public set extinction(value: Vector3) {\r\n this._extinctionPhaseG.x = Math.max(value.x, 1e-6);\r\n this._extinctionPhaseG.y = Math.max(value.y, 1e-6);\r\n this._extinctionPhaseG.z = Math.max(value.z, 1e-6);\r\n this._renderLightingVolumeMaterial.setVector4(\"extinctionPhaseG\", this._extinctionPhaseG);\r\n this._blendLightingVolumeTask.postProcess.extinction.copyFromFloats(this._extinctionPhaseG.x, this._extinctionPhaseG.y, this._extinctionPhaseG.z);\r\n }\r\n\r\n private _lightPower = new Color3(1, 1, 1);\r\n\r\n /**\r\n * The light power/color for the volumetric lighting effect (default: (1, 1, 1)).\r\n * This parameter controls the intensity and color of the light used for volumetric lighting.\r\n */\r\n public get lightPower() {\r\n return this._lightPower;\r\n }\r\n\r\n public set lightPower(value: Color3) {\r\n this._lightPower.copyFrom(value);\r\n this._renderLightingVolumeMaterial.setColor3(\"lightPower\", this._lightPower);\r\n }\r\n\r\n public override get name() {\r\n return this._name;\r\n }\r\n\r\n public override set name(name: string) {\r\n this._name = name;\r\n if (this._renderLightingVolumeMaterial) {\r\n this._renderLightingVolumeMaterial.name = `${name} - render lighting volume`;\r\n }\r\n if (this._clearLightingVolumeTextureTask) {\r\n this._clearLightingVolumeTextureTask.name = `${name} - clear lighting volume texture`;\r\n }\r\n if (this._renderLightingVolumeTask) {\r\n this._renderLightingVolumeTask.name = `${name} - render lighting volume`;\r\n }\r\n if (this._blendLightingVolumeTask) {\r\n this._blendLightingVolumeTask.name = `${name} - blend lighting volume`;\r\n }\r\n }\r\n\r\n /**\r\n * The output texture of the task.\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n private readonly _clearLightingVolumeTextureTask: FrameGraphClearTextureTask;\r\n private readonly _renderLightingVolumeTask: FrameGraphObjectRendererTask;\r\n private readonly _blendLightingVolumeTask: FrameGraphVolumetricLightingBlendVolumeTask;\r\n private _renderLightingVolumeMaterial: ShaderMaterial;\r\n\r\n /**\r\n * Creates a new FrameGraphVolumetricLightingTask.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph to which the task belongs.\r\n * @param enableExtinction Whether to enable extinction in the volumetric lighting effect (default: false). If you don't plan to set extinction to something different than (0, 0, 0), you can disable this to save some performance.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, enableExtinction = false) {\r\n super(name, frameGraph);\r\n\r\n this.enableExtinction = enableExtinction;\r\n\r\n const isWebGPU = this._frameGraph.engine.isWebGPU;\r\n\r\n this._renderLightingVolumeMaterial = new ShaderMaterial(`${name} - render lighting volume`, this._frameGraph.scene, \"volumetricLightingRenderVolume\", {\r\n attributes: [\"position\"],\r\n uniformBuffers: [\"Scene\", \"Mesh\"],\r\n uniforms: [\"world\", \"viewProjection\", \"vEyePosition\", \"lightDir\", \"invViewProjection\", \"outputTextureSize\", \"extinctionPhaseG\", \"lightPower\"],\r\n samplers: [\"depthTexture\"],\r\n defines: enableExtinction ? [\"USE_EXTINCTION\"] : [],\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n needAlphaBlending: true,\r\n });\r\n this._renderLightingVolumeMaterial.backFaceCulling = false;\r\n this._renderLightingVolumeMaterial.alphaMode = Constants.ALPHA_ADD;\r\n this._renderLightingVolumeMaterial.onBindObservable.add(() => {\r\n this._renderLightingVolumeMaterial.bindEyePosition(this._renderLightingVolumeMaterial.getEffect());\r\n });\r\n\r\n this._clearLightingVolumeTextureTask = new FrameGraphClearTextureTask(`${name} - clear lighting volume texture`, frameGraph);\r\n this._renderLightingVolumeTask = new FrameGraphObjectRendererTask(`${name} - render lighting volume`, frameGraph, frameGraph.scene);\r\n this._blendLightingVolumeTask = new FrameGraphVolumetricLightingBlendVolumeTask(`${name} - blend lighting volume`, frameGraph, enableExtinction);\r\n\r\n this.onTexturesAllocatedObservable.add(() => {\r\n this._renderLightingVolumeMaterial.setInternalTexture(\"depthTexture\", frameGraph.textureManager.getTextureFromHandle(this.depthTexture)!);\r\n });\r\n\r\n this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n\r\n // Triggers the setters to set the uniforms\r\n this.phaseG = this._extinctionPhaseG.w;\r\n this.extinction = new Vector3(this.extinction.x, this.extinction.y, this.extinction.z);\r\n this.lightPower = this._lightPower;\r\n }\r\n\r\n public override isReady() {\r\n return (\r\n this._renderLightingVolumeMaterial.isReady() &&\r\n this._clearLightingVolumeTextureTask.isReady() &&\r\n this._renderLightingVolumeMaterial.isReady() &&\r\n this._blendLightingVolumeTask.isReady()\r\n );\r\n }\r\n\r\n public override record(skipCreationOfDisabledPasses = false) {\r\n if (this.targetTexture === undefined || this.depthTexture === undefined || this.camera === undefined || this.lightingVolumeMesh === undefined || this.light === undefined) {\r\n throw new Error(`FrameGraphVolumetricLightingTask \"${this.name}\": targetTexture, depthTexture, camera, lightingVolumeMesh and light are required`);\r\n }\r\n if (!this.lightingVolumeMesh.meshes || this.lightingVolumeMesh.meshes.length === 0) {\r\n throw new Error(`FrameGraphVolumetricLightingTask \"${this.name}\": lightingVolumeMesh is empty`);\r\n }\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);\r\n\r\n const textureManager = this._frameGraph.textureManager;\r\n\r\n let lightingVolumeTexture = this.lightingVolumeTexture;\r\n if (!lightingVolumeTexture) {\r\n const targetTextureCreationOptions = textureManager.getTextureCreationOptions(this.targetTexture);\r\n\r\n targetTextureCreationOptions.options.labels = [\"InScattering\"];\r\n targetTextureCreationOptions.options.samples = 1;\r\n\r\n lightingVolumeTexture = textureManager.createRenderTargetTexture(`${this.name} - lighting volume texture`, targetTextureCreationOptions);\r\n }\r\n\r\n this.lightingVolumeMesh.meshes[0].material = this._renderLightingVolumeMaterial;\r\n\r\n const volumeTextureSize = textureManager.getTextureAbsoluteDimensions(lightingVolumeTexture);\r\n\r\n this._renderLightingVolumeMaterial.setVector2(\"outputTextureSize\", new Vector2(volumeTextureSize.width, volumeTextureSize.height));\r\n\r\n const pass = this._frameGraph.addPass(this.name);\r\n\r\n pass.setExecuteFunc(() => {\r\n this.camera.getTransformationMatrix().invertToRef(InvViewProjectionMatrix);\r\n\r\n this._renderLightingVolumeMaterial.setMatrix(\"invViewProjection\", InvViewProjectionMatrix);\r\n this._renderLightingVolumeMaterial.setVector3(\"lightDir\", this.light.direction.normalizeToRef(TmpVectors.Vector3[0]));\r\n });\r\n\r\n this._clearLightingVolumeTextureTask.clearColor = true;\r\n this._clearLightingVolumeTextureTask.clearStencil = this.enableExtinction;\r\n this._clearLightingVolumeTextureTask.color = new Color4(0, 0, 0, 1);\r\n this._clearLightingVolumeTextureTask.stencilValue = 0;\r\n this._clearLightingVolumeTextureTask.targetTexture = lightingVolumeTexture;\r\n this._clearLightingVolumeTextureTask.record(true);\r\n\r\n this._renderLightingVolumeTask.targetTexture = this._clearLightingVolumeTextureTask.outputTexture;\r\n this._renderLightingVolumeTask.objectList = this.lightingVolumeMesh;\r\n this._renderLightingVolumeTask.camera = this.camera;\r\n this._renderLightingVolumeTask.disableImageProcessing = true;\r\n this._renderLightingVolumeTask.depthTest = false;\r\n this._renderLightingVolumeTask.record(true);\r\n\r\n this._blendLightingVolumeTask.sourceTexture = this._renderLightingVolumeTask.outputTexture;\r\n this._blendLightingVolumeTask.sourceSamplingMode = this.sourceSamplingMode;\r\n this._blendLightingVolumeTask.targetTexture = this.targetTexture;\r\n this._blendLightingVolumeTask.depthTexture = this.depthTexture;\r\n this._blendLightingVolumeTask.camera = this.camera;\r\n this._blendLightingVolumeTask.record(true);\r\n\r\n if (!skipCreationOfDisabledPasses) {\r\n const disabledPass = this._frameGraph.addPass(this.name + \"_disabled\", true);\r\n\r\n disabledPass.setExecuteFunc(() => {});\r\n }\r\n }\r\n\r\n public override dispose() {\r\n this._renderLightingVolumeMaterial?.dispose();\r\n this._clearLightingVolumeTextureTask.dispose();\r\n this._renderLightingVolumeTask.dispose();\r\n this._blendLightingVolumeTask.dispose();\r\n super.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -10,6 +10,7 @@ export declare class LightingVolume {
|
|
|
10
10
|
private readonly _mesh;
|
|
11
11
|
private readonly _copyTexture?;
|
|
12
12
|
private readonly _uBuffer?;
|
|
13
|
+
private readonly _buildFullVolume;
|
|
13
14
|
private _name;
|
|
14
15
|
private _cs?;
|
|
15
16
|
private _light?;
|
|
@@ -20,6 +21,7 @@ export declare class LightingVolume {
|
|
|
20
21
|
private _readPixelAbortController;
|
|
21
22
|
private _numFrames;
|
|
22
23
|
private _firstUpdate;
|
|
24
|
+
private _currentLightDirection;
|
|
23
25
|
private _shadowGenerator?;
|
|
24
26
|
/**
|
|
25
27
|
* The shadow generator used to create the lighting volume.
|
|
@@ -32,12 +34,6 @@ export declare class LightingVolume {
|
|
|
32
34
|
*/
|
|
33
35
|
get tesselation(): number;
|
|
34
36
|
set tesselation(n: number);
|
|
35
|
-
private _buildFullVolume;
|
|
36
|
-
/**
|
|
37
|
-
* Indicates whether to build the full volume (true) or only the near plane (false). Default is false.
|
|
38
|
-
*/
|
|
39
|
-
get buildFullVolume(): boolean;
|
|
40
|
-
set buildFullVolume(value: boolean);
|
|
41
37
|
/**
|
|
42
38
|
* The mesh used as a support for the lighting volume.
|
|
43
39
|
* Note that this mesh is not automatically added to the scene's mesh array.
|
|
@@ -82,6 +78,7 @@ export declare class LightingVolume {
|
|
|
82
78
|
* Disposes the lighting volume and associated resources.
|
|
83
79
|
*/
|
|
84
80
|
dispose(): void;
|
|
81
|
+
private _recreateGeometry;
|
|
85
82
|
private _createComputeShader;
|
|
86
83
|
private _createFallbackTextures;
|
|
87
84
|
private _fallbackReadPixelAsync;
|
package/Lights/lightingVolume.js
CHANGED
|
@@ -46,24 +46,7 @@ export class LightingVolume {
|
|
|
46
46
|
}
|
|
47
47
|
set tesselation(n) {
|
|
48
48
|
this._tesselation = n;
|
|
49
|
-
this._createGeometry();
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Indicates whether to build the full volume (true) or only the near plane (false). Default is false.
|
|
53
|
-
*/
|
|
54
|
-
get buildFullVolume() {
|
|
55
|
-
return this._buildFullVolume;
|
|
56
|
-
}
|
|
57
|
-
set buildFullVolume(value) {
|
|
58
|
-
if (this._buildFullVolume === value) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
this._buildFullVolume = value;
|
|
62
|
-
this._createGeometry();
|
|
63
|
-
if (this._engine.isWebGPU) {
|
|
64
|
-
this._createComputeShader();
|
|
65
|
-
}
|
|
66
|
-
this._firstUpdate = true;
|
|
49
|
+
this._createGeometry(true);
|
|
67
50
|
}
|
|
68
51
|
/**
|
|
69
52
|
* The mesh used as a support for the lighting volume.
|
|
@@ -110,12 +93,13 @@ export class LightingVolume {
|
|
|
110
93
|
* @param tesselation The tesselation level of the lighting volume (default: 64).
|
|
111
94
|
*/
|
|
112
95
|
constructor(name, scene, shadowGenerator, tesselation = 64) {
|
|
96
|
+
this._buildFullVolume = true;
|
|
113
97
|
this._readPixelPromise = null;
|
|
114
98
|
this._readPixelAbortController = null;
|
|
115
99
|
this._numFrames = 0;
|
|
116
100
|
this._firstUpdate = true;
|
|
101
|
+
this._currentLightDirection = new Vector3();
|
|
117
102
|
this._tesselation = 0;
|
|
118
|
-
this._buildFullVolume = false;
|
|
119
103
|
this._frequency = 1;
|
|
120
104
|
const light = shadowGenerator ? shadowGenerator.getLight() : undefined;
|
|
121
105
|
if (light && !(light instanceof DirectionalLight)) {
|
|
@@ -142,7 +126,7 @@ export class LightingVolume {
|
|
|
142
126
|
this._createFallbackTextures();
|
|
143
127
|
}
|
|
144
128
|
this._tesselation = tesselation;
|
|
145
|
-
this._createGeometry();
|
|
129
|
+
this._createGeometry(true);
|
|
146
130
|
}
|
|
147
131
|
/**
|
|
148
132
|
* Checks if the lighting volume is ready to be updated.
|
|
@@ -168,6 +152,7 @@ export class LightingVolume {
|
|
|
168
152
|
}
|
|
169
153
|
this._numFrames = 0;
|
|
170
154
|
if (this._cs && this._uBuffer) {
|
|
155
|
+
this._recreateGeometry();
|
|
171
156
|
const dispatchSize = Math.ceil((this._tesselation + 1) / 8);
|
|
172
157
|
const viewProjMatrix = this._shadowGenerator.getTransformMatrix();
|
|
173
158
|
viewProjMatrix.invertToRef(InvViewProjMatrix);
|
|
@@ -203,6 +188,12 @@ export class LightingVolume {
|
|
|
203
188
|
this._uBuffer?.dispose();
|
|
204
189
|
this._depthCopy?.dispose();
|
|
205
190
|
}
|
|
191
|
+
_recreateGeometry() {
|
|
192
|
+
if (this._light && !this._currentLightDirection.equals(this._light.direction)) {
|
|
193
|
+
this._currentLightDirection.copyFrom(this._light.direction);
|
|
194
|
+
this._createGeometry();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
206
197
|
_createComputeShader() {
|
|
207
198
|
this._cs = new ComputeShader("createLightVolume", this._engine, "lightingVolume", {
|
|
208
199
|
bindingsMapping: {
|
|
@@ -283,6 +274,7 @@ export class LightingVolume {
|
|
|
283
274
|
const invViewProjMatrix = shadowGenerator.getTransformMatrix().clone();
|
|
284
275
|
invViewProjMatrix.invertToRef(invViewProjMatrix);
|
|
285
276
|
const factor = 4;
|
|
277
|
+
this._recreateGeometry();
|
|
286
278
|
let posIndex = startPos;
|
|
287
279
|
let stepY = 0;
|
|
288
280
|
for (let y = 0; y < numTesselation + 1; ++y) {
|
|
@@ -310,7 +302,7 @@ export class LightingVolume {
|
|
|
310
302
|
this._readPixelPromise = null;
|
|
311
303
|
this._firstUpdate = false;
|
|
312
304
|
}
|
|
313
|
-
_createGeometry() {
|
|
305
|
+
_createGeometry(_recreateAll = false) {
|
|
314
306
|
if (!this._light) {
|
|
315
307
|
return;
|
|
316
308
|
}
|
|
@@ -329,6 +321,7 @@ export class LightingVolume {
|
|
|
329
321
|
const startFarIndices = this._buildFullVolume ? (numTesselation + 1) * 4 : 4;
|
|
330
322
|
if (this._buildFullVolume) {
|
|
331
323
|
let startIndices = 0;
|
|
324
|
+
const rightFaceStartIndex = startIndices;
|
|
332
325
|
// Right faces of the frustum
|
|
333
326
|
for (let i = 0; i <= numTesselation; ++i) {
|
|
334
327
|
v.set(max.x, min.y + i * stepY, min.z);
|
|
@@ -339,10 +332,8 @@ export class LightingVolume {
|
|
|
339
332
|
indices.push(startIndices + i, startIndices + i + 1, startFarIndices + numTesselation + (i + 1) * (numTesselation + 1));
|
|
340
333
|
}
|
|
341
334
|
}
|
|
342
|
-
const n0 = 0;
|
|
343
|
-
const n1 = positions.length / 3 - 1;
|
|
344
|
-
const n2 = n1 + 1;
|
|
345
335
|
startIndices = positions.length / 3;
|
|
336
|
+
const leftFaceStartIndex = startIndices;
|
|
346
337
|
// Left faces of the frustum
|
|
347
338
|
for (let i = 0; i <= numTesselation; ++i) {
|
|
348
339
|
v.set(min.x, min.y + i * stepY, min.z);
|
|
@@ -353,8 +344,8 @@ export class LightingVolume {
|
|
|
353
344
|
indices.push(startIndices + i, startFarIndices + 0 + (i + 1) * (numTesselation + 1), startIndices + i + 1);
|
|
354
345
|
}
|
|
355
346
|
}
|
|
356
|
-
const n3 = positions.length / 3 - 1;
|
|
357
347
|
startIndices = positions.length / 3;
|
|
348
|
+
const bottomFaceStartIndex = startIndices;
|
|
358
349
|
// Bottom faces of the frustum
|
|
359
350
|
for (let i = 0; i <= numTesselation; ++i) {
|
|
360
351
|
v.set(min.x + i * stepX, min.y, min.z);
|
|
@@ -366,6 +357,7 @@ export class LightingVolume {
|
|
|
366
357
|
}
|
|
367
358
|
}
|
|
368
359
|
startIndices = positions.length / 3;
|
|
360
|
+
const topFaceStartIndex = startIndices;
|
|
369
361
|
// Top faces of the frustum
|
|
370
362
|
for (let i = 0; i <= numTesselation; ++i) {
|
|
371
363
|
v.set(min.x + i * stepX, max.y, min.z);
|
|
@@ -378,8 +370,18 @@ export class LightingVolume {
|
|
|
378
370
|
}
|
|
379
371
|
startIndices = positions.length / 3;
|
|
380
372
|
// Near faces of the frustum
|
|
381
|
-
|
|
382
|
-
|
|
373
|
+
for (let i = 0; i < numTesselation; ++i) {
|
|
374
|
+
indices.push(leftFaceStartIndex + i, leftFaceStartIndex + i + 1, topFaceStartIndex + numTesselation - i);
|
|
375
|
+
if (i < numTesselation - 1) {
|
|
376
|
+
indices.push(leftFaceStartIndex + i + 1, topFaceStartIndex + numTesselation - i - 1, topFaceStartIndex + numTesselation - i);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
for (let i = 0; i < numTesselation; ++i) {
|
|
380
|
+
indices.push(bottomFaceStartIndex + i, rightFaceStartIndex + numTesselation - i, rightFaceStartIndex + numTesselation - i - 1);
|
|
381
|
+
if (i < numTesselation - 1) {
|
|
382
|
+
indices.push(bottomFaceStartIndex + i, rightFaceStartIndex + numTesselation - i - 1, bottomFaceStartIndex + i + 1);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
383
385
|
}
|
|
384
386
|
else {
|
|
385
387
|
let p;
|
|
@@ -419,7 +421,7 @@ export class LightingVolume {
|
|
|
419
421
|
this._storageBuffer?.dispose();
|
|
420
422
|
this._storageBuffer = new StorageBuffer(webGPUEngine, positions.length * 4, 8 | 3);
|
|
421
423
|
this._storageBuffer.update(positions);
|
|
422
|
-
const vertexBuffer = new VertexBuffer(webGPUEngine, this._storageBuffer.getBuffer(), "position");
|
|
424
|
+
const vertexBuffer = new VertexBuffer(webGPUEngine, this._storageBuffer.getBuffer(), "position", { takeBufferOwnership: false });
|
|
423
425
|
this._mesh.setVerticesBuffer(vertexBuffer);
|
|
424
426
|
this._cs.setStorageBuffer("positions", this._storageBuffer);
|
|
425
427
|
this._uBuffer.updateUInt("startVertexIndex", this._buildFullVolume ? (numTesselation + 1) * 4 * 3 : 4 * 3);
|