Browse Source

WebGLDeferredRenderer: added stencil culling of background pixels.

See #2624
alteredq 12 years ago
parent
commit
a1c6656b0a
1 changed files with 21 additions and 3 deletions
  1. 21 3
      examples/js/renderers/WebGLDeferredRenderer.js

+ 21 - 3
examples/js/renderers/WebGLDeferredRenderer.js

@@ -477,6 +477,15 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 		// clear shared depth buffer
 
 		this.renderer.autoClearDepth = true;
+		this.renderer.autoClearStencil = true;
+
+		// write 1 to shared stencil buffer
+		// for non-background pixels
+
+		gl.enable( gl.STENCIL_TEST );
+		gl.stencilOp( gl.REPLACE, gl.REPLACE, gl.REPLACE );
+		gl.stencilFunc( gl.ALWAYS, 1, 0xffffffff );
+		gl.clearStencil( 0 );
 
 		compColor.render();
 
@@ -489,8 +498,15 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 		//  just write color pixel if depth is the same)
 
 		this.renderer.autoClearDepth = false;
+		this.renderer.autoClearStencil = false;
 		gl.depthFunc( gl.EQUAL );
 
+		// just touch foreground pixels (stencil == 1)
+		// both in normalDepth and light passes
+
+		gl.stencilFunc( gl.EQUAL, 1, 0xffffffff );
+		gl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );
+
 		compNormalDepth.render();
 
 		// 3) light pass
@@ -525,10 +541,12 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 
 		// 4) composite pass
 
-		// return back to normal depth handling state
+		// return back to usual depth and stencil handling state
 
 		this.renderer.autoClearDepth = true;
+		this.renderer.autoClearStencil = true;
 		gl.depthFunc( gl.LEQUAL );
+		gl.disable( gl.STENCIL_TEST );
 
 		compFinal.render( 0.1 );
 
@@ -536,10 +554,10 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 
 	var createRenderTargets = function ( ) {
 
-		var rtParamsFloatLinear = { minFilter: THREE.NearestFilter, magFilter: THREE.LinearFilter, stencilBuffer: false,
+		var rtParamsFloatLinear = { minFilter: THREE.NearestFilter, magFilter: THREE.LinearFilter, stencilBuffer: true,
 									format: THREE.RGBAFormat, type: THREE.FloatType };
 
-		var rtParamsFloatNearest = { minFilter: THREE.NearestFilter, magFilter: THREE.NearestFilter, stencilBuffer: false,
+		var rtParamsFloatNearest = { minFilter: THREE.NearestFilter, magFilter: THREE.NearestFilter, stencilBuffer: true,
 									 format: THREE.RGBAFormat, type: THREE.FloatType };
 
 		var rtParamsUByte = { minFilter: THREE.NearestFilter, magFilter: THREE.LinearFilter, stencilBuffer: false,