From 1eea5d4514ed9d6bbfaa3a3a3e71c422a61f5961 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 22 Jul 2025 11:06:32 +0200 Subject: [PATCH 1/5] native morph work around --- .../dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx b/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx index 2ba99dc9039..14441f634f6 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx @@ -1,8 +1,9 @@ #ifdef MORPHTARGETS #ifdef MORPHTARGETS_TEXTURE #if {X} == 0 + float floatIndex = 0.; for (int i = 0; i < NUM_MORPH_INFLUENCERS; i++) { - if (i >= morphTargetCount) break; + if (floatIndex >= morphTargetCount) break; vertexID = float(gl_VertexID) * morphTargetTextureInfo.x; @@ -44,6 +45,7 @@ #ifdef MORPHTARGETS_COLOR colorUpdated += (readVector4FromRawSampler(i, vertexID) - color) * morphTargetInfluences[i]; #endif + floatIndex += 1.; } #endif #else From 4703cb75cf8625e217e2ff841db550c1de0a01d1 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 22 Jul 2025 12:08:16 +0200 Subject: [PATCH 2/5] native define --- .../core/src/Shaders/ShadersInclude/morphTargetsVertex.fx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx b/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx index 14441f634f6..fe238a75a88 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx @@ -3,8 +3,11 @@ #if {X} == 0 float floatIndex = 0.; for (int i = 0; i < NUM_MORPH_INFLUENCERS; i++) { +#if defined(NATIVE) if (floatIndex >= morphTargetCount) break; - +#else + if (i >= morphTargetCount) break; +#endif vertexID = float(gl_VertexID) * morphTargetTextureInfo.x; #ifdef MORPHTARGETS_POSITION From 08f425f729bc6ee0c43c82b7481a525d702e6200 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 22 Jul 2025 15:15:24 +0200 Subject: [PATCH 3/5] workaround --- .../src/Culling/Helper/computeShaderBoundingHelper.ts | 2 +- .../Materials/Node/Blocks/Vertex/morphTargetsBlock.ts | 2 +- packages/dev/core/src/Morph/morphTargetManager.ts | 2 +- .../src/Shaders/ShadersInclude/morphTargetsVertex.fx | 9 ++------- .../ShadersInclude/morphTargetsVertexDeclaration.fx | 2 +- .../src/ShadersWGSL/ShadersInclude/morphTargetsVertex.fx | 2 +- .../ShadersInclude/morphTargetsVertexDeclaration.fx | 2 +- .../dev/core/src/ShadersWGSL/boundingInfo.compute.fx | 4 ++-- 8 files changed, 10 insertions(+), 15 deletions(-) diff --git a/packages/dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts b/packages/dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts index 319a065a4c9..23c1d8ad810 100644 --- a/packages/dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts +++ b/packages/dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts @@ -268,7 +268,7 @@ export class ComputeShaderBoundingHelper implements IBoundingInfoHelperPlatform ); ubo.updateFloat3("morphTargetTextureInfo", manager._textureVertexStride, manager._textureWidth, manager._textureHeight); - ubo.updateInt("morphTargetCount", manager.numInfluencers); + ubo.updateFloat("morphTargetCount", manager.numInfluencers); ubo.update(); } diff --git a/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts index 6b062c05870..09cf1fa0545 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts @@ -292,7 +292,7 @@ export class MorphTargetsBlock extends NodeMaterialBlock { const uniformsPrefix = isWebGPU ? "uniforms." : ""; if (manager?.isUsingTextureForTargets) { injectionCode += `for (${isWebGPU ? "var" : "int"} i = 0; i < NUM_MORPH_INFLUENCERS; i++) {\n`; - injectionCode += `if (i >= ${uniformsPrefix}morphTargetCount) { break; }\n`; + injectionCode += `if (float(i) >= ${uniformsPrefix}morphTargetCount) { break; }\n`; injectionCode += `vertexID = ${isWebGPU ? "f32(vertexInputs.vertexIndex" : "float(gl_VertexID"}) * ${uniformsPrefix}morphTargetTextureInfo.x;\n`; if (supportPositions) { diff --git a/packages/dev/core/src/Morph/morphTargetManager.ts b/packages/dev/core/src/Morph/morphTargetManager.ts index 6eac272e420..963dda9f414 100644 --- a/packages/dev/core/src/Morph/morphTargetManager.ts +++ b/packages/dev/core/src/Morph/morphTargetManager.ts @@ -403,7 +403,7 @@ export class MorphTargetManager implements IDisposable { effect.setFloat3("morphTargetTextureInfo", this._textureVertexStride, this._textureWidth, this._textureHeight); effect.setFloatArray("morphTargetTextureIndices", this._morphTargetTextureIndices); effect.setTexture("morphTargets", this._targetStoreTexture); - effect.setInt("morphTargetCount", this.numInfluencers); + effect.setFloat("morphTargetCount", this.numInfluencers); } /** diff --git a/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx b/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx index fe238a75a88..26f1b876421 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.fx @@ -1,13 +1,9 @@ #ifdef MORPHTARGETS #ifdef MORPHTARGETS_TEXTURE #if {X} == 0 - float floatIndex = 0.; for (int i = 0; i < NUM_MORPH_INFLUENCERS; i++) { -#if defined(NATIVE) - if (floatIndex >= morphTargetCount) break; -#else - if (i >= morphTargetCount) break; -#endif + if (float(i) >= morphTargetCount) break; + vertexID = float(gl_VertexID) * morphTargetTextureInfo.x; #ifdef MORPHTARGETS_POSITION @@ -48,7 +44,6 @@ #ifdef MORPHTARGETS_COLOR colorUpdated += (readVector4FromRawSampler(i, vertexID) - color) * morphTargetInfluences[i]; #endif - floatIndex += 1.; } #endif #else diff --git a/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertexDeclaration.fx b/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertexDeclaration.fx index 5e31221e855..d946746b1b1 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertexDeclaration.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/morphTargetsVertexDeclaration.fx @@ -24,6 +24,6 @@ attribute vec4 color{X}; #endif #elif {X} == 0 - uniform int morphTargetCount; + uniform float morphTargetCount; #endif #endif diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertex.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertex.fx index f3dfc0505d5..f2e84b866ce 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertex.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertex.fx @@ -2,7 +2,7 @@ #ifdef MORPHTARGETS_TEXTURE #if {X} == 0 for (var i = 0; i < NUM_MORPH_INFLUENCERS; i = i + 1) { - if (i >= uniforms.morphTargetCount) { + if (float(i) >= uniforms.morphTargetCount) { break; } diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration.fx index e8e4440d04f..904e64e4c1e 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration.fx @@ -24,6 +24,6 @@ attribute color{X} : vec4; #endif #elif {X} == 0 - uniform morphTargetCount: i32; + uniform morphTargetCount: f32; #endif #endif diff --git a/packages/dev/core/src/ShadersWGSL/boundingInfo.compute.fx b/packages/dev/core/src/ShadersWGSL/boundingInfo.compute.fx index 240bc8f08e4..d7604b6421a 100644 --- a/packages/dev/core/src/ShadersWGSL/boundingInfo.compute.fx +++ b/packages/dev/core/src/ShadersWGSL/boundingInfo.compute.fx @@ -71,7 +71,7 @@ const identity = mat4x4f( struct Settings { morphTargetTextureInfo: vec3f, - morphTargetCount: i32, + morphTargetCount: f32, indexResult : u32, }; @@ -165,7 +165,7 @@ fn main(@builtin(global_invocation_id) global_id : vec3) { #ifdef MORPHTARGETS for (var i = 0; i < NUM_MORPH_INFLUENCERS; i = i + 1) { - if (i >= settings.morphTargetCount) { + if (float(i) >= settings.morphTargetCount) { break; } positionUpdated = positionUpdated + (readVector3FromRawSampler(i, index) - position) * morphTargetInfluences[i]; From 9688dc528fdb13a5370a797306d6a779daa1f9b1 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 22 Jul 2025 15:54:03 +0200 Subject: [PATCH 4/5] wgsl casting --- .../core/src/ShadersWGSL/ShadersInclude/morphTargetsVertex.fx | 2 +- packages/dev/core/src/ShadersWGSL/boundingInfo.compute.fx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertex.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertex.fx index f2e84b866ce..a04b002adbe 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertex.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/morphTargetsVertex.fx @@ -2,7 +2,7 @@ #ifdef MORPHTARGETS_TEXTURE #if {X} == 0 for (var i = 0; i < NUM_MORPH_INFLUENCERS; i = i + 1) { - if (float(i) >= uniforms.morphTargetCount) { + if (f32(i) >= uniforms.morphTargetCount) { break; } diff --git a/packages/dev/core/src/ShadersWGSL/boundingInfo.compute.fx b/packages/dev/core/src/ShadersWGSL/boundingInfo.compute.fx index d7604b6421a..49bca851752 100644 --- a/packages/dev/core/src/ShadersWGSL/boundingInfo.compute.fx +++ b/packages/dev/core/src/ShadersWGSL/boundingInfo.compute.fx @@ -165,7 +165,7 @@ fn main(@builtin(global_invocation_id) global_id : vec3) { #ifdef MORPHTARGETS for (var i = 0; i < NUM_MORPH_INFLUENCERS; i = i + 1) { - if (float(i) >= settings.morphTargetCount) { + if (f32(i) >= settings.morphTargetCount) { break; } positionUpdated = positionUpdated + (readVector3FromRawSampler(i, index) - position) * morphTargetInfluences[i]; From a57548b9b9c67a57a1d36372c0817385afa79c73 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 22 Jul 2025 16:46:31 +0200 Subject: [PATCH 5/5] webgpu fix --- .../core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts index 09cf1fa0545..e1de549677a 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts @@ -292,7 +292,7 @@ export class MorphTargetsBlock extends NodeMaterialBlock { const uniformsPrefix = isWebGPU ? "uniforms." : ""; if (manager?.isUsingTextureForTargets) { injectionCode += `for (${isWebGPU ? "var" : "int"} i = 0; i < NUM_MORPH_INFLUENCERS; i++) {\n`; - injectionCode += `if (float(i) >= ${uniformsPrefix}morphTargetCount) { break; }\n`; + injectionCode += `if (${isWebGPU ? "f32" : "float"}(i) >= ${uniformsPrefix}morphTargetCount) { break; }\n`; injectionCode += `vertexID = ${isWebGPU ? "f32(vertexInputs.vertexIndex" : "float(gl_VertexID"}) * ${uniformsPrefix}morphTargetTextureInfo.x;\n`; if (supportPositions) {