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 );