From 80d3799c3bd20a2db66e8b5d3ab4480700ce9c43 Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Sun, 27 May 2018 14:54:53 +0200 Subject: [PATCH] BokehShader2: Fix Depth Sampling --- examples/js/cameras/CinematicCamera.js | 20 +++++--- examples/js/shaders/BokehShader2.js | 63 ++++++++++++++++++++----- examples/webgl_postprocessing_dof2.html | 32 ++++++++++--- 3 files changed, 91 insertions(+), 24 deletions(-) diff --git a/examples/js/cameras/CinematicCamera.js b/examples/js/cameras/CinematicCamera.js index 204af65e66..970fc24f8e 100644 --- a/examples/js/cameras/CinematicCamera.js +++ b/examples/js/cameras/CinematicCamera.js @@ -5,20 +5,28 @@ * @author kaypiKun */ -THREE.CinematicCamera = function( fov, aspect, near, far ) { +THREE.CinematicCamera = function ( fov, aspect, near, far ) { THREE.PerspectiveCamera.call( this, fov, aspect, near, far ); - this.type = "CinematicCamera"; + this.type = 'CinematicCamera'; - this.postprocessing = { enabled : true }; + this.postprocessing = { enabled: true }; this.shaderSettings = { rings: 3, samples: 4 }; - this.material_depth = new THREE.MeshDepthMaterial(); - this.material_depth.depthPacking = THREE.RGBADepthPacking; + var depthShader = THREE.BokehDepthShader; + + this.materialDepth = new THREE.ShaderMaterial( { + uniforms: depthShader.uniforms, + vertexShader: depthShader.vertexShader, + fragmentShader: depthShader.fragmentShader + } ); + + this.materialDepth.uniforms[ 'mNear' ].value = near; + this.materialDepth.uniforms[ 'mFar' ].value = far; // In case of cinematicCamera, having a default lens set is important this.setLens(); @@ -178,7 +186,7 @@ THREE.CinematicCamera.prototype.renderCinematic = function ( scene, renderer ) { // Render depth into texture - scene.overrideMaterial = this.material_depth; + scene.overrideMaterial = this.materialDepth; renderer.render( scene, camera, this.postprocessing.rtTextureDepth, true ); // Render bokeh composite diff --git a/examples/js/shaders/BokehShader2.js b/examples/js/shaders/BokehShader2.js index 8b8de9cce5..88c0697bb4 100644 --- a/examples/js/shaders/BokehShader2.js +++ b/examples/js/shaders/BokehShader2.js @@ -142,14 +142,6 @@ THREE.BokehShader = { "//------------------------------------------", - "float getDepth( const in vec2 screenPosition ) {", - " #if DEPTH_PACKING == 1", - " return unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );", - " #else", - " return texture2D( tDepth, screenPosition ).x;", - " #endif", - "}", - "float penta(vec2 coords) {", "//pentagonal shape", "float scale = float(rings) - 1.3;", @@ -211,7 +203,7 @@ THREE.BokehShader = { "for( int i=0; i<9; i++ ) {", - "float tmp = getDepth( coords + offset[ i ] );", + "float tmp = texture2D(tDepth, coords + offset[i]).r;", "d += tmp * kernel[i];", "}", @@ -273,10 +265,10 @@ THREE.BokehShader = { "void main() {", "//scene depth calculation", - "float depth = linearize( getDepth( vUv.xy ) );", + "float depth = linearize(texture2D(tDepth,vUv.xy).x);", "// Blur depth?", - "if (depthblur) {", + "if ( depthblur ) {", "depth = linearize(bdepth(vUv.xy));", "}", @@ -286,7 +278,7 @@ THREE.BokehShader = { "if (shaderFocus) {", - "fDepth = linearize( getDepth( focusCoords ) );", + "fDepth = linearize(texture2D(tDepth,focusCoords).x);", "}", @@ -363,3 +355,50 @@ THREE.BokehShader = { ].join( "\n" ) }; + +THREE.BokehDepthShader = { + + uniforms: { + + "mNear": { value: 1.0 }, + "mFar": { value: 1000.0 }, + + }, + + vertexShader: [ + + "#include ", + + "varying float vViewZDepth;", + + "void main() {", + + " #include ", + " #include ", + + " vViewZDepth = - mvPosition.z;", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform float mNear;", + "uniform float mFar;", + + "varying float vViewZDepth;", + + "#include ", + "#include ", + + "void main() {", + + " float color = 1.0 - smoothstep( mNear, mFar, vViewZDepth );", + " gl_FragColor = vec4( vec3( color ), 1.0 );", + + "} " + + ].join( "\n" ) + +}; diff --git a/examples/webgl_postprocessing_dof2.html b/examples/webgl_postprocessing_dof2.html index cfba0e3b40..fdc296ff44 100644 --- a/examples/webgl_postprocessing_dof2.html +++ b/examples/webgl_postprocessing_dof2.html @@ -96,9 +96,16 @@ Use WEBGL Depth buffer support? renderer.autoClear = false; container.appendChild( renderer.domElement ); - materialDepth = new THREE.MeshDepthMaterial(); - materialDepth.depthPacking = THREE.RGBADepthPacking; - materialDepth.blending = THREE.NoBlending; + var depthShader = THREE.BokehDepthShader; + + materialDepth = new THREE.ShaderMaterial( { + uniforms: depthShader.uniforms, + vertexShader: depthShader.vertexShader, + fragmentShader: depthShader.fragmentShader + } ); + + materialDepth.uniforms[ 'mNear' ].value = camera.near; + materialDepth.uniforms[ 'mFar' ].value = camera.far; // skybox @@ -110,7 +117,21 @@ Use WEBGL Depth buffer support? var textureCube = new THREE.CubeTextureLoader().load( urls ); textureCube.format = THREE.RGBFormat; - scene.background = textureCube; + var shader = THREE.ShaderLib[ 'cube' ]; + shader.uniforms[ 'tCube' ].value = textureCube; + + material = new THREE.ShaderMaterial( { + + fragmentShader: shader.fragmentShader, + vertexShader: shader.vertexShader, + uniforms: shader.uniforms, + depthWrite: false, + side: THREE.BackSide + + } ); + + mesh = new THREE.Mesh( new THREE.BoxBufferGeometry( 1000, 1000, 1000 ), material ); + scene.add( mesh ); // plane particles @@ -377,8 +398,7 @@ Use WEBGL Depth buffer support? fragmentShader: bokeh_shader.fragmentShader, defines: { RINGS: shaderSettings.rings, - SAMPLES: shaderSettings.samples, - DEPTH_PACKING: 1 // RGBADepth + SAMPLES: shaderSettings.samples } } ); -- GitLab