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

Renderers: honor renderOrder with reversed depth buffer. (#33945)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
LLiJJing 5 дней назад
Родитель
Сommit
040302385a

+ 8 - 1
src/renderers/WebGLRenderer.js

@@ -1692,7 +1692,7 @@ class WebGLRenderer {
 
 			if ( _this.sortObjects === true ) {
 
-				currentRenderList.sort( _opaqueSort, _transparentSort, camera.reversedDepth );
+				currentRenderList.sort( _opaqueSort, _transparentSort );
 
 			}
 
@@ -1875,6 +1875,11 @@ class WebGLRenderer {
 							_vector4.setFromMatrixPosition( object.matrixWorld )
 								.applyMatrix4( _projScreenMatrix );
 
+							// with a reversed depth buffer the projected z is inverted; negate it so
+							// smaller z always means "closer" for render list sorting
+
+							if ( camera.reversedDepth === true ) _vector4.z = - _vector4.z;
+
 						}
 
 						const geometry = objects.update( object );
@@ -1913,6 +1918,8 @@ class WebGLRenderer {
 								.applyMatrix4( object.matrixWorld )
 								.applyMatrix4( _projScreenMatrix );
 
+							if ( camera.reversedDepth === true ) _vector4.z = - _vector4.z;
+
 						}
 
 						if ( Array.isArray( material ) ) {

+ 1 - 10
src/renderers/common/RenderList.js

@@ -384,22 +384,13 @@ class RenderList {
 	 *
 	 * @param {?function(any, any): number} customOpaqueSort - A custom sort function for opaque objects.
 	 * @param {?function(any, any): number} customTransparentSort -  A custom sort function for transparent objects.
-	 * @param {boolean} reversedDepth - Whether a reversed depth buffer is used or not.
 	 */
-	sort( customOpaqueSort, customTransparentSort, reversedDepth ) {
+	sort( customOpaqueSort, customTransparentSort ) {
 
 		if ( this.opaque.length > 1 ) this.opaque.sort( customOpaqueSort || painterSortStable );
 		if ( this.transparentDoublePass.length > 1 ) this.transparentDoublePass.sort( customTransparentSort || reversePainterSortStable );
 		if ( this.transparent.length > 1 ) this.transparent.sort( customTransparentSort || reversePainterSortStable );
 
-		if ( reversedDepth ) {
-
-			this.opaque.reverse();
-			this.transparentDoublePass.reverse();
-			this.transparent.reverse();
-
-		}
-
 	}
 
 	/**

+ 8 - 1
src/renderers/common/Renderer.js

@@ -1697,7 +1697,7 @@ class Renderer {
 
 		if ( this.sortObjects === true ) {
 
-			renderList.sort( this._opaqueSort, this._transparentSort, camera.reversedDepth );
+			renderList.sort( this._opaqueSort, this._transparentSort );
 
 		}
 
@@ -3145,6 +3145,11 @@ class Renderer {
 
 						_vector4.setFromMatrixPosition( object.matrixWorld ).applyMatrix4( _projScreenMatrix );
 
+						// with a reversed depth buffer the projected z is inverted; negate it so
+						// smaller z always means "closer" for render list sorting
+
+						if ( camera.reversedDepth === true ) _vector4.z = - _vector4.z;
+
 					}
 
 					const { geometry, material } = object;
@@ -3178,6 +3183,8 @@ class Renderer {
 							.applyMatrix4( object.matrixWorld )
 							.applyMatrix4( _projScreenMatrix );
 
+						if ( camera.reversedDepth === true ) _vector4.z = - _vector4.z;
+
 					}
 
 					if ( Array.isArray( material ) ) {

+ 1 - 9
src/renderers/webgl/WebGLRenderLists.js

@@ -159,20 +159,12 @@ function WebGLRenderList() {
 
 	}
 
-	function sort( customOpaqueSort, customTransparentSort, reversedDepth ) {
+	function sort( customOpaqueSort, customTransparentSort ) {
 
 		if ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );
 		if ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );
 		if ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );
 
-		if ( reversedDepth ) {
-
-			opaque.reverse();
-			transmissive.reverse();
-			transparent.reverse();
-
-		}
-
 	}
 
 	function finish() {

粤ICP备19079148号