Просмотр исходного кода

WebGLRenderer: Stable reversed Z buffer implementation. (#29579)

* fix: stable reversed Z buffer implementation

Fix: reset clip state when reset is called
Fix: valid depth clear value when reversed is enabled

Feat:  non-persistent reversedZ state ( can be controlled via renderer.state.buffers.depth.setReversed(  )))

* fix: lint + misstakes
fix: program parameters

* Update WebGLCapabilities.js

---------

Co-authored-by: Michael Herzog <michael.herzog@human-interactive.org>
Konstantin Timoshenko 1 год назад
Родитель
Сommit
1075735e64

+ 10 - 4
src/renderers/WebGLRenderer.js

@@ -70,6 +70,7 @@ class WebGLRenderer {
 			preserveDrawingBuffer = false,
 			preserveDrawingBuffer = false,
 			powerPreference = 'default',
 			powerPreference = 'default',
 			failIfMajorPerformanceCaveat = false,
 			failIfMajorPerformanceCaveat = false,
+			reverseDepthBuffer = false,
 		} = parameters;
 		} = parameters;
 
 
 		this.isWebGLRenderer = true;
 		this.isWebGLRenderer = true;
@@ -288,9 +289,13 @@ class WebGLRenderer {
 
 
 			capabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );
 			capabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );
 
 
-			state = new WebGLState( _gl );
+			state = new WebGLState( _gl, extensions );
 
 
-			if ( capabilities.reverseDepthBuffer ) state.buffers.depth.setReversed( true );
+			if ( capabilities.reverseDepthBuffer && reverseDepthBuffer ) {
+
+				state.buffers.depth.setReversed( true );
+
+			}
 
 
 			info = new WebGLInfo( _gl );
 			info = new WebGLInfo( _gl );
 			properties = new WebGLProperties();
 			properties = new WebGLProperties();
@@ -594,7 +599,6 @@ class WebGLRenderer {
 			if ( depth ) {
 			if ( depth ) {
 
 
 				bits |= _gl.DEPTH_BUFFER_BIT;
 				bits |= _gl.DEPTH_BUFFER_BIT;
-				_gl.clearDepth( this.capabilities.reverseDepthBuffer ? 0 : 1 );
 
 
 			}
 			}
 
 
@@ -1978,7 +1982,9 @@ class WebGLRenderer {
 
 
 				// common camera uniforms
 				// common camera uniforms
 
 
-				if ( capabilities.reverseDepthBuffer ) {
+				const reverseDepthBuffer = state.buffers.depth.getReversed();
+
+				if ( reverseDepthBuffer ) {
 
 
 					_currentProjectionMatrix.copy( camera.projectionMatrix );
 					_currentProjectionMatrix.copy( camera.projectionMatrix );
 
 

+ 0 - 7
src/renderers/webgl/WebGLCapabilities.js

@@ -94,13 +94,6 @@ function WebGLCapabilities( gl, extensions, parameters, utils ) {
 	const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
 	const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
 	const reverseDepthBuffer = parameters.reverseDepthBuffer === true && extensions.has( 'EXT_clip_control' );
 	const reverseDepthBuffer = parameters.reverseDepthBuffer === true && extensions.has( 'EXT_clip_control' );
 
 
-	if ( reverseDepthBuffer === true ) {
-
-		const ext = extensions.get( 'EXT_clip_control' );
-		ext.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );
-
-	}
-
 	const maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
 	const maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
 	const maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
 	const maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
 	const maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );
 	const maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );

+ 1 - 1
src/renderers/webgl/WebGLPrograms.js

@@ -14,7 +14,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 	const programs = [];
 	const programs = [];
 
 
 	const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;
 	const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;
-	const reverseDepthBuffer = capabilities.reverseDepthBuffer;
 	const SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;
 	const SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;
 
 
 	let precision = capabilities.precision;
 	let precision = capabilities.precision;
@@ -109,6 +108,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 		}
 		}
 
 
 		const currentRenderTarget = renderer.getRenderTarget();
 		const currentRenderTarget = renderer.getRenderTarget();
+		const reverseDepthBuffer = renderer.state.buffers.depth.getReversed();
 
 
 		const IS_INSTANCEDMESH = object.isInstancedMesh === true;
 		const IS_INSTANCEDMESH = object.isInstancedMesh === true;
 		const IS_BATCHEDMESH = object.isBatchedMesh === true;
 		const IS_BATCHEDMESH = object.isBatchedMesh === true;

+ 37 - 1
src/renderers/webgl/WebGLState.js

@@ -14,7 +14,7 @@ const reversedFuncs = {
 	[ GreaterEqualDepth ]: LessEqualDepth,
 	[ GreaterEqualDepth ]: LessEqualDepth,
 };
 };
 
 
-function WebGLState( gl ) {
+function WebGLState( gl, extensions ) {
 
 
 	function ColorBuffer() {
 	function ColorBuffer() {
 
 
@@ -88,10 +88,36 @@ function WebGLState( gl ) {
 
 
 			setReversed: function ( value ) {
 			setReversed: function ( value ) {
 
 
+				if ( reversed !== value ) {
+
+					const ext = extensions.get( 'EXT_clip_control' );
+
+					if ( reversed ) {
+
+						ext.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );
+
+					} else {
+
+						ext.clipControlEXT( ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT );
+
+					}
+
+					const oldDepth = currentDepthClear;
+					currentDepthClear = null;
+					this.setClear( oldDepth );
+
+				}
+
 				reversed = value;
 				reversed = value;
 
 
 			},
 			},
 
 
+			getReversed: function () {
+
+				return reversed;
+
+			},
+
 			setTest: function ( depthTest ) {
 			setTest: function ( depthTest ) {
 
 
 				if ( depthTest ) {
 				if ( depthTest ) {
@@ -187,6 +213,12 @@ function WebGLState( gl ) {
 
 
 				if ( currentDepthClear !== depth ) {
 				if ( currentDepthClear !== depth ) {
 
 
+					if ( reversed ) {
+
+						depth = 1 - depth;
+
+					}
+
 					gl.clearDepth( depth );
 					gl.clearDepth( depth );
 					currentDepthClear = depth;
 					currentDepthClear = depth;
 
 
@@ -201,6 +233,7 @@ function WebGLState( gl ) {
 				currentDepthMask = null;
 				currentDepthMask = null;
 				currentDepthFunc = null;
 				currentDepthFunc = null;
 				currentDepthClear = null;
 				currentDepthClear = null;
+				reversed = false;
 
 
 			}
 			}
 
 
@@ -1171,6 +1204,9 @@ function WebGLState( gl ) {
 
 
 		gl.depthMask( true );
 		gl.depthMask( true );
 		gl.depthFunc( gl.LESS );
 		gl.depthFunc( gl.LESS );
+
+		depthBuffer.setReversed( false );
+
 		gl.clearDepth( 1 );
 		gl.clearDepth( 1 );
 
 
 		gl.stencilMask( 0xffffffff );
 		gl.stencilMask( 0xffffffff );

粤ICP备19079148号