|
@@ -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 );
|
|
|
|