Browse Source

Merge pull request #19673 from Mugen87/dev51

WebGLPrograms: Improve performance of getParameters().
Mr.doob 5 years ago
parent
commit
2f70cd4532

+ 2 - 3
src/materials/Material.d.ts

@@ -1,5 +1,4 @@
 import { Plane } from './../math/Plane';
-import { Shader } from './../renderers/shaders/ShaderLib';
 import { EventDispatcher } from './../core/EventDispatcher';
 import { WebGLRenderer } from './../renderers/WebGLRenderer';
 import {
@@ -322,10 +321,10 @@ export class Material extends EventDispatcher {
 
 	/**
 	 * An optional callback that is executed immediately before the shader program is compiled. This function is called with the shader source code as a parameter. Useful for the modification of built-in materials.
-	 * @param shader Source code of the shader
+	 * @param shaderobject Represents the shader source code and program information.
 	 * @param renderer WebGLRenderer Context that is initializing the material
 	 */
-	onBeforeCompile ( shader : Shader, renderer : WebGLRenderer ) : void;
+	onBeforeCompile ( shaderobject : object, renderer : WebGLRenderer ) : void;
 
 	/**
 	 * In case onBeforeCompile is used, this callback can be used to identify values of settings used in onBeforeCompile, so three.js can reuse a cached shader or recompile the shader as needed.

+ 4 - 0
src/renderers/WebGLRenderer.js

@@ -1350,6 +1350,10 @@ function WebGLRenderer( parameters ) {
 
 		if ( programChange ) {
 
+			parameters.uniforms = programCache.getUniforms( material, parameters );
+
+			material.onBeforeCompile( parameters, _this );
+
 			program = programCache.acquireProgram( parameters, programCacheKey );
 
 			materialProperties.program = program;

+ 1 - 0
src/renderers/webgl/WebGLPrograms.d.ts

@@ -21,6 +21,7 @@ export class WebGLPrograms {
 		object: any
 	): any;
 	getProgramCacheKey( parameters: any ): string;
+	getUniforms( material: Material ): object;
 	acquireProgram(
 		parameters: any,
 		cacheKey: string

+ 39 - 36
src/renderers/webgl/WebGLPrograms.js

@@ -53,36 +53,6 @@ function WebGLPrograms( renderer, extensions, capabilities, bindingStates ) {
 		"sheen"
 	];
 
-	function getShaderObject( material, shaderID ) {
-
-		let shaderobject;
-
-		if ( shaderID ) {
-
-			const shader = ShaderLib[ shaderID ];
-
-			shaderobject = {
-				name: material.name || material.type,
-				uniforms: UniformsUtils.clone( shader.uniforms ),
-				vertexShader: shader.vertexShader,
-				fragmentShader: shader.fragmentShader
-			};
-
-		} else {
-
-			shaderobject = {
-				name: material.name || material.type,
-				uniforms: material.uniforms,
-				vertexShader: material.vertexShader,
-				fragmentShader: material.fragmentShader
-			};
-
-		}
-
-		return shaderobject;
-
-	}
-
 	function allocateBones( object ) {
 
 		const skeleton = object.skeleton;
@@ -168,8 +138,21 @@ function WebGLPrograms( renderer, extensions, capabilities, bindingStates ) {
 
 		}
 
-		const shaderobject = getShaderObject( material, shaderID );
-		material.onBeforeCompile( shaderobject, renderer );
+		let vertexShader, fragmentShader;
+
+		if ( shaderID ) {
+
+			const shader = ShaderLib[ shaderID ];
+
+			vertexShader = shader.vertexShader;
+			fragmentShader = shader.fragmentShader;
+
+		} else {
+
+			vertexShader = material.vertexShader;
+			fragmentShader = material.fragmentShader;
+
+		}
 
 		const currentRenderTarget = renderer.getRenderTarget();
 
@@ -178,11 +161,10 @@ function WebGLPrograms( renderer, extensions, capabilities, bindingStates ) {
 			isWebGL2: isWebGL2,
 
 			shaderID: shaderID,
-			shaderName: shaderobject.name,
+			shaderName: material.name || material.type,
 
-			uniforms: shaderobject.uniforms,
-			vertexShader: shaderobject.vertexShader,
-			fragmentShader: shaderobject.fragmentShader,
+			vertexShader: vertexShader,
+			fragmentShader: fragmentShader,
 			defines: material.defines,
 
 			isRawShaderMaterial: material.isRawShaderMaterial,
@@ -342,6 +324,26 @@ function WebGLPrograms( renderer, extensions, capabilities, bindingStates ) {
 
 	}
 
+	function getUniforms( material ) {
+
+		const shaderID = shaderIDs[ material.type ];
+		let uniforms;
+
+		if ( shaderID ) {
+
+			const shader = ShaderLib[ shaderID ];
+			uniforms = UniformsUtils.clone( shader.uniforms );
+
+		} else {
+
+			uniforms = material.uniforms;
+
+		}
+
+		return uniforms;
+
+	}
+
 	function acquireProgram( parameters, cacheKey ) {
 
 		let program;
@@ -392,6 +394,7 @@ function WebGLPrograms( renderer, extensions, capabilities, bindingStates ) {
 	return {
 		getParameters: getParameters,
 		getProgramCacheKey: getProgramCacheKey,
+		getUniforms: getUniforms,
 		acquireProgram: acquireProgram,
 		releaseProgram: releaseProgram,
 		// Exposed for resource monitoring & error feedback via renderer.info: