From 8ebd6634abfd42ac6823898b2fa809e6f1bf20d1 Mon Sep 17 00:00:00 2001 From: Luan Nico Date: Mon, 26 Aug 2024 15:50:35 -0400 Subject: [PATCH 1/3] feat: Add support to multiple lights using the uniform array --- .../shaders/spatial_material.shaderbundle | Bin 213784 -> 0 bytes .../lib/src/graphics/graphics_device.dart | 1 + .../lib/src/resources/light/light.dart | 6 +- .../src/resources/light/lighting_info.dart | 14 ++-- .../src/resources/shader/uniform_array.dart | 6 +- .../flame_3d/shaders/spatial_material.frag | 62 ++++-------------- 6 files changed, 31 insertions(+), 58 deletions(-) delete mode 100644 packages/flame_3d/assets/shaders/spatial_material.shaderbundle diff --git a/packages/flame_3d/assets/shaders/spatial_material.shaderbundle b/packages/flame_3d/assets/shaders/spatial_material.shaderbundle deleted file mode 100644 index 66ac3b75cc643c7678c873727fac788a0367a899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213784 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 TqH5iayiT8Mi~IWaPUrp)g}SVw diff --git a/packages/flame_3d/lib/src/graphics/graphics_device.dart b/packages/flame_3d/lib/src/graphics/graphics_device.dart index a3c8791c9c7..8c7c326d662 100644 --- a/packages/flame_3d/lib/src/graphics/graphics_device.dart +++ b/packages/flame_3d/lib/src/graphics/graphics_device.dart @@ -153,6 +153,7 @@ class GraphicsDevice { /// Bind a uniform [slot] to the [buffer]. void bindUniform(gpu.UniformSlot slot, ByteBuffer buffer) { + print('BINDING UNIFORM ${slot.uniformName} has ${buffer.asByteData().lengthInBytes} (but slot size is ${slot.sizeInBytes})'); _renderPass.bindUniform(slot, _hostBuffer.emplace(buffer.asByteData())); } diff --git a/packages/flame_3d/lib/src/resources/light/light.dart b/packages/flame_3d/lib/src/resources/light/light.dart index b6b584ed2b8..94284daec4b 100644 --- a/packages/flame_3d/lib/src/resources/light/light.dart +++ b/packages/flame_3d/lib/src/resources/light/light.dart @@ -23,8 +23,8 @@ class Light extends Resource { void createResource() {} void apply(int index, Shader shader) { - shader.setVector3('Light$index.position', transform.position); - shader.setColor('Light$index.color', source.color); - shader.setFloat('Light$index.intensity', source.intensity); + shader.setVector3('Light[$index].position', transform.position); + shader.setColor('Light[$index].color', source.color); + shader.setFloat('Light[$index].intensity', source.intensity); } } diff --git a/packages/flame_3d/lib/src/resources/light/lighting_info.dart b/packages/flame_3d/lib/src/resources/light/lighting_info.dart index b0eab1546f5..d8e801d215b 100644 --- a/packages/flame_3d/lib/src/resources/light/lighting_info.dart +++ b/packages/flame_3d/lib/src/resources/light/lighting_info.dart @@ -16,9 +16,8 @@ class LightingInfo { void _applyPointLights(Shader shader) { final pointLights = lights.where((e) => e.source is PointLight); final numLights = pointLights.length; - if (numLights > 3) { - // temporary, until we support dynamic arrays - throw Exception('At most 3 point lights are allowed'); + if (numLights > maxLights) { + throw Exception('At most $maxLights point lights are allowed'); } shader.setUint('LightsInfo.numLights', numLights); @@ -39,10 +38,13 @@ class LightingInfo { } static List shaderSlots = [ + UniformSlot.array('Light', {'position', 'color', 'intensity'}), UniformSlot.value('AmbientLight', {'color', 'intensity'}), UniformSlot.value('LightsInfo', {'numLights'}), - UniformSlot.value('Light0', {'position', 'color', 'intensity'}), - UniformSlot.value('Light1', {'position', 'color', 'intensity'}), - UniformSlot.value('Light2', {'position', 'color', 'intensity'}), ]; + + /// The maximum number of point lights supported by the shader. + /// Since we use fixed-length arrays in the shader, we cannot support an + /// arbitrary number of lights. + static const maxLights = 8; } diff --git a/packages/flame_3d/lib/src/resources/shader/uniform_array.dart b/packages/flame_3d/lib/src/resources/shader/uniform_array.dart index f00959d9834..558777e60c2 100644 --- a/packages/flame_3d/lib/src/resources/shader/uniform_array.dart +++ b/packages/flame_3d/lib/src/resources/shader/uniform_array.dart @@ -33,7 +33,9 @@ class UniformArray extends UniformInstance { data.addAll(entry.value.data); } } - return Float32List.fromList(data).buffer; + final buffer = Float32List.fromList(data).buffer; + print('Resource ${slot.name} has size ${buffer.lengthInBytes}'); + return buffer; } Map data})> _get(int index) { @@ -49,6 +51,8 @@ class UniformArray extends UniformInstance { @override void set(UniformArrayKey key, ByteBuffer buffer) { + print('Setting $key to ${buffer.lengthInBytes} bytes'); + final storage = _get(key.index); final index = slot.indexOf(key.field); diff --git a/packages/flame_3d/shaders/spatial_material.frag b/packages/flame_3d/shaders/spatial_material.frag index 0d99815e66f..f3172905d79 100644 --- a/packages/flame_3d/shaders/spatial_material.frag +++ b/packages/flame_3d/shaders/spatial_material.frag @@ -2,7 +2,7 @@ // implementation based on https://learnopengl.com/PBR/Lighting -// #define NUM_LIGHTS 8 +#define MAX_LIGHTS 8 #define PI 3.14159265359 #define EPSILON 0.0001 @@ -23,7 +23,13 @@ uniform Material { float roughness; } material; -// light info +// lighting info + +uniform Light { + vec3 position; + vec4 color; + float intensity; +} lights[MAX_LIGHTS]; uniform AmbientLight { vec4 color; @@ -34,30 +40,6 @@ uniform LightsInfo { uint numLights; } lightsInfo; -// uniform Light { -// vec3 position; -// vec3 color; -// float intensity; -// } lights[NUM_LIGHTS]; - -uniform Light0 { - vec3 position; - vec4 color; - float intensity; -} light0; - -uniform Light1 { - vec3 position; - vec4 color; - float intensity; -} light1; - -uniform Light2 { - vec3 position; - vec4 color; - float intensity; -} light2; - // camera info uniform Camera { @@ -150,28 +132,12 @@ void main() { vec3 lo = vec3(0.0); - if (lightsInfo.numLights > 0) { - vec3 light0Pos = light0.position; - vec3 light0Color = light0.color.rgb; - float light0Intensity = light0.intensity; - - lo += processLight(light0Pos, light0Color, light0Intensity, baseColor, normal, viewDir, diffuse); - } - - if (lightsInfo.numLights > 1) { - vec3 light1Pos = light1.position; - vec3 light1Color = light1.color.rgb; - float light1Intensity = light1.intensity; - - lo += processLight(light1Pos, light1Color, light1Intensity, baseColor, normal, viewDir, diffuse); - } - - if (lightsInfo.numLights > 2) { - vec3 light2Pos = light2.position; - vec3 light2Color = light2.color.rgb; - float light2Intensity = light2.intensity; + for (uint i = 0; i < lightsInfo.numLights; i++) { + vec3 lightPos = lights[i].position.xyz; + vec3 lightColor = lights[i].color.rgb; + float lightIntensity = lights[i].intensity; - lo += processLight(light2Pos, light2Color, light2Intensity, baseColor, normal, viewDir, diffuse); + lo += processLight(lightPos, lightColor, lightIntensity, baseColor, normal, viewDir, diffuse); } vec3 color = ambient + lo; @@ -180,4 +146,4 @@ void main() { color = pow(color, vec3(1.0 / 2.2)); outColor = vec4(color, 1.0); -} \ No newline at end of file +} From 55c1aad0ef0ff5985950c74bb74194a5e3c0b8da Mon Sep 17 00:00:00 2001 From: Luan Nico Date: Mon, 26 Aug 2024 15:52:28 -0400 Subject: [PATCH 2/3] debug --- .../shaders/spatial_material.shaderbundle | Bin 0 -> 198104 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/flame_3d/assets/shaders/spatial_material.shaderbundle diff --git a/packages/flame_3d/assets/shaders/spatial_material.shaderbundle b/packages/flame_3d/assets/shaders/spatial_material.shaderbundle new file mode 100644 index 0000000000000000000000000000000000000000..3129875f793c83480f7d6b2af4ee96d862045e33 GIT binary patch literal 198104 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 literal 0 HcmV?d00001 From c994e61a8ce91e2aa3f4447a0a0be34fb9511a3e Mon Sep 17 00:00:00 2001 From: Luan Nico Date: Wed, 27 Aug 2025 00:19:39 -0400 Subject: [PATCH 3/3] Untouch files --- packages/flame_3d/lib/src/graphics/graphics_device.dart | 1 - .../flame_3d/lib/src/resources/shader/uniform_array.dart | 6 +----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/flame_3d/lib/src/graphics/graphics_device.dart b/packages/flame_3d/lib/src/graphics/graphics_device.dart index 8c7c326d662..a3c8791c9c7 100644 --- a/packages/flame_3d/lib/src/graphics/graphics_device.dart +++ b/packages/flame_3d/lib/src/graphics/graphics_device.dart @@ -153,7 +153,6 @@ class GraphicsDevice { /// Bind a uniform [slot] to the [buffer]. void bindUniform(gpu.UniformSlot slot, ByteBuffer buffer) { - print('BINDING UNIFORM ${slot.uniformName} has ${buffer.asByteData().lengthInBytes} (but slot size is ${slot.sizeInBytes})'); _renderPass.bindUniform(slot, _hostBuffer.emplace(buffer.asByteData())); } diff --git a/packages/flame_3d/lib/src/resources/shader/uniform_array.dart b/packages/flame_3d/lib/src/resources/shader/uniform_array.dart index 558777e60c2..f00959d9834 100644 --- a/packages/flame_3d/lib/src/resources/shader/uniform_array.dart +++ b/packages/flame_3d/lib/src/resources/shader/uniform_array.dart @@ -33,9 +33,7 @@ class UniformArray extends UniformInstance { data.addAll(entry.value.data); } } - final buffer = Float32List.fromList(data).buffer; - print('Resource ${slot.name} has size ${buffer.lengthInBytes}'); - return buffer; + return Float32List.fromList(data).buffer; } Map data})> _get(int index) { @@ -51,8 +49,6 @@ class UniformArray extends UniformInstance { @override void set(UniformArrayKey key, ByteBuffer buffer) { - print('Setting $key to ${buffer.lengthInBytes} bytes'); - final storage = _get(key.index); final index = slot.indexOf(key.field);