Skip to content

Commit 176519f

Browse files
authored
WebGLRenderer: More fixes for reversed depth buffer. (#32799)
1 parent 41b6d17 commit 176519f

File tree

5 files changed

+53
-24
lines changed

5 files changed

+53
-24
lines changed

examples/jsm/shaders/GTAOShader.js

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,12 @@ const GTAOShader = {
9191
#define FRAGMENT_OUTPUT vec4(vec3(ao), 1.)
9292
#endif
9393
94-
vec3 getViewPosition(const in vec2 screenPosition, const in float depth) {
95-
vec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);
94+
vec3 getViewPosition( const in vec2 screenPosition, const in float depth ) {
95+
#ifdef USE_REVERSED_DEPTH_BUFFER
96+
vec4 clipSpacePosition = vec4( vec2( screenPosition ) * 2.0 - 1.0, depth, 1.0 );
97+
#else
98+
vec4 clipSpacePosition = vec4( vec3( screenPosition, depth ) * 2.0 - 1.0, 1.0 );
99+
#endif
96100
vec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;
97101
return viewSpacePosition.xyz / viewSpacePosition.w;
98102
}
@@ -154,10 +158,19 @@ const GTAOShader = {
154158
155159
void main() {
156160
float depth = getDepth(vUv.xy);
157-
if (depth >= 1.0) {
158-
discard;
159-
return;
160-
}
161+
162+
#ifdef USE_REVERSED_DEPTH_BUFFER
163+
if (depth <= 0.0) {
164+
discard;
165+
return;
166+
}
167+
#else
168+
if (depth >= 1.0) {
169+
discard;
170+
return;
171+
}
172+
#endif
173+
161174
vec3 viewPos = getViewPosition(vUv, depth);
162175
vec3 viewNormal = getViewNormal(vUv);
163176

examples/jsm/shaders/PoissonDenoiseShader.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,12 @@ const PoissonDenoiseShader = {
8686
8787
const vec3 poissonDisk[SAMPLES] = SAMPLE_VECTORS;
8888
89-
vec3 getViewPosition(const in vec2 screenPosition, const in float depth) {
90-
vec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);
89+
vec3 getViewPosition( const in vec2 screenPosition, const in float depth ) {
90+
#ifdef USE_REVERSED_DEPTH_BUFFER
91+
vec4 clipSpacePosition = vec4( vec2( screenPosition ) * 2.0 - 1.0, depth, 1.0 );
92+
#else
93+
vec4 clipSpacePosition = vec4( vec3( screenPosition, depth ) * 2.0 - 1.0, 1.0 );
94+
#endif
9195
vec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;
9296
return viewSpacePosition.xyz / viewSpacePosition.w;
9397
}

examples/jsm/shaders/SAOShader.js

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,6 @@ const SAOShader = {
8686
8787
#include <packing>
8888
89-
#ifdef USE_REVERSED_DEPTH_BUFFER
90-
91-
const float depthThreshold = 0.0 + EPSILON;
92-
93-
#else
94-
95-
const float depthThreshold = 1.0 - EPSILON;
96-
97-
#endif
98-
99-
10089
vec4 getDefaultColor( const in vec2 screenPosition ) {
10190
#if DIFFUSE_TEXTURE == 1
10291
return texture2D( tDiffuse, vUv );
@@ -164,9 +153,15 @@ const SAOShader = {
164153
angle += ANGLE_STEP;
165154
166155
float sampleDepth = getDepth( sampleUv );
167-
if( sampleDepth >= depthThreshold ) {
156+
#ifdef USE_REVERSED_DEPTH_BUFFER
157+
if( sampleDepth <= 0.0 + EPSILON ) {
168158
continue;
169159
}
160+
#else
161+
if( sampleDepth >= 1.0 - EPSILON ) {
162+
continue;
163+
}
164+
#endif
170165
171166
float sampleViewZ = getViewZ( sampleDepth );
172167
vec3 sampleViewPosition = getViewPosition( sampleUv, sampleDepth, sampleViewZ );
@@ -181,9 +176,16 @@ const SAOShader = {
181176
182177
void main() {
183178
float centerDepth = getDepth( vUv );
184-
if( centerDepth >= depthThreshold ) {
185-
discard;
186-
}
179+
180+
#ifdef USE_REVERSED_DEPTH_BUFFER
181+
if( centerDepth <= 0.0 + EPSILON ) {
182+
discard;
183+
}
184+
#else
185+
if( centerDepth >= 1.0 - EPSILON ) {
186+
discard;
187+
}
188+
#endif
187189
188190
float centerViewZ = getViewZ( centerDepth );
189191
vec3 viewPosition = getViewPosition( vUv, centerDepth, centerViewZ );

src/cameras/CubeCamera.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,19 +203,27 @@ class CubeCamera extends Object3D {
203203

204204
renderTarget.texture.generateMipmaps = false;
205205

206+
// https://github.com/mrdoob/three.js/issues/31413#issuecomment-3095966812
207+
const reversedDepthBuffer = !! ( renderer.isWebGLRenderer && renderer.state.buffers.depth.getReversed() );
208+
206209
renderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );
210+
if ( reversedDepthBuffer && renderer.autoClear === false ) renderer.clearDepth();
207211
renderer.render( scene, cameraPX );
208212

209213
renderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );
214+
if ( reversedDepthBuffer && renderer.autoClear === false ) renderer.clearDepth();
210215
renderer.render( scene, cameraNX );
211216

212217
renderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );
218+
if ( reversedDepthBuffer && renderer.autoClear === false ) renderer.clearDepth();
213219
renderer.render( scene, cameraPY );
214220

215221
renderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );
222+
if ( reversedDepthBuffer && renderer.autoClear === false ) renderer.clearDepth();
216223
renderer.render( scene, cameraNY );
217224

218225
renderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );
226+
if ( reversedDepthBuffer && renderer.autoClear === false ) renderer.clearDepth();
219227
renderer.render( scene, cameraPZ );
220228

221229
// mipmaps are generated during the last call of render()
@@ -224,6 +232,7 @@ class CubeCamera extends Object3D {
224232
renderTarget.texture.generateMipmaps = generateMipmaps;
225233

226234
renderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );
235+
if ( reversedDepthBuffer && renderer.autoClear === false ) renderer.clearDepth();
227236
renderer.render( scene, cameraNZ );
228237

229238
renderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );

src/renderers/webgl/WebGLState.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,15 @@ function WebGLState( gl, extensions ) {
214214

215215
if ( currentDepthClear !== depth ) {
216216

217+
currentDepthClear = depth;
218+
217219
if ( currentReversed ) {
218220

219221
depth = 1 - depth;
220222

221223
}
222224

223225
gl.clearDepth( depth );
224-
currentDepthClear = depth;
225226

226227
}
227228

0 commit comments

Comments
 (0)