From 022375318b7120177faf415d2601b31e96747305 Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Fri, 13 Feb 2026 14:12:32 +0100 Subject: [PATCH 1/2] WebGPURenderer: Reversed depth buffer fixes. (#33000) --- src/cameras/CubeCamera.js | 13 ++++++++++++- src/renderers/webgpu/utils/WebGPUPipelineUtils.js | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/cameras/CubeCamera.js b/src/cameras/CubeCamera.js index afaae16a8069a0..c2f7270dc84fcc 100644 --- a/src/cameras/CubeCamera.js +++ b/src/cameras/CubeCamera.js @@ -204,7 +204,18 @@ class CubeCamera extends Object3D { renderTarget.texture.generateMipmaps = false; // https://github.com/mrdoob/three.js/issues/31413#issuecomment-3095966812 - const reversedDepthBuffer = !! ( renderer.isWebGLRenderer && renderer.state.buffers.depth.getReversed() ); + + let reversedDepthBuffer = false; + + if ( renderer.isWebGLRenderer === true ) { + + reversedDepthBuffer = renderer.state.buffers.depth.getReversed(); + + } else { + + reversedDepthBuffer = renderer.reversedDepthBuffer; + + } renderer.setRenderTarget( renderTarget, 0, activeMipmapLevel ); if ( reversedDepthBuffer && renderer.autoClear === false ) renderer.clearDepth(); diff --git a/src/renderers/webgpu/utils/WebGPUPipelineUtils.js b/src/renderers/webgpu/utils/WebGPUPipelineUtils.js index 1fac51cac04800..274c2d9ebf6bc8 100644 --- a/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +++ b/src/renderers/webgpu/utils/WebGPUPipelineUtils.js @@ -790,7 +790,7 @@ class WebGPUPipelineUtils { if ( material.depthTest === false ) { - depthCompare = ( this.backend.parameters.reversedDepthBuffer ) ? GPUCompareFunction.Never : GPUCompareFunction.Always; + depthCompare = GPUCompareFunction.Always; } else { From 8efd540f3964477a82197bb5a6ea703fbaa19167 Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Fri, 13 Feb 2026 14:41:08 +0100 Subject: [PATCH 2/2] ViewportDepthNode: Support reversed depth in viewZ functions. (#33001) --- src/Three.TSL.js | 2 ++ src/nodes/display/ViewportDepthNode.js | 44 +++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/Three.TSL.js b/src/Three.TSL.js index 89be2f582d458f..21c31a436e02e6 100644 --- a/src/Three.TSL.js +++ b/src/Three.TSL.js @@ -604,6 +604,8 @@ export const vibrance = TSL.vibrance; export const viewZToLogarithmicDepth = TSL.viewZToLogarithmicDepth; export const viewZToOrthographicDepth = TSL.viewZToOrthographicDepth; export const viewZToPerspectiveDepth = TSL.viewZToPerspectiveDepth; +export const viewZToReversedOrthographicDepth = TSL.viewZToReversedOrthographicDepth; +export const viewZToReversedPerspectiveDepth = TSL.viewZToReversedPerspectiveDepth; export const viewport = TSL.viewport; export const viewportCoordinate = TSL.viewportCoordinate; export const viewportDepthTexture = TSL.viewportDepthTexture; diff --git a/src/nodes/display/ViewportDepthNode.js b/src/nodes/display/ViewportDepthNode.js index 5f3fbdb1f05a4d..7e96a52c22bbc0 100644 --- a/src/nodes/display/ViewportDepthNode.js +++ b/src/nodes/display/ViewportDepthNode.js @@ -1,5 +1,5 @@ import Node from '../core/Node.js'; -import { float, log, log2, nodeImmutable, nodeProxy } from '../tsl/TSLBase.js'; +import { float, Fn, log, log2, nodeImmutable, nodeProxy } from '../tsl/TSLBase.js'; import { cameraNear, cameraFar } from '../accessors/Camera.js'; import { positionView } from '../accessors/Position.js'; import { viewportDepthTexture } from './ViewportDepthTextureNode.js'; @@ -86,7 +86,7 @@ class ViewportDepthNode extends Node { if ( value !== null ) { - node = depthBase().assign( value ); + node = depthBase().assign( value ); } @@ -152,6 +152,18 @@ export default ViewportDepthNode; */ export const viewZToOrthographicDepth = ( viewZ, near, far ) => viewZ.add( near ).div( near.sub( far ) ); +/** + * TSL function for converting a viewZ value to a reversed orthographic depth value. + * + * @tsl + * @function + * @param {Node} viewZ - The viewZ node. + * @param {Node} near - The camera's near value. + * @param {Node} far - The camera's far value. + * @returns {Node} + */ +export const viewZToReversedOrthographicDepth = ( viewZ, near, far ) => viewZ.add( far ).div( far.sub( near ) ); + /** * TSL function for converting an orthographic depth value to a viewZ value. * @@ -162,7 +174,19 @@ export const viewZToOrthographicDepth = ( viewZ, near, far ) => viewZ.add( near * @param {Node} far - The camera's far value. * @returns {Node} */ -export const orthographicDepthToViewZ = ( depth, near, far ) => near.sub( far ).mul( depth ).sub( near ); +export const orthographicDepthToViewZ = /*@__PURE__*/ Fn( ( [ depth, near, far ], builder ) => { + + if ( builder.renderer.reversedDepthBuffer === true ) { + + return far.sub( near ).mul( depth ).sub( far ); + + } else { + + return near.sub( far ).mul( depth ).sub( near ); + + } + +} ); /** * TSL function for converting a viewZ value to a perspective depth value. @@ -200,7 +224,19 @@ export const viewZToReversedPerspectiveDepth = ( viewZ, near, far ) => near.mul( * @param {Node} far - The camera's far value. * @returns {Node} */ -export const perspectiveDepthToViewZ = ( depth, near, far ) => near.mul( far ).div( far.sub( near ).mul( depth ).sub( far ) ); +export const perspectiveDepthToViewZ = /*@__PURE__*/ Fn( ( [ depth, near, far ], builder ) => { + + if ( builder.renderer.reversedDepthBuffer === true ) { + + return near.mul( far ).div( near.sub( far ).mul( depth ).sub( near ) ); + + } else { + + return near.mul( far ).div( far.sub( near ).mul( depth ).sub( far ) ); + + } + +} ); /** * TSL function for converting a viewZ value to a logarithmic depth value.