提交 80d3799c 编写于 作者: M Mugen87

BokehShader2: Fix Depth Sampling

上级 cce7e317
...@@ -5,20 +5,28 @@ ...@@ -5,20 +5,28 @@
* @author kaypiKun * @author kaypiKun
*/ */
THREE.CinematicCamera = function( fov, aspect, near, far ) { THREE.CinematicCamera = function ( fov, aspect, near, far ) {
THREE.PerspectiveCamera.call( this, 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 = { this.shaderSettings = {
rings: 3, rings: 3,
samples: 4 samples: 4
}; };
this.material_depth = new THREE.MeshDepthMaterial(); var depthShader = THREE.BokehDepthShader;
this.material_depth.depthPacking = THREE.RGBADepthPacking;
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 // In case of cinematicCamera, having a default lens set is important
this.setLens(); this.setLens();
...@@ -178,7 +186,7 @@ THREE.CinematicCamera.prototype.renderCinematic = function ( scene, renderer ) { ...@@ -178,7 +186,7 @@ THREE.CinematicCamera.prototype.renderCinematic = function ( scene, renderer ) {
// Render depth into texture // Render depth into texture
scene.overrideMaterial = this.material_depth; scene.overrideMaterial = this.materialDepth;
renderer.render( scene, camera, this.postprocessing.rtTextureDepth, true ); renderer.render( scene, camera, this.postprocessing.rtTextureDepth, true );
// Render bokeh composite // Render bokeh composite
......
...@@ -142,14 +142,6 @@ THREE.BokehShader = { ...@@ -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) {", "float penta(vec2 coords) {",
"//pentagonal shape", "//pentagonal shape",
"float scale = float(rings) - 1.3;", "float scale = float(rings) - 1.3;",
...@@ -211,7 +203,7 @@ THREE.BokehShader = { ...@@ -211,7 +203,7 @@ THREE.BokehShader = {
"for( int i=0; i<9; i++ ) {", "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];", "d += tmp * kernel[i];",
"}", "}",
...@@ -273,10 +265,10 @@ THREE.BokehShader = { ...@@ -273,10 +265,10 @@ THREE.BokehShader = {
"void main() {", "void main() {",
"//scene depth calculation", "//scene depth calculation",
"float depth = linearize( getDepth( vUv.xy ) );", "float depth = linearize(texture2D(tDepth,vUv.xy).x);",
"// Blur depth?", "// Blur depth?",
"if (depthblur) {", "if ( depthblur ) {",
"depth = linearize(bdepth(vUv.xy));", "depth = linearize(bdepth(vUv.xy));",
"}", "}",
...@@ -286,7 +278,7 @@ THREE.BokehShader = { ...@@ -286,7 +278,7 @@ THREE.BokehShader = {
"if (shaderFocus) {", "if (shaderFocus) {",
"fDepth = linearize( getDepth( focusCoords ) );", "fDepth = linearize(texture2D(tDepth,focusCoords).x);",
"}", "}",
...@@ -363,3 +355,50 @@ THREE.BokehShader = { ...@@ -363,3 +355,50 @@ THREE.BokehShader = {
].join( "\n" ) ].join( "\n" )
}; };
THREE.BokehDepthShader = {
uniforms: {
"mNear": { value: 1.0 },
"mFar": { value: 1000.0 },
},
vertexShader: [
"#include <common>",
"varying float vViewZDepth;",
"void main() {",
" #include <begin_vertex>",
" #include <project_vertex>",
" vViewZDepth = - mvPosition.z;",
"}"
].join( "\n" ),
fragmentShader: [
"uniform float mNear;",
"uniform float mFar;",
"varying float vViewZDepth;",
"#include <common>",
"#include <packing>",
"void main() {",
" float color = 1.0 - smoothstep( mNear, mFar, vViewZDepth );",
" gl_FragColor = vec4( vec3( color ), 1.0 );",
"} "
].join( "\n" )
};
...@@ -96,9 +96,16 @@ Use WEBGL Depth buffer support? ...@@ -96,9 +96,16 @@ Use WEBGL Depth buffer support?
renderer.autoClear = false; renderer.autoClear = false;
container.appendChild( renderer.domElement ); container.appendChild( renderer.domElement );
materialDepth = new THREE.MeshDepthMaterial(); var depthShader = THREE.BokehDepthShader;
materialDepth.depthPacking = THREE.RGBADepthPacking;
materialDepth.blending = THREE.NoBlending; 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 // skybox
...@@ -110,7 +117,21 @@ Use WEBGL Depth buffer support? ...@@ -110,7 +117,21 @@ Use WEBGL Depth buffer support?
var textureCube = new THREE.CubeTextureLoader().load( urls ); var textureCube = new THREE.CubeTextureLoader().load( urls );
textureCube.format = THREE.RGBFormat; 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 // plane particles
...@@ -377,8 +398,7 @@ Use WEBGL Depth buffer support? ...@@ -377,8 +398,7 @@ Use WEBGL Depth buffer support?
fragmentShader: bokeh_shader.fragmentShader, fragmentShader: bokeh_shader.fragmentShader,
defines: { defines: {
RINGS: shaderSettings.rings, RINGS: shaderSettings.rings,
SAMPLES: shaderSettings.samples, SAMPLES: shaderSettings.samples
DEPTH_PACKING: 1 // RGBADepth
} }
} ); } );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册