Просмотр исходного кода

Renderer: Always bind `position` to location `0`. (#33841)

Michael Herzog 2 недель назад
Родитель
Сommit
1a6e606b38
2 измененных файлов с 7 добавлено и 2 удалено
  1. 3 2
      src/renderers/webgl/WebGLProgram.js
  2. 4 0
      src/renderers/webgl/WebGLPrograms.js

+ 3 - 2
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' );
 
 	}

+ 4 - 0
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 );
 

粤ICP备19079148号