2
0
Эх сурвалжийг харах

Reuse program when not changed

Resuse program if code is the same and material updated
Ben Adams 10 жил өмнө
parent
commit
a9e0b9de16

+ 37 - 24
src/renderers/WebGLRenderer.js

@@ -2244,30 +2244,8 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	function initMaterial( material, lights, fog, object ) {
 
-		material.addEventListener( 'dispose', onMaterialDispose );
-
 		var shaderID = shaderIDs[ material.type ];
 
-		if ( shaderID ) {
-
-			var shader = THREE.ShaderLib[ shaderID ];
-
-			material.__webglShader = {
-				uniforms: THREE.UniformsUtils.clone( shader.uniforms ),
-				vertexShader: shader.vertexShader,
-				fragmentShader: shader.fragmentShader
-			}
-
-		} else {
-
-			material.__webglShader = {
-				uniforms: material.uniforms,
-				vertexShader: material.vertexShader,
-				fragmentShader: material.fragmentShader
-			}
-
-		}
-
 		// heuristics to create shader parameters according to lights in the scene
 		// (not to blow over maxLights budget)
 
@@ -2366,6 +2344,43 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		var code = chunks.join();
 
+		if ( !material.program ) {
+
+		    // new material
+		    material.addEventListener( 'dispose', onMaterialDispose );
+
+		} else if ( material.program.code !== code ) {
+
+		    // changed glsl or parameters
+		    deallocateMaterial( material );
+
+		} else {
+
+            // same glsl and parameters
+		    return;
+
+		}
+
+		if ( shaderID ) {
+
+			var shader = THREE.ShaderLib[ shaderID ];
+
+			material.__webglShader = {
+				uniforms: THREE.UniformsUtils.clone( shader.uniforms ),
+				vertexShader: shader.vertexShader,
+				fragmentShader: shader.fragmentShader
+			}
+
+		} else {
+
+			material.__webglShader = {
+				uniforms: material.uniforms,
+				vertexShader: material.vertexShader,
+				fragmentShader: material.fragmentShader
+			}
+
+		}
+
 		var program;
 
 		// Check if code has been already compiled
@@ -2477,8 +2492,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		if ( material.needsUpdate ) {
 
-			if ( material.program ) deallocateMaterial( material );
-
 			initMaterial( material, lights, fog, object );
 			material.needsUpdate = false;