فهرست منبع

Made addDeferredMaterials and addDeferredLights internal to DeferredHelper.

alteredq 12 سال پیش
والد
کامیت
018593d4b5
3فایلهای تغییر یافته به همراه139 افزوده شده و 144 حذف شده
  1. 133 134
      examples/js/DeferredHelper.js
  2. 3 5
      examples/webgl_lights_deferred_morphs.html
  3. 3 5
      examples/webgl_lights_deferred_pointlights.html

+ 133 - 134
examples/js/DeferredHelper.js

@@ -12,6 +12,8 @@ THREE.DeferredHelper = function ( parameters ) {
 	var camera = parameters.camera;
 	var renderer = parameters.renderer;
 
+	var additiveSpecular = parameters.additiveSpecular;
+
 	// scene for light proxy geometry
 
 	var lightScene = new THREE.Scene();
@@ -26,6 +28,8 @@ THREE.DeferredHelper = function ( parameters ) {
 
 	//
 
+	var geometryEmitter = new THREE.SphereGeometry( 0.7, 7, 7 );
+
 	var black = new THREE.Color( 0x000000 );
 
 	var colorShader = THREE.ShaderDeferred[ "color" ];
@@ -80,200 +84,203 @@ THREE.DeferredHelper = function ( parameters ) {
 
 	//
 
-	this.addDeferredMaterials = function ( object ) {
-
-		object.traverse( function( node ) {
-
-			if ( !node.material ) return;
+	var addDeferredMaterials = function ( object ) {
 
-			var originalMaterial = node.material;
+		var originalMaterial = object.material;
 
-			// color material
-			// 	diffuse color
-			//	specular color
-			//	shininess
-			//	diffuse map
-			//	vertex colors
-			//	alphaTest
-			// 	morphs
+		// color material
+		// -----------------
+		// 	diffuse color
+		//	specular color
+		//	shininess
+		//	diffuse map
+		//	vertex colors
+		//	alphaTest
+		// 	morphs
 
-			var uniforms = THREE.UniformsUtils.clone( colorShader.uniforms );
-			var defines = { "USE_MAP": !! originalMaterial.map, "GAMMA_INPUT": true };
+		var uniforms = THREE.UniformsUtils.clone( colorShader.uniforms );
+		var defines = { "USE_MAP": !! originalMaterial.map, "GAMMA_INPUT": true };
 
-			var material = new THREE.ShaderMaterial( {
+		var material = new THREE.ShaderMaterial( {
 
-				fragmentShader: colorShader.fragmentShader,
-				vertexShader: 	colorShader.vertexShader,
-				uniforms: 		uniforms,
-				defines: 		defines,
-				shading:		originalMaterial.shading
+			fragmentShader: colorShader.fragmentShader,
+			vertexShader: 	colorShader.vertexShader,
+			uniforms: 		uniforms,
+			defines: 		defines,
+			shading:		originalMaterial.shading
 
-			} );
+		} );
 
-			var diffuse = originalMaterial.color;
-			var specular = originalMaterial.specular !== undefined ? originalMaterial.specular : black;
-			var shininess = originalMaterial.shininess !== undefined ? originalMaterial.shininess : 1;
+		var diffuse = originalMaterial.color;
+		var specular = originalMaterial.specular !== undefined ? originalMaterial.specular : black;
+		var shininess = originalMaterial.shininess !== undefined ? originalMaterial.shininess : 1;
 
-			uniforms.diffuse.value.copy( diffuse );
-			uniforms.specular.value.copy( specular );
-			uniforms.shininess.value = shininess;
+		uniforms.diffuse.value.copy( diffuse );
+		uniforms.specular.value.copy( specular );
+		uniforms.shininess.value = shininess;
 
-			uniforms.map.value = originalMaterial.map;
+		uniforms.map.value = originalMaterial.map;
 
-			material.vertexColors = originalMaterial.vertexColors;
-			material.morphTargets = originalMaterial.morphTargets;
-			material.morphNormals = originalMaterial.morphNormals;
+		material.vertexColors = originalMaterial.vertexColors;
+		material.morphTargets = originalMaterial.morphTargets;
+		material.morphNormals = originalMaterial.morphNormals;
 
-			material.alphaTest = originalMaterial.alphaTest;
+		material.alphaTest = originalMaterial.alphaTest;
 
-			if ( originalMaterial.bumpMap ) {
+		if ( originalMaterial.bumpMap ) {
 
-				var offset = originalMaterial.bumpMap.offset;
-				var repeat = originalMaterial.bumpMap.repeat;
+			var offset = originalMaterial.bumpMap.offset;
+			var repeat = originalMaterial.bumpMap.repeat;
 
-				uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
+			uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
 
-			}
+		}
 
-			node.properties.colorMaterial = material;
+		object.properties.colorMaterial = material;
 
-			// normal material
-			//	vertex normals
-			//	morph normals
-			//	bump map
-			//	bump scale
+		// normal material
+		// -----------------
+		//	vertex normals
+		//	morph normals
+		//	bump map
+		//	bump scale
 
-			if ( originalMaterial.bumpMap ) {
+		if ( originalMaterial.bumpMap ) {
 
-				var uniforms = THREE.UniformsUtils.clone( bumpShader.uniforms );
+			var uniforms = THREE.UniformsUtils.clone( bumpShader.uniforms );
 
-				var normalMaterial = new THREE.ShaderMaterial( {
+			var normalMaterial = new THREE.ShaderMaterial( {
 
-					uniforms: 		uniforms,
-					vertexShader: 	bumpShader.vertexShader,
-					fragmentShader: bumpShader.fragmentShader,
-					defines:		{ "USE_BUMPMAP": true }
+				uniforms: 		uniforms,
+				vertexShader: 	bumpShader.vertexShader,
+				fragmentShader: bumpShader.fragmentShader,
+				defines:		{ "USE_BUMPMAP": true }
 
-				} );
+			} );
 
-				uniforms.bumpMap.value = originalMaterial.bumpMap;
-				uniforms.bumpScale.value = originalMaterial.bumpScale;
+			uniforms.bumpMap.value = originalMaterial.bumpMap;
+			uniforms.bumpScale.value = originalMaterial.bumpScale;
 
-				var offset = originalMaterial.bumpMap.offset;
-				var repeat = originalMaterial.bumpMap.repeat;
+			var offset = originalMaterial.bumpMap.offset;
+			var repeat = originalMaterial.bumpMap.repeat;
 
-				uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
+			uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
 
-				node.properties.normalMaterial = normalMaterial;
+			object.properties.normalMaterial = normalMaterial;
 
-			} else if ( originalMaterial.morphTargets ) {
+		} else if ( originalMaterial.morphTargets ) {
 
-				var normalMaterial = new THREE.ShaderMaterial( {
+			var normalMaterial = new THREE.ShaderMaterial( {
 
-					uniforms:       THREE.UniformsUtils.clone( normalShader.uniforms ),
-					vertexShader:   normalShader.vertexShader,
-					fragmentShader: normalShader.fragmentShader,
-					shading:		originalMaterial.shading
+				uniforms:       THREE.UniformsUtils.clone( normalShader.uniforms ),
+				vertexShader:   normalShader.vertexShader,
+				fragmentShader: normalShader.fragmentShader,
+				shading:		originalMaterial.shading
 
-				} );
+			} );
 
-				normalMaterial.morphTargets = originalMaterial.morphTargets;
-				normalMaterial.morphNormals = originalMaterial.morphNormals;
+			normalMaterial.morphTargets = originalMaterial.morphTargets;
+			normalMaterial.morphNormals = originalMaterial.morphNormals;
 
-				node.properties.normalMaterial = normalMaterial;
+			object.properties.normalMaterial = normalMaterial;
 
-			} else {
+		} else {
 
-				node.properties.normalMaterial = defaultNormalMaterial;
+			object.properties.normalMaterial = defaultNormalMaterial;
 
-			}
+		}
 
-			// depth material
+		// depth material
 
-			if ( originalMaterial.morphTargets ) {
+		if ( originalMaterial.morphTargets ) {
 
-				var depthMaterial = new THREE.ShaderMaterial( {
+			var depthMaterial = new THREE.ShaderMaterial( {
 
-					uniforms:       THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
-					vertexShader:   clipDepthShader.vertexShader,
-					fragmentShader: clipDepthShader.fragmentShader
+				uniforms:       THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
+				vertexShader:   clipDepthShader.vertexShader,
+				fragmentShader: clipDepthShader.fragmentShader
 
-				} );
+			} );
 
-				depthMaterial.morphTargets = originalMaterial.morphTargets;
+			depthMaterial.morphTargets = originalMaterial.morphTargets;
 
-				node.properties.depthMaterial = depthMaterial;
+			object.properties.depthMaterial = depthMaterial;
 
-			} else {
+		} else {
 
-				node.properties.depthMaterial = defaultDepthMaterial;
+			object.properties.depthMaterial = defaultDepthMaterial;
 
-			}
+		}
 
-		} );
+		object.properties.deferredInitialized = true;
 
 	};
 
-	this.addDeferredLights = function ( lights, additiveSpecular ) {
+	var addDeferredPointLight = function ( light ) {
 
-		var geometryEmitter = new THREE.SphereGeometry( 0.7, 7, 7 );
+		// setup material
 
-		for ( var i = 0, il = lights.length; i < il; i ++ ) {
+		var materialLight = new THREE.ShaderMaterial( {
 
-			var light = lights[ i ];
+			uniforms:       THREE.UniformsUtils.clone( lightShader.uniforms ),
+			vertexShader:   lightShader.vertexShader,
+			fragmentShader: lightShader.fragmentShader,
+			defines:		{ "ADDITIVE_SPECULAR": additiveSpecular },
 
-			// setup material
+			blending:		THREE.AdditiveBlending,
+			depthWrite:		false,
+			transparent:	true
 
-			var materialLight = new THREE.ShaderMaterial( {
+		} );
 
-				uniforms:       THREE.UniformsUtils.clone( lightShader.uniforms ),
-				vertexShader:   lightShader.vertexShader,
-				fragmentShader: lightShader.fragmentShader,
-				defines:		{ "ADDITIVE_SPECULAR": additiveSpecular },
+		materialLight.uniforms[ "lightPos" ].value = light.position;
+		materialLight.uniforms[ "lightRadius" ].value = light.distance;
+		materialLight.uniforms[ "lightIntensity" ].value = light.intensity;
+		materialLight.uniforms[ "lightColor" ].value = light.color;
 
-				blending:		THREE.AdditiveBlending,
-				depthWrite:		false,
-				transparent:	true
+		// setup proxy geometry for this light
 
-			} );
+		var geometryLight = new THREE.SphereGeometry( light.distance, 16, 8 );
+		var meshLight = new THREE.Mesh( geometryLight, materialLight );
+		meshLight.position = light.position;
+		lightNode.add( meshLight );
 
-			materialLight.uniforms[ "lightPos" ].value = light.position;
-			materialLight.uniforms[ "lightRadius" ].value = light.distance;
-			materialLight.uniforms[ "lightIntensity" ].value = light.intensity;
-			materialLight.uniforms[ "lightColor" ].value = light.color;
+		// create emitter sphere
 
-			// setup proxy geometry for this light
+		var matEmitter = new THREE.ShaderMaterial( {
 
-			var geometryLight = new THREE.SphereGeometry( light.distance, 16, 8 );
-			var meshLight = new THREE.Mesh( geometryLight, materialLight );
-			meshLight.position = light.position;
-			lightNode.add( meshLight );
+			uniforms:       THREE.UniformsUtils.clone( unlitShader.uniforms ),
+			vertexShader:   unlitShader.vertexShader,
+			fragmentShader: unlitShader.fragmentShader
 
-			// create emitter sphere
+		} );
 
-			var matEmitter = new THREE.ShaderMaterial( {
+		matEmitter.uniforms[ "samplerDepth" ].value = compDepth.renderTarget2;
+		matEmitter.uniforms[ "lightColor" ].value = light.color;
 
-				uniforms:       THREE.UniformsUtils.clone( unlitShader.uniforms ),
-				vertexShader:   unlitShader.vertexShader,
-				fragmentShader: unlitShader.fragmentShader
+		var meshEmitter = new THREE.Mesh( geometryEmitter, matEmitter );
+		meshEmitter.position = light.position;
+		emitterNode.add( meshEmitter );
 
-			} );
+		// add emitter to light node
+
+		meshLight.properties.emitter = meshEmitter;
 
-			matEmitter.uniforms[ "samplerDepth" ].value = compDepth.renderTarget2;
-			matEmitter.uniforms[ "lightColor" ].value = light.color;
+		light.properties.deferredInitialized = true;
 
-			var meshEmitter = new THREE.Mesh( geometryEmitter, matEmitter );
-			meshEmitter.position = light.position;
-			emitterNode.add( meshEmitter );
+	};
 
-			// add emitter to light node
+	var initDeferredProperties = function ( object ) {
 
-			meshLight.properties.emitter = meshEmitter;
+		if ( object.properties.deferredInitialized ) return;
 
-		}
+		if ( object.material ) addDeferredMaterials( object );
+		if ( object instanceof THREE.PointLight ) addDeferredPointLight( object );
 
 	};
 
+	//
+
 	var setMaterialColor = function ( object ) {
 
 		if ( object.material ) object.material = object.properties.colorMaterial;
@@ -292,38 +299,32 @@ THREE.DeferredHelper = function ( parameters ) {
 
 	};
 
+	//
+
 	this.render = function () {
 
-		// -----------------------------
+		scene.traverse( initDeferredProperties );
+
 		// g-buffer color
-		// -----------------------------
 
 		scene.traverse( setMaterialColor );
 		compColor.render();
 
-		// -----------------------------
 		// g-buffer depth
-		// -----------------------------
 
 		scene.traverse( setMaterialDepth );
 		compDepth.render();
 
-		// -----------------------------
 		// g-buffer normals
-		// -----------------------------
 
 		scene.traverse( setMaterialNormal );
 		compNormal.render();
 
-		// -----------------------------
 		// emitter pass
-		// -----------------------------
 
 		compEmitter.render();
 
-		// -----------------------------
 		// light pass
-		// -----------------------------
 
 		camera.projectionMatrixInverse.getInverse( camera.projectionMatrix );
 
@@ -338,9 +339,7 @@ THREE.DeferredHelper = function ( parameters ) {
 
 		compLightBuffer.render();
 
-		// -----------------------------
 		// composite pass
-		// -----------------------------
 
 		compFinal.render( 0.1 );
 

+ 3 - 5
examples/webgl_lights_deferred_morphs.html

@@ -151,7 +151,7 @@
 
 				// deferred helper
 
-				deferredHelper = new THREE.DeferredHelper( { renderer: renderer, scene: scene, camera: camera, width: SCALED_WIDTH, height: SCALED_HEIGHT } );
+				deferredHelper = new THREE.DeferredHelper( { renderer: renderer, scene: scene, camera: camera, width: SCALED_WIDTH, height: SCALED_HEIGHT, additiveSpecular: true } );
 
 				// add lights
 
@@ -172,8 +172,6 @@
 
 			function addObject( object, y, scale ) {
 
-				deferredHelper.addDeferredMaterials( object );
-
 				object.position.y = y;
 				object.scale.set( scale, scale, scale );
 				scene.add( object );
@@ -189,6 +187,7 @@
 				// front light
 
 				var light = new THREE.PointLight( 0xffffff, 1.5, 1.5 * distance );
+				scene.add( light );
 				lights.push( light );
 
 				// random lights
@@ -204,12 +203,11 @@
 					light.color.setRGB( c.x, c.y, c.z );
 					light.color.convertGammaToLinear();
 
+					scene.add( light );
 					lights.push( light );
 
 				}
 
-				deferredHelper.addDeferredLights( lights, true );
-
 			}
 
 			function initObjects() {

+ 3 - 5
examples/webgl_lights_deferred_pointlights.html

@@ -151,7 +151,7 @@
 
 				// deferred helper
 
-				deferredHelper = new THREE.DeferredHelper( { renderer: renderer, scene: scene, camera: camera, width: SCALED_WIDTH, height: SCALED_HEIGHT } );
+				deferredHelper = new THREE.DeferredHelper( { renderer: renderer, scene: scene, camera: camera, width: SCALED_WIDTH, height: SCALED_HEIGHT, additiveSpecular: false } );
 
 				// add lights
 
@@ -171,8 +171,6 @@
 
 			function addObject( object, y, scale ) {
 
-				deferredHelper.addDeferredMaterials( object );
-
 				object.position.y = y;
 				object.scale.set( scale, scale, scale );
 
@@ -189,6 +187,7 @@
 				// front light
 
 				var light = new THREE.PointLight( 0xffffff, 1.5, 1.5 * distance );
+				scene.add( light );
 				lights.push( light );
 
 				// random lights
@@ -204,12 +203,11 @@
 					light.color.setRGB( c.x, c.y, c.z );
 					light.color.convertGammaToLinear();
 
+					scene.add( light );
 					lights.push( light );
 
 				}
 
-				deferredHelper.addDeferredLights( lights, false );
-
 			}
 
 			// -----------------------------