Browse Source

Update uniforms in onBeforeRender() for Specular-Glossiness ShaderMaterial

Takahiro 8 years ago
parent
commit
2245b6f9ea
2 changed files with 59 additions and 38 deletions
  1. 57 27
      examples/js/loaders/GLTF2Loader.js
  2. 2 11
      examples/webgl_loader_gltf2.html

+ 57 - 27
examples/js/loaders/GLTF2Loader.js

@@ -1782,41 +1782,30 @@ THREE.GLTF2Loader = ( function () {
 
 					// set uniforms and defines for Specular-Glossiness
 
-					var uniforms = materialParams.uniforms;
-					var defines = materialParams.defines;
-
-					if ( materialParams.color !== undefined ) uniforms.diffuse.value.copy( materialParams.color );
-					if ( materialParams.emissive !== undefined ) uniforms.emissive.value.copy( materialParams.emissive );
-					if ( materialParams.specular !== undefined ) uniforms.specular.value.copy( materialParams.specular );
-					if ( materialParams.glossiness !== undefined ) uniforms.glossiness.value = materialParams.glossiness;
-
-					if ( materialParams.map !== undefined ) uniforms.map.value = materialParams.map;
-					if ( materialParams.aoMap !== undefined ) uniforms.aoMap.value = materialParams.aoMap;
-					if ( materialParams.emissiveMap !== undefined ) uniforms.emissiveMap.value = materialParams.emissiveMap;
-					if ( materialParams.normalMap !== undefined ) uniforms.normalMap.value = materialParams.normalMap;
-					if ( materialParams.specularMap !== undefined ) uniforms.specularMap.value = materialParams.specularMap;
-					if ( materialParams.glossinessMap !== undefined ) uniforms.glossinessMap.value = materialParams.glossinessMap;
-
-					if ( uniforms.map.value !== null ) defines.USE_MAP = '';
-					if ( uniforms.aoMap.value !== null ) defines.USE_AOMAP = '';
-					if ( uniforms.emissiveMap.value !== null ) defines.USE_EMISSIVEMAP = '';
-					if ( uniforms.normalMap.value !== null ) defines.USE_NORMALMAP = '';
-					if ( uniforms.specularMap.value !== null ) defines.USE_SPECULARMAP = '';
-					if ( uniforms.glossinessMap.value !== null ) defines.USE_GLOSSINESSMAP = '';
-
-					// set defines.USE_GLOSSINESSMAP to enable vUv in the shader
-					if ( defines.USE_GLOSSINESSMAP !== undefined ) defines.USE_ROUGHNESSMAP = '';
-
 					_material = new materialType( {
-						defines: defines,
+						defines: materialParams.defines,
 						vertexShader: materialParams.vertexShader,
 						fragmentShader: materialParams.fragmentShader,
-						uniforms: uniforms,
+						uniforms: materialParams.uniforms,
 						lights: materialParams.lights,
 						opacity: materialParams.opacity,
 						transparent: materialParams.transparent
 					} );
 
+					_material.color = materialParams.color;
+					_material.emissive = materialParams.emissive;
+					_material.specular = materialParams.specular;
+					_material.glossiness = materialParams.glossiness;
+
+					_material.map = materialParams.map === undefined ? null : materialParams.map;
+					_material.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap;
+					_material.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap;
+					_material.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap;
+					_material.envMap = materialParams.envMap === undefined ? null : materialParams.envMap;
+					_material.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap;
+					_material.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap;
+					_material.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap;
+
 					_material.extensions.derivatives = true;
 
 				} else {
@@ -2475,6 +2464,47 @@ THREE.GLTF2Loader = ( function () {
 
 					}
 
+					// for Specular-Glossiness
+					if ( child.material && child.material.type === 'ShaderMaterial' ) {
+
+						child.onBeforeRender = function ( renderer, scene, camera, geometry, material, group ) {
+
+							var uniforms = material.uniforms;
+							var defines = material.defines;
+
+							uniforms.diffuse.value.copy( material.color );
+							uniforms.emissive.value.copy( material.emissive );
+							uniforms.specular.value.copy( material.specular );
+							uniforms.glossiness.value = material.glossiness;
+
+							uniforms.map.value = material.map;
+							uniforms.aoMap.value = material.aoMap;
+							uniforms.bumpMap.value = material.bumpMap;
+							uniforms.emissiveMap.value = material.emissiveMap;
+							uniforms.envMap.value = material.envMap;
+							uniforms.normalMap.value = material.normalMap;
+							uniforms.specularMap.value = material.specularMap;
+							uniforms.glossinessMap.value = material.glossinessMap;
+
+							if ( uniforms.glossinessMap.value !== null && defines.USE_GLOSSINESSMAP === undefined ) {
+
+								defines.USE_GLOSSINESSMAP = '';
+								// set USE_ROUGHNESSMAP to enable vUv
+								defines.USE_ROUGHNESSMAP = ''
+
+							}
+
+							if ( uniforms.glossinessMap.value === null && defines.USE_GLOSSINESSMAP !== undefined ) {
+
+								delete defines.USE_GLOSSINESSMAP;
+								delete defines.USE_ROUGHNESSMAP;
+
+							}
+
+						};
+
+					}
+
 				} );
 
 				return _scene;

+ 2 - 11
examples/webgl_loader_gltf2.html

@@ -260,23 +260,14 @@
 
 						object.traverse( function( node ) {
 
-							if ( node.material && node.material.isMeshStandardMaterial ) {
+							if ( node.material && ( node.material.isMeshStandardMaterial ||
+								 ( node.material.isShaderMaterial && node.material.envMap !== undefined ) ) ) {
 
 								node.material.envMap = envMap;
 								node.material.needsUpdate = true;
 
 							}
 
-							if ( node.material && node.material.isShaderMaterial && node.material.uniforms.envMap ) {
-
-								node.material.uniforms.envMap.value = envMap;
-								node.material.defines.USE_ENVMAP = '';
-								node.material.defines.ENVMAP_TYPE_CUBE = '';
-								node.material.defines.ENVMAP_MODE_REFLECTION = '';
-								node.material.needsUpdate = true;
-
-							}
-
 						} );
 
 						scene.background = envMap;