diff --git a/src/gl/renderer/gl_renderstate.cpp b/src/gl/renderer/gl_renderstate.cpp index bdd0867b9..358c9fe7f 100644 --- a/src/gl/renderer/gl_renderstate.cpp +++ b/src/gl/renderer/gl_renderstate.cpp @@ -90,6 +90,7 @@ void FRenderState::Reset() stSrcBlend = stDstBlend = -1; stBlendEquation = -1; stAlphaThreshold = -1.f; + mLastDepthClamp = true; } //========================================================================== diff --git a/src/gl/renderer/gl_renderstate.h b/src/gl/renderer/gl_renderstate.h index b30d7920f..8c3b60772 100644 --- a/src/gl/renderer/gl_renderstate.h +++ b/src/gl/renderer/gl_renderstate.h @@ -63,6 +63,7 @@ class FRenderState float mInterpolationFactor; float mClipHeightTop, mClipHeightBottom; float mShaderTimer; + bool mLastDepthClamp; FVertexBuffer *mVertexBuffer, *mCurrentVertexBuffer; FStateVec4 mColor; @@ -309,6 +310,16 @@ public: } } + // This wraps the depth clamp setting because we frequently need to read it which OpenGL is not particularly performant at... + bool SetDepthClamp(bool on) + { + bool res = mLastDepthClamp; + if (!on) glDisable(GL_DEPTH_CLAMP); + else glEnable(GL_DEPTH_CLAMP); + mLastDepthClamp = on; + return res; + } + void Set2DMode(bool on) { m2D = on; diff --git a/src/gl/scene/gl_portal.cpp b/src/gl/scene/gl_portal.cpp index 02e7747bc..eba8b4d06 100644 --- a/src/gl/scene/gl_portal.cpp +++ b/src/gl/scene/gl_portal.cpp @@ -633,8 +633,7 @@ void GLSkyboxPortal::DrawContents() PlaneMirrorMode=0; - glDisable(GL_DEPTH_CLAMP); - + bool oldclamp = gl_RenderState.SetDepthClamp(false); viewx = origin->PrevX + FixedMul(r_TicFrac, origin->x - origin->PrevX); viewy = origin->PrevY + FixedMul(r_TicFrac, origin->y - origin->PrevY); viewz = origin->PrevZ + FixedMul(r_TicFrac, origin->z - origin->PrevZ); @@ -663,7 +662,7 @@ void GLSkyboxPortal::DrawContents() GLRenderer->DrawScene(); origin->flags&=~MF_JUSTHIT; inskybox=false; - glEnable(GL_DEPTH_CLAMP); + gl_RenderState.SetDepthClamp(oldclamp); skyboxrecursion--; PlaneMirrorMode=old_pm; diff --git a/src/gl/scene/gl_skydome.cpp b/src/gl/scene/gl_skydome.cpp index a6ee502d5..f431e06a6 100644 --- a/src/gl/scene/gl_skydome.cpp +++ b/src/gl/scene/gl_skydome.cpp @@ -475,6 +475,7 @@ void GLSkyPortal::DrawContents() gl_RenderState.EnableFog(false); gl_RenderState.AlphaFunc(GL_GEQUAL, 0.f); gl_RenderState.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + bool oldClamp = gl_RenderState.SetDepthClamp(true); gl_MatrixStack.Push(gl_RenderState.mViewMatrix); GLRenderer->SetupView(0, 0, 0, viewangle, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); @@ -519,5 +520,6 @@ void GLSkyPortal::DrawContents() gl_MatrixStack.Pop(gl_RenderState.mViewMatrix); gl_RenderState.ApplyMatrices(); glset.lightmode = oldlightmode; + gl_RenderState.SetDepthClamp(oldClamp); }