From 4c5f88efedf0defb99f70c3b943c45441c188246 Mon Sep 17 00:00:00 2001 From: Martin Valigursky Date: Wed, 26 Feb 2025 15:02:11 +0000 Subject: [PATCH] Refactoring clustered lighting shader defines to be available as a chunk --- src/scene/lighting/lights-buffer.js | 34 ++++++++----------- .../shader-lib/chunks-wgsl/chunks-wgsl.js | 1 + src/scene/shader-lib/chunks/chunks.js | 1 + src/scene/shader-lib/programs/lit-shader.js | 3 +- 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/scene/lighting/lights-buffer.js b/src/scene/lighting/lights-buffer.js index e1150c4531e..d8a95eb333b 100644 --- a/src/scene/lighting/lights-buffer.js +++ b/src/scene/lighting/lights-buffer.js @@ -4,6 +4,8 @@ import { FloatPacking } from '../../core/math/float-packing.js'; import { LIGHTSHAPE_PUNCTUAL, LIGHTTYPE_SPOT, MASK_AFFECT_LIGHTMAPPED, MASK_AFFECT_DYNAMIC } from '../constants.js'; import { Texture } from '../../platform/graphics/texture.js'; import { LightCamera } from '../renderer/light-camera.js'; +import { shaderChunks } from '../shader-lib/chunks/chunks.js'; +import { shaderChunksWGSL } from '../shader-lib/chunks-wgsl/chunks-wgsl.js'; const epsilon = 0.000001; @@ -48,29 +50,21 @@ const TextureIndexFloat = { COUNT: 8 }; -let _defines; +// converts object with properties to a list of these as an example: "#define CLUSTER_TEXTURE_8_BLAH 1" +const buildShaderDefines = (object, prefix) => { + return Object.keys(object) + .map(key => `#define ${prefix}${key} ${object[key]}`) + .join('\n'); +}; + +// create a shader chunk with defines for the light buffer textures +shaderChunks.lightBufferDefinesPS = shaderChunksWGSL.lightBufferDefinesPS = `\n + ${buildShaderDefines(TextureIndex8, 'CLUSTER_TEXTURE_8_')} + ${buildShaderDefines(TextureIndexFloat, 'CLUSTER_TEXTURE_F_')} +`; // A class used by clustered lighting, responsible for encoding light properties into textures for the use on the GPU class LightsBuffer { - static getShaderDefines() { - - // converts object with properties to a list of these as an example: "#define CLUSTER_TEXTURE_8_BLAH 1" - const buildShaderDefines = (object, prefix) => { - return Object.keys(object) - .map(key => `#define ${prefix}${key} ${object[key]}`) - .join('\n'); - }; - - if (!_defines) { - _defines = `\n - ${buildShaderDefines(TextureIndex8, 'CLUSTER_TEXTURE_8_')} - ${buildShaderDefines(TextureIndexFloat, 'CLUSTER_TEXTURE_F_')} - `; - } - - return _defines; - } - areaLightsEnabled = false; constructor(device) { diff --git a/src/scene/shader-lib/chunks-wgsl/chunks-wgsl.js b/src/scene/shader-lib/chunks-wgsl/chunks-wgsl.js index f3c3b61f2de..878360fa17e 100644 --- a/src/scene/shader-lib/chunks-wgsl/chunks-wgsl.js +++ b/src/scene/shader-lib/chunks-wgsl/chunks-wgsl.js @@ -284,6 +284,7 @@ const shaderChunksWGSL = { // iridescencePS, // iridescenceThicknessPS, // iorPS, + lightBufferDefinesPS: '', // this chunk gets genereated at startup // lightDeclarationPS, // lightDiffuseLambertPS, // lightDirPointPS, diff --git a/src/scene/shader-lib/chunks/chunks.js b/src/scene/shader-lib/chunks/chunks.js index e41ff3e79e5..bb7117cd58f 100644 --- a/src/scene/shader-lib/chunks/chunks.js +++ b/src/scene/shader-lib/chunks/chunks.js @@ -284,6 +284,7 @@ const shaderChunks = { iridescencePS, iridescenceThicknessPS, iorPS, + lightBufferDefinesPS: '', // this chunk gets genereated at startup lightDeclarationPS, lightDiffuseLambertPS, lightDirPointPS, diff --git a/src/scene/shader-lib/programs/lit-shader.js b/src/scene/shader-lib/programs/lit-shader.js index 0fd320d56ed..a5f04beff87 100644 --- a/src/scene/shader-lib/programs/lit-shader.js +++ b/src/scene/shader-lib/programs/lit-shader.js @@ -19,7 +19,6 @@ import { } from '../../constants.js'; import { shaderChunks } from '../chunks/chunks.js'; import { ChunkUtils } from '../chunk-utils.js'; -import { LightsBuffer } from '../../lighting/lights-buffer.js'; import { ShaderPass } from '../../shader-pass.js'; import { validateUserChunks } from '../chunks/chunk-validation.js'; import { ChunkBuilder } from '../chunk-builder.js'; @@ -587,7 +586,7 @@ class LitShader { #include "lightDeclarationPS, LIGHT_COUNT" #if defined(CLUSTERED_LIGHTS) - ${LightsBuffer.getShaderDefines()} + #include "lightBufferDefinesPS" #endif // required lighting functionality