From 1a6e606b38e241b21ea59a92edb6878798d46514 Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Fri, 19 Jun 2026 11:48:35 +0200 Subject: [PATCH] Renderer: Always bind `position` to location `0`. (#33841) --- src/renderers/webgl/WebGLProgram.js | 5 +++-- src/renderers/webgl/WebGLPrograms.js | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index 3d2fa7debc86c6..5c361f1da811f5 100644 --- a/src/renderers/webgl/WebGLProgram.js +++ b/src/renderers/webgl/WebGLProgram.js @@ -847,9 +847,10 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) { gl.bindAttribLocation( program, 0, parameters.index0AttributeName ); - } else if ( parameters.morphTargets === true ) { + } else if ( parameters.hasPositionAttribute === true ) { + + // below avoids the "Attribute 0 is disabled" performance penalty - // programs with morphTargets displace position out of attribute 0 gl.bindAttribLocation( program, 0, 'position' ); } diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index 533954cf35d17d..b91a855f4f63e8 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/src/renderers/webgl/WebGLPrograms.js @@ -327,6 +327,8 @@ function WebGLPrograms( renderer, environments, extensions, capabilities, bindin skinning: object.isSkinnedMesh === true, + hasPositionAttribute: geometry.attributes.position !== undefined, + morphTargets: geometry.morphAttributes.position !== undefined, morphNormals: geometry.morphAttributes.normal !== undefined, morphColors: geometry.morphAttributes.color !== undefined, @@ -588,6 +590,8 @@ function WebGLPrograms( renderer, environments, extensions, capabilities, bindin _programLayers.enable( 21 ); if ( parameters.numLightProbeGrids > 0 ) _programLayers.enable( 22 ); + if ( parameters.hasPositionAttribute ) + _programLayers.enable( 23 ); array.push( _programLayers.mask );