diff --git a/src/OpenGl/OpenGl_Context.cxx b/src/OpenGl/OpenGl_Context.cxx index 8cca45c36c..09eb296f19 100644 --- a/src/OpenGl/OpenGl_Context.cxx +++ b/src/OpenGl/OpenGl_Context.cxx @@ -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; } diff --git a/src/OpenGl/OpenGl_ShaderManager.cxx b/src/OpenGl/OpenGl_ShaderManager.cxx index e01e151343..9d9b0876ea 100644 --- a/src/OpenGl/OpenGl_ShaderManager.cxx +++ b/src/OpenGl/OpenGl_ShaderManager.cxx @@ -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;"; diff --git a/src/OpenGl/OpenGl_ShaderProgram.cxx b/src/OpenGl/OpenGl_ShaderProgram.cxx index 74344dd8ec..005e57d769 100755 --- a/src/OpenGl/OpenGl_ShaderProgram.cxx +++ b/src/OpenGl/OpenGl_ShaderProgram.cxx @@ -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 + }; // ======================================================================= diff --git a/src/OpenGl/OpenGl_ShaderProgram.hxx b/src/OpenGl/OpenGl_ShaderProgram.hxx index 897525028d..26a047d0fd 100755 --- a/src/OpenGl/OpenGl_ShaderProgram.hxx +++ b/src/OpenGl/OpenGl_ShaderProgram.hxx @@ -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 index 0000000000..f3f888fe24 --- /dev/null +++ b/tests/bugs/vis/bug30713 @@ -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