|
@@ -23,7 +23,7 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
|
|
|
this.renderer = new THREE.WebGLRenderer( { alpha: false } );
|
|
|
this.renderer.setSize( width, height );
|
|
|
- this.renderer.setClearColorHex( 0x000000, 1 );
|
|
|
+ this.renderer.setClearColorHex( 0x000000, 0 );
|
|
|
|
|
|
this.renderer.autoClear = false;
|
|
|
|
|
@@ -39,8 +39,7 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
var black = new THREE.Color( 0x000000 );
|
|
|
|
|
|
var colorShader = THREE.ShaderDeferred[ "color" ];
|
|
|
- var normalShader = THREE.ShaderDeferred[ "normals" ];
|
|
|
- var clipDepthShader = THREE.ShaderDeferred[ "clipDepth" ];
|
|
|
+ var normalDepthShader = THREE.ShaderDeferred[ "normalDepth" ];
|
|
|
|
|
|
//
|
|
|
|
|
@@ -64,19 +63,11 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
|
|
|
//
|
|
|
|
|
|
- var defaultNormalMaterial = new THREE.ShaderMaterial( {
|
|
|
+ var defaultNormalDepthMaterial = new THREE.ShaderMaterial( {
|
|
|
|
|
|
- uniforms: THREE.UniformsUtils.clone( normalShader.uniforms ),
|
|
|
- vertexShader: normalShader.vertexShader,
|
|
|
- fragmentShader: normalShader.fragmentShader
|
|
|
-
|
|
|
- } );
|
|
|
-
|
|
|
- var defaultDepthMaterial = new THREE.ShaderMaterial( {
|
|
|
-
|
|
|
- uniforms: THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
|
|
|
- vertexShader: clipDepthShader.vertexShader,
|
|
|
- fragmentShader: clipDepthShader.fragmentShader
|
|
|
+ uniforms: THREE.UniformsUtils.clone( normalDepthShader.uniforms ),
|
|
|
+ vertexShader: normalDepthShader.vertexShader,
|
|
|
+ fragmentShader: normalDepthShader.fragmentShader
|
|
|
|
|
|
} );
|
|
|
|
|
@@ -87,8 +78,7 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
if ( object.material instanceof THREE.MeshFaceMaterial ) {
|
|
|
|
|
|
var colorMaterials = [];
|
|
|
- var depthMaterials = [];
|
|
|
- var normalMaterials = [];
|
|
|
+ var normalDepthMaterials = [];
|
|
|
|
|
|
var materials = object.material.materials;
|
|
|
|
|
@@ -97,22 +87,19 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
var deferredMaterials = createDeferredMaterials( materials[ i ] );
|
|
|
|
|
|
colorMaterials.push( deferredMaterials.colorMaterial );
|
|
|
- depthMaterials.push( deferredMaterials.depthMaterial );
|
|
|
- normalMaterials.push( deferredMaterials.normalMaterial );
|
|
|
+ normalDepthMaterials.push( deferredMaterials.normalDepthMaterial );
|
|
|
|
|
|
}
|
|
|
|
|
|
object.properties.colorMaterial = new THREE.MeshFaceMaterial( colorMaterials );
|
|
|
- object.properties.depthMaterial = new THREE.MeshFaceMaterial( depthMaterials );
|
|
|
- object.properties.normalMaterial = new THREE.MeshFaceMaterial( normalMaterials );
|
|
|
+ object.properties.normalDepthMaterial = new THREE.MeshFaceMaterial( normalDepthMaterials );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
var deferredMaterials = createDeferredMaterials( object.material );
|
|
|
|
|
|
object.properties.colorMaterial = deferredMaterials.colorMaterial;
|
|
|
- object.properties.depthMaterial = deferredMaterials.depthMaterial;
|
|
|
- object.properties.normalMaterial = deferredMaterials.normalMaterial;
|
|
|
+ object.properties.normalDepthMaterial = deferredMaterials.normalDepthMaterial;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -185,32 +172,34 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
|
|
|
deferredMaterials.colorMaterial = material;
|
|
|
|
|
|
- // normal material
|
|
|
+ // normal + depth material
|
|
|
// -----------------
|
|
|
// vertex normals
|
|
|
// morph normals
|
|
|
// bump map
|
|
|
// bump scale
|
|
|
+ // clip depth
|
|
|
|
|
|
if ( originalMaterial.morphTargets || originalMaterial.bumpMap ) {
|
|
|
|
|
|
- var uniforms = THREE.UniformsUtils.clone( normalShader.uniforms );
|
|
|
+ var uniforms = THREE.UniformsUtils.clone( normalDepthShader.uniforms );
|
|
|
var defines = { "USE_BUMPMAP": !!originalMaterial.bumpMap };
|
|
|
|
|
|
- var normalMaterial = new THREE.ShaderMaterial( {
|
|
|
+ var normalDepthMaterial = new THREE.ShaderMaterial( {
|
|
|
|
|
|
uniforms: uniforms,
|
|
|
- vertexShader: normalShader.vertexShader,
|
|
|
- fragmentShader: normalShader.fragmentShader,
|
|
|
+ vertexShader: normalDepthShader.vertexShader,
|
|
|
+ fragmentShader: normalDepthShader.fragmentShader,
|
|
|
shading: originalMaterial.shading,
|
|
|
- defines: defines
|
|
|
+ defines: defines,
|
|
|
+ blending: THREE.NoBlending
|
|
|
|
|
|
} );
|
|
|
|
|
|
if ( originalMaterial.morphTargets ) {
|
|
|
|
|
|
- normalMaterial.morphTargets = originalMaterial.morphTargets;
|
|
|
- normalMaterial.morphNormals = originalMaterial.morphNormals;
|
|
|
+ normalDepthMaterial.morphTargets = originalMaterial.morphTargets;
|
|
|
+ normalDepthMaterial.morphNormals = originalMaterial.morphNormals;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -226,33 +215,11 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- deferredMaterials.normalMaterial = normalMaterial;
|
|
|
+ deferredMaterials.normalDepthMaterial = normalDepthMaterial;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- deferredMaterials.normalMaterial = defaultNormalMaterial;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // 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;
|
|
|
-
|
|
|
- deferredMaterials.depthMaterial = depthMaterial;
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- deferredMaterials.depthMaterial = defaultDepthMaterial;
|
|
|
+ deferredMaterials.normalDepthMaterial = defaultNormalDepthMaterial;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -286,8 +253,7 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
materialLight.uniforms[ "viewHeight" ].value = scaledHeight;
|
|
|
|
|
|
materialLight.uniforms[ 'samplerColor' ].value = compColor.renderTarget2;
|
|
|
- materialLight.uniforms[ 'samplerNormals' ].value = compNormal.renderTarget2;
|
|
|
- materialLight.uniforms[ 'samplerDepth' ].value = compDepth.renderTarget2;
|
|
|
+ materialLight.uniforms[ 'samplerNormalDepth' ].value = compNormalDepth.renderTarget2;
|
|
|
|
|
|
// create light proxy mesh
|
|
|
|
|
@@ -328,8 +294,7 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
materialLight.uniforms[ "viewHeight" ].value = scaledHeight;
|
|
|
|
|
|
materialLight.uniforms[ 'samplerColor' ].value = compColor.renderTarget2;
|
|
|
- materialLight.uniforms[ 'samplerDepth' ].value = compDepth.renderTarget2;
|
|
|
- materialLight.uniforms[ 'samplerNormals' ].value = compNormal.renderTarget2;
|
|
|
+ materialLight.uniforms[ 'samplerNormalDepth' ].value = compNormalDepth.renderTarget2;
|
|
|
|
|
|
// create light proxy mesh
|
|
|
|
|
@@ -354,7 +319,8 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
vertexShader: emissiveLightShader.vertexShader,
|
|
|
fragmentShader: emissiveLightShader.fragmentShader,
|
|
|
depthTest: false,
|
|
|
- depthWrite: false
|
|
|
+ depthWrite: false,
|
|
|
+ blending: THREE.NoBlending
|
|
|
|
|
|
} );
|
|
|
|
|
@@ -363,7 +329,7 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
materialLight.uniforms[ "viewHeight" ].value = scaledHeight;
|
|
|
|
|
|
materialLight.uniforms[ 'samplerColor' ].value = compColor.renderTarget2;
|
|
|
- materialLight.uniforms[ 'samplerDepth' ].value = compDepth.renderTarget2;
|
|
|
+ materialLight.uniforms[ 'samplerNormalDepth' ].value = compNormalDepth.renderTarget2;
|
|
|
|
|
|
// create light proxy mesh
|
|
|
|
|
@@ -408,15 +374,9 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
- var setMaterialDepth = function ( object ) {
|
|
|
-
|
|
|
- if ( object.material ) object.material = object.properties.depthMaterial;
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
- var setMaterialNormal = function ( object ) {
|
|
|
+ var setMaterialNormalDepth = function ( object ) {
|
|
|
|
|
|
- if ( object.material ) object.material = object.properties.normalMaterial;
|
|
|
+ if ( object.material ) object.material = object.properties.normalDepthMaterial;
|
|
|
|
|
|
};
|
|
|
|
|
@@ -430,8 +390,7 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
scaledHeight = Math.floor( scale * height );
|
|
|
|
|
|
compColor.setSize( scaledWidth, scaledHeight );
|
|
|
- compNormal.setSize( scaledWidth, scaledHeight );
|
|
|
- compDepth.setSize( scaledWidth, scaledHeight );
|
|
|
+ compNormalDepth.setSize( scaledWidth, scaledHeight );
|
|
|
compLight.setSize( scaledWidth, scaledHeight );
|
|
|
compFinal.setSize( scaledWidth, scaledHeight );
|
|
|
|
|
@@ -443,11 +402,10 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
uniforms[ "viewHeight" ].value = scaledHeight;
|
|
|
|
|
|
uniforms[ 'samplerColor' ].value = compColor.renderTarget2;
|
|
|
- uniforms[ 'samplerDepth' ].value = compDepth.renderTarget2;
|
|
|
|
|
|
- if ( uniforms[ 'samplerNormals' ] ) {
|
|
|
+ if ( uniforms[ 'samplerNormalDepth' ] ) {
|
|
|
|
|
|
- uniforms[ 'samplerNormals' ].value = compNormal.renderTarget2;
|
|
|
+ uniforms[ 'samplerNormalDepth' ].value = compNormalDepth.renderTarget2;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -479,19 +437,19 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
lightSceneFullscreen = scene.properties.lightSceneFullscreen;
|
|
|
|
|
|
passColor.camera = camera;
|
|
|
- passNormal.camera = camera;
|
|
|
- passDepth.camera = camera;
|
|
|
+ passNormalDepth.camera = camera;
|
|
|
passLightProxy.camera = camera;
|
|
|
passLightFullscreen.camera = THREE.EffectComposer.camera;
|
|
|
|
|
|
passColor.scene = scene;
|
|
|
- passNormal.scene = scene;
|
|
|
- passDepth.scene = scene;
|
|
|
+ passNormalDepth.scene = scene;
|
|
|
passLightFullscreen.scene = lightSceneFullscreen;
|
|
|
passLightProxy.scene = lightSceneProxy;
|
|
|
|
|
|
scene.traverse( initDeferredProperties );
|
|
|
|
|
|
+ // update scene graph only once per frame
|
|
|
+
|
|
|
this.renderer.autoUpdateScene = false;
|
|
|
scene.updateMatrixWorld();
|
|
|
|
|
@@ -500,15 +458,10 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
scene.traverse( setMaterialColor );
|
|
|
compColor.render();
|
|
|
|
|
|
- // g-buffer depth
|
|
|
-
|
|
|
- scene.traverse( setMaterialDepth );
|
|
|
- compDepth.render();
|
|
|
+ // g-buffer normals + depth
|
|
|
|
|
|
- // g-buffer normals
|
|
|
-
|
|
|
- scene.traverse( setMaterialNormal );
|
|
|
- compNormal.render();
|
|
|
+ scene.traverse( setMaterialNormalDepth );
|
|
|
+ compNormalDepth.render();
|
|
|
|
|
|
this.renderer.autoUpdateScene = true;
|
|
|
|
|
@@ -555,32 +508,36 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
// g-buffers
|
|
|
|
|
|
var rtColor = new THREE.WebGLRenderTarget( scaledWidth, scaledHeight, rtParamsFloatNearest );
|
|
|
- var rtNormal = new THREE.WebGLRenderTarget( scaledWidth, scaledHeight, rtParamsFloatLinear );
|
|
|
- var rtDepth = new THREE.WebGLRenderTarget( scaledWidth, scaledHeight, rtParamsFloatLinear );
|
|
|
+ var rtNormalDepth = new THREE.WebGLRenderTarget( scaledWidth, scaledHeight, rtParamsFloatLinear );
|
|
|
var rtLight = new THREE.WebGLRenderTarget( scaledWidth, scaledHeight, rtParamsFloatLinear );
|
|
|
var rtFinal = new THREE.WebGLRenderTarget( scaledWidth, scaledHeight, rtParamsUByte );
|
|
|
|
|
|
rtColor.generateMipmaps = false;
|
|
|
- rtNormal.generateMipmaps = false;
|
|
|
- rtDepth.generateMipmaps = false;
|
|
|
+ rtNormalDepth.generateMipmaps = false;
|
|
|
rtLight.generateMipmaps = false;
|
|
|
rtFinal.generateMipmaps = false;
|
|
|
|
|
|
- // composers
|
|
|
+ // color composer
|
|
|
|
|
|
passColor = new THREE.RenderPass();
|
|
|
+ passColor.clear = true;
|
|
|
+
|
|
|
compColor = new THREE.EffectComposer( _this.renderer, rtColor );
|
|
|
compColor.addPass( passColor );
|
|
|
|
|
|
- passNormal = new THREE.RenderPass();
|
|
|
- compNormal = new THREE.EffectComposer( _this.renderer, rtNormal );
|
|
|
- compNormal.addPass( passNormal );
|
|
|
+ // normal + depth composer
|
|
|
|
|
|
- passDepth = new THREE.RenderPass();
|
|
|
- compDepth = new THREE.EffectComposer( _this.renderer, rtDepth );
|
|
|
- compDepth.addPass( passDepth );
|
|
|
+ passNormalDepth = new THREE.RenderPass();
|
|
|
+ passNormalDepth.clear = true;
|
|
|
+
|
|
|
+ compNormalDepth = new THREE.EffectComposer( _this.renderer, rtNormalDepth );
|
|
|
+ compNormalDepth.addPass( passNormalDepth );
|
|
|
+
|
|
|
+ // light composer
|
|
|
|
|
|
passLightFullscreen = new THREE.RenderPass();
|
|
|
+ passLightFullscreen.clear = true;
|
|
|
+
|
|
|
passLightProxy = new THREE.RenderPass();
|
|
|
passLightProxy.clear = false;
|
|
|
|
|
@@ -588,11 +545,13 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
|
|
|
compLight.addPass( passLightFullscreen );
|
|
|
compLight.addPass( passLightProxy );
|
|
|
|
|
|
- // composite
|
|
|
+ // final composer
|
|
|
|
|
|
compositePass = new THREE.ShaderPass( compositeShader );
|
|
|
compositePass.uniforms[ 'samplerLight' ].value = compLight.renderTarget2;
|
|
|
compositePass.uniforms[ 'multiply' ].value = multiply;
|
|
|
+ compositePass.material.blending = THREE.NoBlending;
|
|
|
+ compositePass.clear = true;
|
|
|
|
|
|
// FXAA
|
|
|
|