From 580257b47eb9b1eb02d26d0203021a6d938a16fe Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sun, 16 Jun 2024 21:33:46 +0200 Subject: [PATCH] Make r_showDepth use currentDepthImage, unless r_skipDepthCapture is 1 --- neo/renderer/tr_local.h | 3 +- neo/renderer/tr_rendertools.cpp | 82 ++++++++++++++++++++++++--------- 2 files changed, 61 insertions(+), 24 deletions(-) diff --git a/neo/renderer/tr_local.h b/neo/renderer/tr_local.h index 79c39de1..11029873 100644 --- a/neo/renderer/tr_local.h +++ b/neo/renderer/tr_local.h @@ -983,7 +983,8 @@ extern idCVar r_materialOverride; // override all materials extern idCVar r_debugRenderToTexture; -extern idCVar r_glDebugContext; +extern idCVar r_glDebugContext; // DG: use debug context to call logging callbacks on GL errors +extern idCVar r_skipDepthCapture; // DG: disable capturing depth buffer, used for soft particles /* ==================================================================== diff --git a/neo/renderer/tr_rendertools.cpp b/neo/renderer/tr_rendertools.cpp index ed7b01ff..33202bfc 100644 --- a/neo/renderer/tr_rendertools.cpp +++ b/neo/renderer/tr_rendertools.cpp @@ -437,7 +437,6 @@ Draw the depth buffer as colors =================== */ void RB_ShowDepthBuffer( void ) { - void *depthReadback; if ( !r_showDepth.GetBool() ) { return; @@ -450,39 +449,76 @@ void RB_ShowDepthBuffer( void ) { qglLoadIdentity(); qglOrtho( 0, 1, 0, 1, -1, 1 ); qglRasterPos2f( 0, 0 ); - qglPopMatrix(); - qglMatrixMode( GL_MODELVIEW ); - qglPopMatrix(); GL_State( GLS_DEPTHFUNC_ALWAYS ); qglColor3f( 1, 1, 1 ); - globalImages->BindNull(); - depthReadback = R_StaticAlloc( glConfig.vidWidth * glConfig.vidHeight*4 ); - memset( depthReadback, 0, glConfig.vidWidth * glConfig.vidHeight*4 ); + if ( !r_skipDepthCapture.GetBool() ) { + globalImages->currentDepthImage->Bind(); - qglReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_DEPTH_COMPONENT , GL_FLOAT, depthReadback ); + const float x=0, y=0, w=1, h=1; + // debug values: + //const float x = 0.1, y = 0.1, w = 0.8, h = 0.8; + //qglColor4f( 0.0f, 0.0f, 0.5f, 1.0f ); + const float tx=0, ty=0; + // the actual texturesize of currentDepthImage is the next bigger power of two (POT), + // so the normalized width/height of the part of it we actually wanna show is the following + const float tw = float(glConfig.vidWidth) / float(globalImages->currentDepthImage->uploadWidth); + const float th = float(glConfig.vidHeight) / float(globalImages->currentDepthImage->uploadHeight); - for ( int i = 0 ; i < glConfig.vidWidth * glConfig.vidHeight ; i++ ) { - float& px = ((float *)depthReadback)[i]; - float d = px; - // the following calculation is based on how the TDM soft particle shader translates the depth value to doom units + qglBegin( GL_QUADS ); + qglTexCoord2f(tx, ty); + qglVertex2f( x, y ); // ( 0,0 ); - // 0.9995 is practically infinite distance, clamping to 0.9994 clamps to max 30k doom units, - // which is more than enough (and prevents a potential division by 0 below) - d = (d < 0.9994f) ? d : 0.9994f; + qglTexCoord2f(tx, ty+th); + qglVertex2f( x, y+h ); // ( 0,1 ); - d = d - 0.9995f; // d is now negative, between -0.0001 and -0.9995 - d = 1.0f / d; - // d *= -3.0f; // this would translate d to distance in doom units, doing it together with the next step + qglTexCoord2f(tx+tw, ty+th); + qglVertex2f( x+w, y+h ); // ( 1,1 ); - d *= (-3.0f / 3000.0f); // now 3000 units is 1.0, i.e. completely white (=> more details for closer distances) - px = d; + qglTexCoord2f(tx+tw, ty); + qglVertex2f( x+w, y ); // ( 1,0 ); + qglEnd(); + + // TODO: probably a shader transforming this to something viewable + + qglPopMatrix(); + qglMatrixMode( GL_MODELVIEW ); + qglPopMatrix(); + + } else { + qglPopMatrix(); + qglMatrixMode( GL_MODELVIEW ); + qglPopMatrix(); + globalImages->BindNull(); + + void* depthReadback = R_StaticAlloc( glConfig.vidWidth * glConfig.vidHeight*4 ); + memset( depthReadback, 0, glConfig.vidWidth * glConfig.vidHeight*4 ); + + qglReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_DEPTH_COMPONENT , GL_FLOAT, depthReadback ); +#if 0 // the following looks better, but is different from the !r_skipDepthCapture.GetBool() case above + // (which draws the captured depth buffer unaltered, unless we add a shader) + for ( int i = 0, n=glConfig.vidWidth * glConfig.vidHeight; i < n ; i++ ) { + float& px = ((float *)depthReadback)[i]; + float d = px; + // the following calculation is based on how the TDM soft particle shader translates the depth value to doom units + + // 0.9995 is practically infinite distance, clamping to 0.9994 clamps to max 30k doom units, + // which is more than enough (and prevents a potential division by 0 below) + d = (d < 0.9994f) ? d : 0.9994f; + + d = d - 0.9995f; // d is now negative, between -0.0001 and -0.9995 + d = 1.0f / d; + // d *= -3.0f; // this would translate d to distance in doom units, doing it together with the next step + + d *= (-3.0f / 3000.0f); // now 3000 units is 1.0, i.e. completely white (=> more details for closer distances) + px = d; + } +#endif + qglDrawPixels( glConfig.vidWidth, glConfig.vidHeight, GL_LUMINANCE, GL_FLOAT, depthReadback ); + R_StaticFree( depthReadback ); } - - qglDrawPixels( glConfig.vidWidth, glConfig.vidHeight, GL_LUMINANCE, GL_FLOAT, depthReadback ); - R_StaticFree( depthReadback ); } /*