]> OCCT Git - occt.git/commitdiff
Fix grid flickering
authormzernova <mzernova@opencascade.com>
Thu, 21 Nov 2024 15:02:23 +0000 (15:02 +0000)
committermzernova <mzernova@opencascade.com>
Thu, 21 Nov 2024 15:02:23 +0000 (15:02 +0000)
src/Graphic3d/Graphic3d_ShaderManager.cxx
src/OpenGl/OpenGl_View.cxx

index dc6db5f0bdf4231aeb4e720e392b144f052864b2..9cd5380c643bf818b74bbe79c612e9c8706eb792 100644 (file)
@@ -2280,7 +2280,7 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getGridProgram() const
     EOL"    aColor.a *= aFading;"
     EOL"  }"
 
-    EOL"  gl_FragDepth = uIsBackground ? aFar - 0.001 : min (aDepth, aFar - 0.001);"
+    EOL"  gl_FragDepth = uIsBackground ? 1.0 : min (aDepth, 1.0);"
     EOL"  occFragColor = aColor;"
     EOL"}";
 
index 8bf06e4d90b3be58b4be65cdd8c5780e9fbfc36e..65b5a1ecaf869f5ed239ecefd83000c0491ec50e 100644 (file)
@@ -2565,8 +2565,11 @@ void OpenGl_View::renderGrid()
   const Handle(OpenGl_Context)& aContext = myWorkspace->GetGlContext();
 
   Bnd_Box aBnd = MinMaxValues (Standard_True);
-  aBnd.Add (myGridParams.Position());
-  aContext->Camera()->ZFitAll (1.0, aBnd, aBnd);
+  if (myGridParams.IsBackground() || aBnd.IsOut (myGridParams.Position()))
+  {
+    aBnd.Add (myGridParams.Position());
+    aContext->Camera()->ZFitAll (1.0, aBnd, aBnd);
+  }
 
   const Standard_Real aZNear = aContext->Camera()->ZNear();
   const Standard_Real aZFar = aContext->Camera()->ZFar();
@@ -2586,7 +2589,7 @@ void OpenGl_View::renderGrid()
                               ? OpenGl_Mat4()
                               : aContext->WorldViewState.Current();
   OpenGl_Mat4 aMat;
-  const gp_Pnt& aPosition = myGridParams.Position();
+  const gp_Pnt& aPosition = myGridParams.IsBackground() ? gp_Pnt (0.0, 0.0, -aZFar) : myGridParams.Position();
   aMat.SetColumn (3, Graphic3d_Vec4 ((float)aPosition.X(), (float)aPosition.Y(), (float)aPosition.Z(), 1.0));
 
   aContext->WorldViewState.Push();
@@ -2594,9 +2597,10 @@ void OpenGl_View::renderGrid()
   aContext->ApplyWorldViewMatrix();
 
   aContext->core11fwd->glEnable (GL_DEPTH_TEST);
-  aContext->core11fwd->glDepthFunc (GL_LESS);
+  aContext->core11fwd->glDepthFunc (GL_LEQUAL);
+  aContext->core11fwd->glDepthMask (GL_TRUE);
   aContext->core11fwd->glEnable (GL_BLEND);
-  aContext->core11fwd->glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  aContext->core20fwd->glBlendFuncSeparate (GL_SRC_ALPHA, GL_DST_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
   const Standard_Real aCameraScale = aContext->Camera()->Scale();
   Standard_Real aScale = myGridParams.IsInfinity()
@@ -2620,6 +2624,7 @@ void OpenGl_View::renderGrid()
 
   aContext->Camera()->SetZRange (aZNear, aZFar);
   aContext->Camera()->SetProjectionType (aProjectionType);
+  aContext->core11fwd->glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
   aContext->WorldViewState.Pop();
   aContext->ProjectionState.Pop();