Explorar o código

Started to move deferred functionality out of examples into DeferredHelper.

These are first steps toward WebGLDeferredRenderer. This will take a while.
alteredq %!s(int64=12) %!d(string=hai) anos
pai
achega
ee53b015a0

+ 177 - 0
examples/js/DeferredHelper.js

@@ -0,0 +1,177 @@
+/**
+ * @author alteredq / http://alteredqualia.com/
+ */
+
+THREE.DeferredHelper = function ( parameters ) {
+
+	var width = parameters.width;
+	var height = parameters.height;
+
+	var black = new THREE.Color( 0x000000 );
+
+	var colorShader = THREE.ShaderDeferred[ "color" ];
+	var normalShader = THREE.ShaderDeferred[ "normals" ];
+	var bumpShader = THREE.ShaderDeferred[ "bump" ];
+	var clipDepthShader = THREE.ShaderDeferred[ "clipDepth" ];
+
+	this.unlitShader = THREE.ShaderDeferred[ "unlit" ];
+	this.lightShader = THREE.ShaderDeferred[ "light" ];
+	this.compositeShader = THREE.ShaderDeferred[ "composite" ];
+
+	this.unlitShader.uniforms[ "viewWidth" ].value = width;
+	this.unlitShader.uniforms[ "viewHeight" ].value = height;
+
+	this.lightShader.uniforms[ "viewWidth" ].value = width;
+	this.lightShader.uniforms[ "viewHeight" ].value = height;
+
+	var matNormal = new THREE.ShaderMaterial( {
+
+		uniforms:       THREE.UniformsUtils.clone( normalShader.uniforms ),
+		vertexShader:   normalShader.vertexShader,
+		fragmentShader: normalShader.fragmentShader
+
+	} );
+
+	var matClipDepth = new THREE.ShaderMaterial( {
+
+		uniforms:       THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
+		vertexShader:   clipDepthShader.vertexShader,
+		fragmentShader: clipDepthShader.fragmentShader
+
+	} );
+
+	this.addDeferredMaterials = function ( object ) {
+
+		object.traverse( function( node ) {
+
+			if ( !node.material ) return;
+
+			var originalMaterial = node.material;
+
+			// 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 material = new THREE.ShaderMaterial( {
+
+				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;
+
+			uniforms.diffuse.value.copy( diffuse );
+			uniforms.specular.value.copy( specular );
+			uniforms.shininess.value = shininess;
+
+			uniforms.map.value = originalMaterial.map;
+
+			material.vertexColors = originalMaterial.vertexColors;
+			material.morphTargets = originalMaterial.morphTargets;
+			material.morphNormals = originalMaterial.morphNormals;
+
+			material.alphaTest = originalMaterial.alphaTest;
+
+			if ( originalMaterial.bumpMap ) {
+
+				var offset = originalMaterial.bumpMap.offset;
+				var repeat = originalMaterial.bumpMap.repeat;
+
+				uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
+
+			}
+
+			node.properties.colorMaterial = material;
+
+			// normal material
+			//	vertex normals
+			//	morph normals
+			//	bump map
+			//	bump scale
+
+			if ( originalMaterial.bumpMap ) {
+
+				var uniforms = THREE.UniformsUtils.clone( bumpShader.uniforms );
+
+				var normalMaterial = new THREE.ShaderMaterial( {
+
+					uniforms: 		uniforms,
+					vertexShader: 	bumpShader.vertexShader,
+					fragmentShader: bumpShader.fragmentShader,
+					defines:		{ "USE_BUMPMAP": true }
+
+				} );
+
+				uniforms.bumpMap.value = originalMaterial.bumpMap;
+				uniforms.bumpScale.value = originalMaterial.bumpScale;
+
+				var offset = originalMaterial.bumpMap.offset;
+				var repeat = originalMaterial.bumpMap.repeat;
+
+				uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
+
+				node.properties.normalMaterial = normalMaterial;
+
+			} else if ( originalMaterial.morphTargets ) {
+
+				var normalMaterial = new THREE.ShaderMaterial( {
+
+					uniforms:       THREE.UniformsUtils.clone( normalShader.uniforms ),
+					vertexShader:   normalShader.vertexShader,
+					fragmentShader: normalShader.fragmentShader,
+					shading:		originalMaterial.shading
+
+				} );
+
+				normalMaterial.morphTargets = originalMaterial.morphTargets;
+				normalMaterial.morphNormals = originalMaterial.morphNormals;
+
+				node.properties.normalMaterial = normalMaterial;
+
+			} else {
+
+				node.properties.normalMaterial = matNormal;
+
+			}
+
+			// depth material
+
+			if ( originalMaterial.morphTargets ) {
+
+				var depthMaterial = new THREE.ShaderMaterial( {
+
+					uniforms:       THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
+					vertexShader:   clipDepthShader.vertexShader,
+					fragmentShader: clipDepthShader.fragmentShader
+
+				} );
+
+				depthMaterial.morphTargets = originalMaterial.morphTargets;
+
+				node.properties.depthMaterial = depthMaterial;
+
+			} else {
+
+				node.properties.depthMaterial = matClipDepth;
+
+			}
+
+		} );
+
+	}
+
+};

+ 19 - 192
examples/webgl_lights_deferred_morphs.html

@@ -52,6 +52,7 @@
 		<script src="js/Detector.js"></script>
 		<script src="js/Detector.js"></script>
 
 
 		<script src="js/ShaderDeferred.js"></script>
 		<script src="js/ShaderDeferred.js"></script>
+		<script src="js/DeferredHelper.js"></script>
 
 
 		<script src="js/shaders/CopyShader.js"></script>
 		<script src="js/shaders/CopyShader.js"></script>
 		<script src="js/shaders/FXAAShader.js"></script>
 		<script src="js/shaders/FXAAShader.js"></script>
@@ -110,11 +111,6 @@
 			var compColor, compNormals, compDepth, compLightBuffer, compFinal, compEmitter, compositePass;
 			var compColor, compNormals, compDepth, compLightBuffer, compFinal, compEmitter, compositePass;
 			var effectFXAA;
 			var effectFXAA;
 
 
-			// materials
-
-			var colorShader, normalShader, bumpShader, clipDepthShader, lightShader, unlitShader, compositeShader;
-			var matNormal, matClipDepth, matBasic, matUnlit;
-
 			// lights
 			// lights
 
 
 			var numLights = 50;
 			var numLights = 50;
@@ -184,6 +180,10 @@
 
 
 				clock = new THREE.Clock();
 				clock = new THREE.Clock();
 
 
+				// deferred helper
+
+				deferredHelper = new THREE.DeferredHelper( { width: SCALED_WIDTH, height: SCALED_HEIGHT } );
+
 			}
 			}
 
 
 			// -----------------------------
 			// -----------------------------
@@ -246,10 +246,10 @@
 				compLightBuffer = new THREE.EffectComposer( renderer, rtLight );
 				compLightBuffer = new THREE.EffectComposer( renderer, rtLight );
 				compLightBuffer.addPass( passLight );
 				compLightBuffer.addPass( passLight );
 
 
-				lightShader.uniforms[ 'samplerColor' ].value = compColor.renderTarget2;
-				lightShader.uniforms[ 'samplerNormals' ].value = compNormals.renderTarget2;
-				lightShader.uniforms[ 'samplerDepth' ].value = compDepth.renderTarget2;
-				lightShader.uniforms[ 'samplerLightBuffer' ].value = rtLight;
+				deferredHelper.lightShader.uniforms[ 'samplerColor' ].value = compColor.renderTarget2;
+				deferredHelper.lightShader.uniforms[ 'samplerNormals' ].value = compNormals.renderTarget2;
+				deferredHelper.lightShader.uniforms[ 'samplerDepth' ].value = compDepth.renderTarget2;
+				deferredHelper.lightShader.uniforms[ 'samplerLightBuffer' ].value = rtLight;
 
 
 				var geomEmitter = new THREE.SphereGeometry( 0.7, 7, 7 );
 				var geomEmitter = new THREE.SphereGeometry( 0.7, 7, 7 );
 
 
@@ -261,9 +261,9 @@
 
 
 					var matLight = new THREE.ShaderMaterial( {
 					var matLight = new THREE.ShaderMaterial( {
 
 
-						uniforms:       THREE.UniformsUtils.clone( lightShader.uniforms ),
-						vertexShader:   lightShader.vertexShader,
-						fragmentShader: lightShader.fragmentShader,
+						uniforms:       THREE.UniformsUtils.clone( deferredHelper.lightShader.uniforms ),
+						vertexShader:   deferredHelper.lightShader.vertexShader,
+						fragmentShader: deferredHelper.lightShader.fragmentShader,
 						defines:		{ "ADDITIVE_SPECULAR": true },
 						defines:		{ "ADDITIVE_SPECULAR": true },
 
 
 						blending:		THREE.AdditiveBlending,
 						blending:		THREE.AdditiveBlending,
@@ -287,9 +287,9 @@
 
 
 					var matEmitter = new THREE.ShaderMaterial( {
 					var matEmitter = new THREE.ShaderMaterial( {
 
 
-						uniforms:       THREE.UniformsUtils.clone( unlitShader.uniforms ),
-						vertexShader:   unlitShader.vertexShader,
-						fragmentShader: unlitShader.fragmentShader
+						uniforms:       THREE.UniformsUtils.clone( deferredHelper.unlitShader.uniforms ),
+						vertexShader:   deferredHelper.unlitShader.vertexShader,
+						fragmentShader: deferredHelper.unlitShader.fragmentShader
 
 
 					} );
 					} );
 
 
@@ -307,10 +307,10 @@
 				// composite
 				// composite
 				// ----------------------------------------------------------
 				// ----------------------------------------------------------
 
 
-				compositeShader.uniforms[ 'samplerLightBuffer' ].value = compLightBuffer.renderTarget2;
-				compositeShader.uniforms[ 'samplerEmitter' ].value = compEmitter.renderTarget2;
+				deferredHelper.compositeShader.uniforms[ 'samplerLightBuffer' ].value = compLightBuffer.renderTarget2;
+				deferredHelper.compositeShader.uniforms[ 'samplerEmitter' ].value = compEmitter.renderTarget2;
 
 
-				compositePass = new THREE.ShaderPass( compositeShader );
+				compositePass = new THREE.ShaderPass( deferredHelper.compositeShader );
 				compositePass.needsSwap = true;
 				compositePass.needsSwap = true;
 
 
 				effectFXAA = new THREE.ShaderPass( THREE.FXAAShader );
 				effectFXAA = new THREE.ShaderPass( THREE.FXAAShader );
@@ -332,135 +332,7 @@
 
 
 			function initScene( object, y, scale ) {
 			function initScene( object, y, scale ) {
 
 
-				var black = new THREE.Color( 0x000000 );
-
-				object.traverse( function( node ) {
-
-					if ( node.material ) {
-
-						// color material
-
-						var uniforms = THREE.UniformsUtils.clone( colorShader.uniforms );
-						var defines = { "USE_MAP": !!node.material.map, "GAMMA_INPUT": true };
-
-						var material = new THREE.ShaderMaterial( {
-
-							fragmentShader: colorShader.fragmentShader,
-							vertexShader: 	colorShader.vertexShader,
-							uniforms: 		uniforms,
-							defines: 		defines,
-							shading:		node.material.shading
-
-						} );
-
-						var diffuse = node.material.color;
-						var specular = node.material.specular !== undefined ? node.material.specular : black;
-						var shininess = node.material.shininess !== undefined ? node.material.shininess : 1;
-
-						uniforms.diffuse.value.copy( diffuse );
-						uniforms.specular.value.copy( specular );
-						uniforms.shininess.value = shininess;
-
-						uniforms.map.value = node.material.map;
-
-						material.vertexColors = node.material.vertexColors;
-						material.morphTargets = node.material.morphTargets;
-						material.morphNormals = node.material.morphNormals;
-
-						if ( node.material.bumpMap ) {
-
-							var offset = node.material.bumpMap.offset;
-							var repeat = node.material.bumpMap.repeat;
-
-							uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
-
-						}
-
-						if ( node.material.transparent ) {
-
-							material.alphaTest = 0.1;
-
-						}
-
-						if ( node.material.name === "eyetrans" ) {
-
-							material.visible = false;
-
-						}
-
-						node.properties.colorMaterial = material;
-
-						// normal material
-
-						if ( node.material.bumpMap ) {
-
-							var uniforms = THREE.UniformsUtils.clone( bumpShader.uniforms );
-
-							var normalMaterial = new THREE.ShaderMaterial( {
-
-								uniforms: 		uniforms,
-								vertexShader: 	bumpShader.vertexShader,
-								fragmentShader: bumpShader.fragmentShader,
-								defines:		{ "USE_BUMPMAP": true }
-
-							} );
-
-							uniforms.bumpMap.value = node.material.bumpMap;
-							uniforms.bumpScale.value = node.material.bumpScale;
-
-							var offset = node.material.bumpMap.offset;
-							var repeat = node.material.bumpMap.repeat;
-
-							uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
-
-							node.properties.normalMaterial = normalMaterial;
-
-						} else if ( node.material.morphTargets ) {
-
-							var normalMaterial = new THREE.ShaderMaterial( {
-
-								uniforms:       THREE.UniformsUtils.clone( normalShader.uniforms ),
-								vertexShader:   normalShader.vertexShader,
-								fragmentShader: normalShader.fragmentShader,
-								shading:		node.material.shading
-
-							} );
-
-							normalMaterial.morphTargets = node.material.morphTargets;
-							normalMaterial.morphNormals = node.material.morphNormals;
-							node.properties.normalMaterial = normalMaterial;
-
-						} else {
-
-							node.properties.normalMaterial = matNormal;
-
-						}
-
-						// depth material
-
-						if ( node.material.morphTargets ) {
-
-							var depthMaterial = new THREE.ShaderMaterial( {
-
-								uniforms:       THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
-								vertexShader:   clipDepthShader.vertexShader,
-								fragmentShader: clipDepthShader.fragmentShader
-
-							} );
-
-							depthMaterial.morphTargets = node.material.morphTargets;
-
-							node.properties.depthMaterial = depthMaterial;
-
-						} else {
-
-							node.properties.depthMaterial = matClipDepth;
-
-						}
-
-					}
-
-				} );
+				deferredHelper.addDeferredMaterials( object );
 
 
 				object.position.y = y;
 				object.position.y = y;
 				object.scale.set( scale, scale, scale );
 				object.scale.set( scale, scale, scale );
@@ -470,50 +342,6 @@
 
 
 			// -----------------------------
 			// -----------------------------
 
 
-			function initMaterials() {
-
-				// -----------------------
-				// shader definitions
-				// -----------------------
-
-				colorShader = THREE.ShaderDeferred[ "color" ];
-				normalShader = THREE.ShaderDeferred[ "normals" ];
-				bumpShader = THREE.ShaderDeferred[ "bump" ];
-				clipDepthShader = THREE.ShaderDeferred[ "clipDepth" ];
-				unlitShader = THREE.ShaderDeferred[ "unlit" ];
-				lightShader = THREE.ShaderDeferred[ "light" ];
-				compositeShader = THREE.ShaderDeferred[ "composite" ];
-
-				unlitShader.uniforms[ "viewWidth" ].value = SCALED_WIDTH;
-				unlitShader.uniforms[ "viewHeight" ].value = SCALED_HEIGHT;
-
-				lightShader.uniforms[ "viewWidth" ].value = SCALED_WIDTH;
-				lightShader.uniforms[ "viewHeight" ].value = SCALED_HEIGHT;
-
-				// -----------------------
-				// default materials
-				// -----------------------
-
-				matNormal = new THREE.ShaderMaterial( {
-
-					uniforms:       THREE.UniformsUtils.clone( normalShader.uniforms ),
-					vertexShader:   normalShader.vertexShader,
-					fragmentShader: normalShader.fragmentShader
-
-				} );
-
-				matClipDepth = new THREE.ShaderMaterial({
-
-					uniforms:       THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
-					vertexShader:   clipDepthShader.vertexShader,
-					fragmentShader: clipDepthShader.fragmentShader
-
-				});
-
-			}
-
-			// -----------------------------
-
 			function initLights() {
 			function initLights() {
 
 
 				var distance = 40;
 				var distance = 40;
@@ -798,7 +626,6 @@
 			// -----------------------------
 			// -----------------------------
 
 
 			bootstrap();
 			bootstrap();
-			initMaterials();
 			initLights();
 			initLights();
 			createRenderTargets();
 			createRenderTargets();
 
 

+ 21 - 151
examples/webgl_lights_deferred_pointlights.html

@@ -51,6 +51,7 @@
 		<script src="js/libs/stats.min.js"></script>
 		<script src="js/libs/stats.min.js"></script>
 
 
 		<script src="js/ShaderDeferred.js"></script>
 		<script src="js/ShaderDeferred.js"></script>
+		<script src="js/DeferredHelper.js"></script>
 
 
 		<script src="js/shaders/CopyShader.js"></script>
 		<script src="js/shaders/CopyShader.js"></script>
 		<script src="js/shaders/FXAAShader.js"></script>
 		<script src="js/shaders/FXAAShader.js"></script>
@@ -113,10 +114,7 @@
 			var compColor, compNormals, compDepth, compLightBuffer, compFinal, compEmitter, compositePass;
 			var compColor, compNormals, compDepth, compLightBuffer, compFinal, compEmitter, compositePass;
 			var effectFXAA;
 			var effectFXAA;
 
 
-			// materials
-
-			var colorShader, normalShader, bumpShader, clipDepthShader, lightShader, unlitShader, compositeShader;
-			var matNormal, matClipDepth, matBasic, matUnlit;
+			// lights
 
 
 			var numLights = 50;
 			var numLights = 50;
 			var lights = new Array();
 			var lights = new Array();
@@ -183,6 +181,10 @@
 
 
 				clock = new THREE.Clock();
 				clock = new THREE.Clock();
 
 
+				// deferred helper
+
+				deferredHelper = new THREE.DeferredHelper( { width: SCALED_WIDTH, height: SCALED_HEIGHT } );
+
 			}
 			}
 
 
 			// -----------------------------
 			// -----------------------------
@@ -245,10 +247,10 @@
 				compLightBuffer = new THREE.EffectComposer( renderer, rtLight );
 				compLightBuffer = new THREE.EffectComposer( renderer, rtLight );
 				compLightBuffer.addPass( passLight );
 				compLightBuffer.addPass( passLight );
 
 
-				lightShader.uniforms[ 'samplerColor' ].value = compColor.renderTarget2;
-				lightShader.uniforms[ 'samplerNormals' ].value = compNormals.renderTarget2;
-				lightShader.uniforms[ 'samplerDepth' ].value = compDepth.renderTarget2;
-				lightShader.uniforms[ 'samplerLightBuffer' ].value = rtLight;
+				deferredHelper.lightShader.uniforms[ 'samplerColor' ].value = compColor.renderTarget2;
+				deferredHelper.lightShader.uniforms[ 'samplerNormals' ].value = compNormals.renderTarget2;
+				deferredHelper.lightShader.uniforms[ 'samplerDepth' ].value = compDepth.renderTarget2;
+				deferredHelper.lightShader.uniforms[ 'samplerLightBuffer' ].value = rtLight;
 
 
 				var geomEmitter = new THREE.SphereGeometry( 0.7, 7, 7 );
 				var geomEmitter = new THREE.SphereGeometry( 0.7, 7, 7 );
 
 
@@ -260,9 +262,9 @@
 
 
 					var matLight = new THREE.ShaderMaterial( {
 					var matLight = new THREE.ShaderMaterial( {
 
 
-						uniforms:       THREE.UniformsUtils.clone( lightShader.uniforms ),
-						vertexShader:   lightShader.vertexShader,
-						fragmentShader: lightShader.fragmentShader,
+						uniforms:       THREE.UniformsUtils.clone( deferredHelper.lightShader.uniforms ),
+						vertexShader:   deferredHelper.lightShader.vertexShader,
+						fragmentShader: deferredHelper.lightShader.fragmentShader,
 						defines:		{ "ADDITIVE_SPECULAR": false },
 						defines:		{ "ADDITIVE_SPECULAR": false },
 
 
 						blending:		THREE.AdditiveBlending,
 						blending:		THREE.AdditiveBlending,
@@ -286,9 +288,9 @@
 
 
 					var matEmitter = new THREE.ShaderMaterial( {
 					var matEmitter = new THREE.ShaderMaterial( {
 
 
-						uniforms:       THREE.UniformsUtils.clone( unlitShader.uniforms ),
-						vertexShader:   unlitShader.vertexShader,
-						fragmentShader: unlitShader.fragmentShader
+						uniforms:       THREE.UniformsUtils.clone( deferredHelper.unlitShader.uniforms ),
+						vertexShader:   deferredHelper.unlitShader.vertexShader,
+						fragmentShader: deferredHelper.unlitShader.fragmentShader
 
 
 					} );
 					} );
 
 
@@ -306,10 +308,10 @@
 				// composite
 				// composite
 				// ----------------------------------------------------------
 				// ----------------------------------------------------------
 
 
-				compositeShader.uniforms[ 'samplerLightBuffer' ].value = compLightBuffer.renderTarget2;
-				compositeShader.uniforms[ 'samplerEmitter' ].value = compEmitter.renderTarget2;
+				deferredHelper.compositeShader.uniforms[ 'samplerLightBuffer' ].value = compLightBuffer.renderTarget2;
+				deferredHelper.compositeShader.uniforms[ 'samplerEmitter' ].value = compEmitter.renderTarget2;
 
 
-				compositePass = new THREE.ShaderPass( compositeShader );
+				compositePass = new THREE.ShaderPass( deferredHelper.compositeShader );
 				compositePass.needsSwap = true;
 				compositePass.needsSwap = true;
 				//compositePass.renderToScreen = true;
 				//compositePass.renderToScreen = true;
 
 
@@ -336,143 +338,12 @@
 
 
 			function initScene( object, y, scale ) {
 			function initScene( object, y, scale ) {
 
 
-				var black = new THREE.Color( 0x000000 );
-
-				object.traverse( function( node ) {
-
-					if ( node.material ) {
-
-						// color material
-
-						var uniforms = THREE.UniformsUtils.clone( colorShader.uniforms );
-						var defines = { "USE_MAP": !!node.material.map, "GAMMA_INPUT": true };
-
-						var material = new THREE.ShaderMaterial( {
-
-							fragmentShader: colorShader.fragmentShader,
-							vertexShader: 	colorShader.vertexShader,
-							uniforms: 		uniforms,
-							defines: 		defines
-
-						} );
-
-						var diffuse = node.material.color;
-						var specular = node.material.specular !== undefined ? node.material.specular : black;
-						var shininess = node.material.shininess !== undefined ? node.material.shininess : 1;
-
-						uniforms.diffuse.value.copy( diffuse );
-						uniforms.specular.value.copy( specular );
-						uniforms.shininess.value = shininess;
-
-						uniforms.map.value = node.material.map;
-
-						if ( node.material.bumpMap ) {
-
-							var offset = node.material.bumpMap.offset;
-							var repeat = node.material.bumpMap.repeat;
-
-							uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
-
-						}
-
-						if ( node.material.transparent ) {
-
-							material.alphaTest = 0.1;
-
-						}
-
-						if ( node.material.name === "eyetrans" ) {
-
-							material.visible = false;
-
-						}
-
-						node.properties.colorMaterial = material;
-
-						// normal material
-
-						if ( node.material.bumpMap ) {
-
-							var uniforms = THREE.UniformsUtils.clone( bumpShader.uniforms );
-							var normalMaterial = new THREE.ShaderMaterial( {
-
-								uniforms: 		uniforms,
-								vertexShader: 	bumpShader.vertexShader,
-								fragmentShader: bumpShader.fragmentShader,
-								defines:		{ "USE_BUMPMAP": true }
-
-							} );
-							uniforms.bumpMap.value = node.material.bumpMap;
-							uniforms.bumpScale.value = node.material.bumpScale;
-
-							var offset = node.material.bumpMap.offset;
-							var repeat = node.material.bumpMap.repeat;
-
-							uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
-
-							node.properties.normalMaterial = normalMaterial;
-
-						} else {
-
-							node.properties.normalMaterial = matNormal;
-
-						}
-
-						// depth material
-
-						node.properties.depthMaterial = matClipDepth;
-
-					}
-
-				} );
+				deferredHelper.addDeferredMaterials( object );
 
 
 				object.position.y = y;
 				object.position.y = y;
 				object.scale.set( scale, scale, scale );
 				object.scale.set( scale, scale, scale );
-				sceneNode.add( object );
-
-			}
-
-			// -----------------------------
-
-			function initMaterials() {
-
-				// -----------------------
-				// shader definitions
-				// -----------------------
-
-				colorShader = THREE.ShaderDeferred[ "color" ];
-				normalShader = THREE.ShaderDeferred[ "normals" ];
-				bumpShader = THREE.ShaderDeferred[ "bump" ];
-				clipDepthShader = THREE.ShaderDeferred[ "clipDepth" ];
-				unlitShader = THREE.ShaderDeferred[ "unlit" ];
-				lightShader = THREE.ShaderDeferred[ "light" ];
-				compositeShader = THREE.ShaderDeferred[ "composite" ];
-
-				unlitShader.uniforms[ "viewWidth" ].value = SCALED_WIDTH;
-				unlitShader.uniforms[ "viewHeight" ].value = SCALED_HEIGHT;
-
-				lightShader.uniforms[ "viewWidth" ].value = SCALED_WIDTH;
-				lightShader.uniforms[ "viewHeight" ].value = SCALED_HEIGHT;
-
-				// -----------------------
-				// default materials
-				// -----------------------
-
-				matNormal = new THREE.ShaderMaterial( {
 
 
-					uniforms:       THREE.UniformsUtils.clone( normalShader.uniforms ),
-					vertexShader:   normalShader.vertexShader,
-					fragmentShader: normalShader.fragmentShader
-
-				} );
-
-				matClipDepth = new THREE.ShaderMaterial( {
-
-					uniforms:       THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
-					vertexShader:   clipDepthShader.vertexShader,
-					fragmentShader: clipDepthShader.fragmentShader
-
-				} );
+				sceneNode.add( object );
 
 
 			}
 			}
 
 
@@ -751,7 +622,6 @@
 			// -----------------------------
 			// -----------------------------
 
 
 			bootstrap();
 			bootstrap();
-			initMaterials();
 			initLights();
 			initLights();
 			createRenderTargets();
 			createRenderTargets();