From 48c235987c1b74383ff21dbfd64beb6be17e024a Mon Sep 17 00:00:00 2001 From: slipher Date: Mon, 18 Nov 2024 06:36:36 -0600 Subject: [PATCH 1/4] Remove depth fade from generic2D shader This is a very 3D effect, the last thing that would make sense in a 2D shader. --- src/engine/renderer/gl_shader.cpp | 4 +--- src/engine/renderer/gl_shader.h | 3 +-- src/engine/renderer/tr_shade.cpp | 18 ------------------ 3 files changed, 2 insertions(+), 23 deletions(-) diff --git a/src/engine/renderer/gl_shader.cpp b/src/engine/renderer/gl_shader.cpp index 64923fa81d..fda7b81446 100644 --- a/src/engine/renderer/gl_shader.cpp +++ b/src/engine/renderer/gl_shader.cpp @@ -2184,8 +2184,7 @@ GLShader_generic2D::GLShader_generic2D( GLShaderManager *manager ) : u_ColorModulate( this ), u_Color( this ), u_DepthScale( this ), - GLDeformStage( this ), - GLCompileMacro_USE_DEPTH_FADE( this ) + GLDeformStage( this ) { } @@ -2197,7 +2196,6 @@ void GLShader_generic2D::BuildShaderCompileMacros( std::string& compileMacros ) void GLShader_generic2D::SetShaderProgramUniforms( shaderProgram_t *shaderProgram ) { glUniform1i( glGetUniformLocation( shaderProgram->program, "u_ColorMap" ), 0 ); - glUniform1i( glGetUniformLocation( shaderProgram->program, "u_DepthMap" ), 1 ); } GLShader_generic::GLShader_generic( GLShaderManager *manager ) : diff --git a/src/engine/renderer/gl_shader.h b/src/engine/renderer/gl_shader.h index 507aeab4ac..69423323fc 100644 --- a/src/engine/renderer/gl_shader.h +++ b/src/engine/renderer/gl_shader.h @@ -3921,8 +3921,7 @@ class GLShader_generic2D : public u_ColorModulate, public u_Color, public u_DepthScale, - public GLDeformStage, - public GLCompileMacro_USE_DEPTH_FADE + public GLDeformStage { public: GLShader_generic2D( GLShaderManager *manager ); diff --git a/src/engine/renderer/tr_shade.cpp b/src/engine/renderer/tr_shade.cpp index 3bff3e2fa4..2d894d516a 100644 --- a/src/engine/renderer/tr_shade.cpp +++ b/src/engine/renderer/tr_shade.cpp @@ -825,13 +825,7 @@ static void Render_generic2D( shaderStage_t *pStage ) GL_State( pStage->stateBits ); - bool hasDepthFade = pStage->hasDepthFade; - bool needDepthMap = pStage->hasDepthFade; - - // choose right shader program ---------------------------------- - gl_generic2DShader->SetDepthFade( hasDepthFade ); gl_generic2DShader->BindProgram( pStage->deformIndex ); - // end choose right shader program ------------------------------ // set uniforms // u_AlphaThreshold @@ -861,18 +855,6 @@ static void Render_generic2D( shaderStage_t *pStage ) glEnable( GL_DEPTH_CLAMP ); } - if ( hasDepthFade ) - { - gl_generic2DShader->SetUniform_DepthScale( pStage->depthFadeValue ); - } - - if ( needDepthMap ) - { - gl_generic2DShader->SetUniform_DepthMapBindless( - GL_BindToTMU( 1, tr.currentDepthImage ) - ); - } - gl_generic2DShader->SetRequiredVertexPointers(); Tess_DrawElements(); From 6acd80da2cc0ed2f7cfbd7e136f8e890f6fb994c Mon Sep 17 00:00:00 2001 From: slipher Date: Mon, 18 Nov 2024 07:08:14 -0600 Subject: [PATCH 2/4] Make sure depth test is always disabled for 2D Also remove the 'gl_FragDepth = 0;' bit from the 2D GLSL shader. It seemed to have no effect anyway, but with depth testing and writing disabled we can be sure of it. --- src/engine/renderer/gl_shader.h | 7 +++---- src/engine/renderer/glsl_source/generic_fp.glsl | 4 ---- src/engine/renderer/tr_backend.cpp | 1 + src/engine/renderer/tr_shade.cpp | 3 ++- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/engine/renderer/gl_shader.h b/src/engine/renderer/gl_shader.h index 69423323fc..687e57b3d2 100644 --- a/src/engine/renderer/gl_shader.h +++ b/src/engine/renderer/gl_shader.h @@ -3906,10 +3906,9 @@ class u_Lights : } }; -// This is just a copy of the GLShader_generic, but with a special -// define for RmlUI transforms. It probably has a lot of unnecessary -// code that could be pruned. -// TODO: Write a more minimal 2D rendering shader. +// FIXME: this is the same as 'generic' and has no reason for existing. +// It was added along with RmlUi transforms to add "gl_FragDepth = 0;" to the GLSL, +// but that turns out not to be needed. class GLShader_generic2D : public GLShader, public u_ColorMap, diff --git a/src/engine/renderer/glsl_source/generic_fp.glsl b/src/engine/renderer/glsl_source/generic_fp.glsl index 2c4b5c4f9c..2de327152a 100644 --- a/src/engine/renderer/glsl_source/generic_fp.glsl +++ b/src/engine/renderer/glsl_source/generic_fp.glsl @@ -75,10 +75,6 @@ void main() outputColor = color; -#if defined(GENERIC_2D) - gl_FragDepth = 0; -#endif - // Debugging. #if defined(r_showVertexColors) && !defined(GENERIC_2D) outputColor = vec4(0.0, 0.0, 0.0, 0.0); diff --git a/src/engine/renderer/tr_backend.cpp b/src/engine/renderer/tr_backend.cpp index d6029e8794..07206aebb5 100644 --- a/src/engine/renderer/tr_backend.cpp +++ b/src/engine/renderer/tr_backend.cpp @@ -827,6 +827,7 @@ static void RB_SetGL2D() GL_LoadProjectionMatrix( proj ); GL_LoadModelViewMatrix( matrixIdentity ); + // TODO: remove this, state is set wherever drawing is done GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA ); GL_Cull( cullType_t::CT_TWO_SIDED ); diff --git a/src/engine/renderer/tr_shade.cpp b/src/engine/renderer/tr_shade.cpp index 2d894d516a..557e43f768 100644 --- a/src/engine/renderer/tr_shade.cpp +++ b/src/engine/renderer/tr_shade.cpp @@ -823,7 +823,8 @@ static void Render_generic2D( shaderStage_t *pStage ) { GLimp_LogComment( "--- Render_generic2D ---\n" ); - GL_State( pStage->stateBits ); + // Disable depth testing and writing + GL_State( ( pStage->stateBits & ~GLS_DEPTHMASK_TRUE ) | GLS_DEPTHTEST_DISABLE ); gl_generic2DShader->BindProgram( pStage->deformIndex ); From a644d252ae333fd7f0f80de2f3f8512eea932ee6 Mon Sep 17 00:00:00 2001 From: slipher Date: Mon, 18 Nov 2024 07:24:15 -0600 Subject: [PATCH 3/4] Stop z clipping of 2d drawing without depth clamp With RmlUi transforms and 3D CSS directives such as transform: rotateX(...), nonzero z coordinates could be produced. Instead of relying on GL_DEPTH_CLAMP which is not always available to prevent clipping by near or far planes, just use a projection matrix that always maps z to 0. --- src/engine/renderer/tr_backend.cpp | 3 +++ src/engine/renderer/tr_public.h | 1 - src/engine/renderer/tr_shade.cpp | 10 ---------- src/engine/sys/sdl_glimp.cpp | 6 ------ 4 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/engine/renderer/tr_backend.cpp b/src/engine/renderer/tr_backend.cpp index 07206aebb5..4d8dac5445 100644 --- a/src/engine/renderer/tr_backend.cpp +++ b/src/engine/renderer/tr_backend.cpp @@ -824,6 +824,9 @@ static void RB_SetGL2D() GL_Scissor( 0, 0, glConfig.vidWidth, glConfig.vidHeight ); MatrixOrthogonalProjection( proj, 0, glConfig.vidWidth, glConfig.vidHeight, 0, 0, 1 ); + // zero the z coordinate so it's never near/far clipped + proj[ 2 ] = proj[ 6 ] = proj[ 10 ] = proj[ 14 ] = 0; + GL_LoadProjectionMatrix( proj ); GL_LoadModelViewMatrix( matrixIdentity ); diff --git a/src/engine/renderer/tr_public.h b/src/engine/renderer/tr_public.h index ecb555e201..d1d2b9b0df 100644 --- a/src/engine/renderer/tr_public.h +++ b/src/engine/renderer/tr_public.h @@ -132,7 +132,6 @@ struct glconfig2_t bool uniformBufferObjectAvailable; bool mapBufferRangeAvailable; bool syncAvailable; - bool depthClampAvailable; bool halfFloatVertexAvailable; bool colorGrading; diff --git a/src/engine/renderer/tr_shade.cpp b/src/engine/renderer/tr_shade.cpp index 557e43f768..5e2d8dbd4d 100644 --- a/src/engine/renderer/tr_shade.cpp +++ b/src/engine/renderer/tr_shade.cpp @@ -851,21 +851,11 @@ static void Render_generic2D( shaderStage_t *pStage ) gl_generic2DShader->SetUniform_ColorMapBindless( BindAnimatedImage( 0, &pStage->bundle[TB_COLORMAP] ) ); gl_generic2DShader->SetUniform_TextureMatrix( tess.svars.texMatrices[ TB_COLORMAP ] ); - if ( glConfig2.depthClampAvailable ) - { - glEnable( GL_DEPTH_CLAMP ); - } - gl_generic2DShader->SetRequiredVertexPointers(); Tess_DrawElements(); GL_CheckErrors(); - if ( glConfig2.depthClampAvailable ) - { - glDisable( GL_DEPTH_CLAMP ); - } - GL_CheckErrors(); } diff --git a/src/engine/sys/sdl_glimp.cpp b/src/engine/sys/sdl_glimp.cpp index f425dee77e..551036d283 100644 --- a/src/engine/sys/sdl_glimp.cpp +++ b/src/engine/sys/sdl_glimp.cpp @@ -70,8 +70,6 @@ static Cvar::Cvar r_arb_buffer_storage( "r_arb_buffer_storage", "Use GL_ARB_buffer_storage if available", Cvar::NONE, true ); static Cvar::Cvar r_arb_compute_shader( "r_arb_compute_shader", "Use GL_ARB_compute_shader if available", Cvar::NONE, true ); -static Cvar::Cvar r_arb_depth_clamp( "r_arb_depth_clamp", - "Use GL_ARB_depth_clamp if available", Cvar::NONE, true ); static Cvar::Cvar r_arb_framebuffer_object( "r_arb_framebuffer_object", "Use GL_ARB_framebuffer_object if available", Cvar::NONE, true ); static Cvar::Cvar r_arb_explicit_uniform_location( "r_arb_explicit_uniform_location", @@ -1973,7 +1971,6 @@ static void GLimp_InitExtensions() Cvar::Latch( r_arb_bindless_texture ); Cvar::Latch( r_arb_buffer_storage ); Cvar::Latch( r_arb_compute_shader ); - Cvar::Latch( r_arb_depth_clamp ); Cvar::Latch( r_arb_explicit_uniform_location ); Cvar::Latch( r_arb_framebuffer_object ); Cvar::Latch( r_arb_gpu_shader5 ); @@ -2395,9 +2392,6 @@ static void GLimp_InitExtensions() // made required in OpenGL 3.2 glConfig2.syncAvailable = LOAD_EXTENSION_WITH_TEST( ExtFlag_CORE, ARB_sync, r_arb_sync.Get() ); - // made required in OpenGL 3.2 - glConfig2.depthClampAvailable = LOAD_EXTENSION_WITH_TEST( ExtFlag_CORE, ARB_depth_clamp, r_arb_depth_clamp.Get() ); - // made required in OpenGL 4.3 glConfig2.computeShaderAvailable = LOAD_EXTENSION_WITH_TEST( ExtFlag_NONE, ARB_compute_shader, r_arb_compute_shader.Get() ); From 2621ec2b0a17382d5f772d3a9857d2c0259dd887 Mon Sep 17 00:00:00 2001 From: slipher Date: Mon, 18 Nov 2024 07:48:11 -0600 Subject: [PATCH 4/4] NUKE depth/stencil channels of default framebuffer All 3D rendering and even screen-space effects are done in FBOs. The default framebuffer is only targeted when drawing the UI, so a depth buffer is not neede. --- src/engine/sys/sdl_glimp.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/engine/sys/sdl_glimp.cpp b/src/engine/sys/sdl_glimp.cpp index 551036d283..500a94362d 100644 --- a/src/engine/sys/sdl_glimp.cpp +++ b/src/engine/sys/sdl_glimp.cpp @@ -755,11 +755,16 @@ static std::string ContextDescription( const glConfiguration& configuration ) static void GLimp_SetAttributes( const glConfiguration &configuration ) { + // FIXME: 3 * 4 = 12 which is more than 8 int perChannelColorBits = configuration.colorBits == 24 ? 8 : 4; SDL_GL_SetAttribute( SDL_GL_RED_SIZE, perChannelColorBits ); SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, perChannelColorBits ); SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, perChannelColorBits ); + + // Depth/stencil channels are not needed since all 3D rendering is done in FBOs + SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 0 ); + SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 0 ); SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); if ( !r_glAllowSoftware->integer )