]> OCCT Git - occt-copy.git/commitdiff
0030713: Visualization, TKOpenGl - stipple line artifacts [backport for OCCT 7.2.0]
authorkgv <kgv@opencascade.com>
Mon, 19 Oct 2020 09:09:54 +0000 (12:09 +0300)
committerkgv <kgv@opencascade.com>
Mon, 19 Oct 2020 09:09:54 +0000 (12:09 +0300)
Added workaround for dashed line presentation on Intel UHD Graphics 630.

src/OpenGl/OpenGl_Context.cxx
src/OpenGl/OpenGl_ShaderManager.cxx
src/OpenGl/OpenGl_ShaderProgram.cxx
src/OpenGl/OpenGl_ShaderProgram.hxx
tests/bugs/vis/bug30713 [new file with mode: 0644]

index 8cca45c36c34fa9ffecc1903045e77a544772143..09eb296f19f71ee2cf65d5b1687b0e4a5f3b90b1 100644 (file)
@@ -3279,8 +3279,17 @@ void OpenGl_Context::SetLineStipple (const Standard_ShortReal theFactor,
 {
   if (!myActiveProgram.IsNull())
   {
-    myActiveProgram->SetUniform (this, "uPattern", (Standard_Integer )thePattern);
-    myActiveProgram->SetUniform (this, "uFactor",  theFactor);
+    const GLint aLocPattern  = myActiveProgram->GetStateLocation (OpenGl_OCCT_LINE_STIPPLE_PATTERN);
+    const GLint aLocFactor   = myActiveProgram->GetStateLocation (OpenGl_OCCT_LINE_STIPPLE_FACTOR);
+    const GLint aLocViewPort = myActiveProgram->GetStateLocation (OpenGl_OCCT_VIEWPORT);
+    if (aLocPattern != OpenGl_ShaderProgram::INVALID_LOCATION)
+    {
+      myActiveProgram->SetUniform (this, aLocViewPort,
+                                   OpenGl_Vec4 ((float )myViewport[0], (float )myViewport[1],
+                                                (float )myViewport[2], (float )myViewport[3]));
+      myActiveProgram->SetUniform (this, aLocPattern, (Standard_Integer )thePattern);
+      myActiveProgram->SetUniform (this, aLocFactor,  theFactor);
+    }
     return;
   }
 
index e01e151343a8ebdf14eda6bba22983c35e05c54d..9d9b0876eadd7b464d51e47a69e8b8b8bf7a4922 100644 (file)
@@ -1511,18 +1511,29 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad
     if (hasGlslBitOps)
     {
       aSrcVertExtraOut +=
-        EOL"THE_SHADER_OUT vec2 ScreenSpaceCoord;";
+        EOL"THE_SHADER_OUT vec2 ScreenSpaceCoord;"
+        EOL"uniform vec4  occViewport;";
       aSrcFragExtraOut +=
         EOL"THE_SHADER_IN  vec2 ScreenSpaceCoord;"
-        EOL"uniform int   uPattern;"
-        EOL"uniform float uFactor;";
+        EOL"uniform int   occStipplePattern;"
+        EOL"uniform float occStippleFactor;";
       aSrcVertEndMain =
-        EOL"  ScreenSpaceCoord = gl_Position.xy / gl_Position.w;";
+        EOL"  vec2 aPosition   = gl_Position.xy / gl_Position.w;"
+        EOL"  aPosition        = aPosition * 0.5 + 0.5;"
+        EOL"  ScreenSpaceCoord = aPosition.xy * occViewport.zw + occViewport.xy;";
       aSrcFragMainGetColor =
-        EOL"  float anAngle      = atan (dFdx (ScreenSpaceCoord.x), dFdy (ScreenSpaceCoord.y));"
-        EOL"  float aRotatePoint = gl_FragCoord.x * sin (anAngle) + gl_FragCoord.y * cos (anAngle);"
-        EOL"  uint  aBit         = uint (floor (aRotatePoint / uFactor + 0.5)) & 15U;"
-        EOL"  if ((uint (uPattern) & (1U << aBit)) == 0U) discard;"
+        EOL"  vec2 anAxis = vec2 (0.0);"
+        EOL"  if (abs (dFdx (ScreenSpaceCoord.x)) - abs (dFdy (ScreenSpaceCoord.y)) > 0.001)"
+        EOL"  {"
+        EOL"    anAxis = vec2 (1.0, 0.0);"
+        EOL"  }"
+        EOL"  else"
+        EOL"  {"
+        EOL"    anAxis = vec2 (0.0, 1.0);"
+        EOL"  }"
+        EOL"  float aRotatePoint = dot (gl_FragCoord.xy, anAxis);"
+        EOL"  uint  aBit         = uint (floor (aRotatePoint / occStippleFactor + 0.5)) & 15U;"
+        EOL"  if ((uint (occStipplePattern) & (1U << aBit)) == 0U) discard;"
         EOL"  vec4 aColor = getColor();"
         EOL"  if (aColor.a <= 0.1) discard;"
         EOL"  occFragColor = aColor;";
index 74344dd8ecd293b284fffd67a4db261108fba694..005e57d769bdc147ca126c02c2c1e05e8870bf56 100755 (executable)
@@ -73,7 +73,12 @@ Standard_CString OpenGl_ShaderProgram::PredefinedKeywords[] =
   "occOitDepthFactor",     // OpenGl_OCCT_OIT_DEPTH_FACTOR
 
   "occTexTrsf2d",          // OpenGl_OCCT_TEXTURE_TRSF2D
-  "occPointSize"           // OpenGl_OCCT_POINT_SIZE
+  "occPointSize",          // OpenGl_OCCT_POINT_SIZE
+
+  "occViewport",           // OpenGl_OCCT_VIEWPORT
+  "occStipplePattern",     // OpenGl_OCCT_LINE_STIPPLE_PATTERN
+  "occStippleFactor"       // OpenGl_OCCT_LINE_STIPPLE_FACTOR
+
 };
 
 // =======================================================================
index 897525028dbe1d3f92d711614097698ffdfc4f14..26a047d0fd7d6ff3722928be962d6dfba57ca696 100755 (executable)
@@ -73,6 +73,11 @@ enum OpenGl_StateVariable
   OpenGl_OCCT_TEXTURE_TRSF2D,
   OpenGl_OCCT_POINT_SIZE,
 
+  // Wireframe state
+  OpenGl_OCCT_VIEWPORT,
+  OpenGl_OCCT_LINE_STIPPLE_PATTERN, // occStipplePattern
+  OpenGl_OCCT_LINE_STIPPLE_FACTOR,  // occStippleFactor
+
   // DON'T MODIFY THIS ITEM (insert new items before it)
   OpenGl_OCCT_NUMBER_OF_STATE_VARIABLES
 };
diff --git a/tests/bugs/vis/bug30713 b/tests/bugs/vis/bug30713
new file mode 100644 (file)
index 0000000..f3f888f
--- /dev/null
@@ -0,0 +1,19 @@
+puts "============="
+puts "0030713: Visualization, TKOpenGl - stipple line artifacts on Intel UHD Graphics 630"
+puts "============="
+
+pload MODELING VISUALIZATION
+box b 1 2 3
+vclear
+vcaps -core
+vinit View1
+vglinfo
+vdisplay -dispMode 0 b
+vtop
+vfit
+vzoom 0.8
+vaspects b -lineType DASH
+vrotate 0 0 0.785
+vfit
+
+vdump ${imagedir}/${casename}.png