From f18929a30438644c7f3c4117aa0a959ad5266f0f Mon Sep 17 00:00:00 2001 From: Mike Nelson Date: Tue, 17 Feb 2026 11:31:08 -0600 Subject: [PATCH] Fix models rendering incorrectly when using rtt --- code/graphics/opengl/gropengltexture.cpp | 15 +++++++++------ code/graphics/opengl/gropengltnl.cpp | 5 ++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/code/graphics/opengl/gropengltexture.cpp b/code/graphics/opengl/gropengltexture.cpp index 76f540f78c8..60984c56160 100644 --- a/code/graphics/opengl/gropengltexture.cpp +++ b/code/graphics/opengl/gropengltexture.cpp @@ -1866,10 +1866,10 @@ int opengl_make_render_target( int handle, int *w, int *h, int *bpp, int *mm_lvl GL_state.Texture.Enable(0); - // render buffer -// glGenRenderbuffers(1, &new_fbo.renderbuffer_id); -// glBindRenderbuffer(GL_RENDERBUFFER, new_fbo.renderbuffer_id); -// glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, *w, *h); + // render buffer (depth) + glGenRenderbuffers(1, &new_fbo->renderbuffer_id); + glBindRenderbuffer(GL_RENDERBUFFER, new_fbo->renderbuffer_id); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, *w, *h); glBindRenderbuffer(GL_RENDERBUFFER, 0); // frame buffer @@ -1883,7 +1883,7 @@ int opengl_make_render_target( int handle, int *w, int *h, int *bpp, int *mm_lvl glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, ts->texture_id, 0, 0); } -// glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, new_fbo.renderbuffer_id); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, new_fbo->renderbuffer_id); if ( opengl_check_framebuffer() ) { // Oops!! reset everything and then bail @@ -1898,7 +1898,10 @@ int opengl_make_render_target( int handle, int *w, int *h, int *bpp, int *mm_lvl glDeleteFramebuffers(1, &new_fbo->framebuffer_id); - // glDeleteRenderbuffersEXT(1, &new_fbo.renderbuffer_id); + if (new_fbo->renderbuffer_id) { + glDeleteRenderbuffers(1, &new_fbo->renderbuffer_id); + new_fbo->renderbuffer_id = 0; + } opengl_set_texture_target(); opengl_free_fbo_slot(fbo_id); diff --git a/code/graphics/opengl/gropengltnl.cpp b/code/graphics/opengl/gropengltnl.cpp index defcc3bcd2e..43629c9a0c2 100644 --- a/code/graphics/opengl/gropengltnl.cpp +++ b/code/graphics/opengl/gropengltnl.cpp @@ -822,7 +822,10 @@ void opengl_tnl_set_model_material(model_material *material_info) opengl_tnl_set_material(material_info, false, false); if ( GL_state.CullFace() ) { - GL_state.FrontFaceValue(GL_CW); + // Model rendering uses CW front faces in the default backbuffer path. + // Render-to-texture flips the projection vertically, which flips winding, + // so we must invert the front-face definition there. + GL_state.FrontFaceValue(gr_screen.rendering_to_texture != -1 ? GL_CCW : GL_CW); } gr_set_center_alpha(material_info->get_center_alpha());