1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-16 10:54:53 +03:00

0030713: Visualization, TKOpenGl - stipple line artifacts [backport for OCCT 7.2.0]

Added workaround for dashed line presentation on Intel UHD Graphics 630.
This commit is contained in:
kgv 2020-10-19 12:09:54 +03:00
parent 80289f0312
commit d34b3ccb8f
5 changed files with 60 additions and 11 deletions

View File

@ -3279,8 +3279,17 @@ void OpenGl_Context::SetLineStipple (const Standard_ShortReal theFactor,
{ {
if (!myActiveProgram.IsNull()) if (!myActiveProgram.IsNull())
{ {
myActiveProgram->SetUniform (this, "uPattern", (Standard_Integer )thePattern); const GLint aLocPattern = myActiveProgram->GetStateLocation (OpenGl_OCCT_LINE_STIPPLE_PATTERN);
myActiveProgram->SetUniform (this, "uFactor", theFactor); 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; return;
} }

View File

@ -1511,18 +1511,29 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad
if (hasGlslBitOps) if (hasGlslBitOps)
{ {
aSrcVertExtraOut += aSrcVertExtraOut +=
EOL"THE_SHADER_OUT vec2 ScreenSpaceCoord;"; EOL"THE_SHADER_OUT vec2 ScreenSpaceCoord;"
EOL"uniform vec4 occViewport;";
aSrcFragExtraOut += aSrcFragExtraOut +=
EOL"THE_SHADER_IN vec2 ScreenSpaceCoord;" EOL"THE_SHADER_IN vec2 ScreenSpaceCoord;"
EOL"uniform int uPattern;" EOL"uniform int occStipplePattern;"
EOL"uniform float uFactor;"; EOL"uniform float occStippleFactor;";
aSrcVertEndMain = 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 = aSrcFragMainGetColor =
EOL" float anAngle = atan (dFdx (ScreenSpaceCoord.x), dFdy (ScreenSpaceCoord.y));" EOL" vec2 anAxis = vec2 (0.0);"
EOL" float aRotatePoint = gl_FragCoord.x * sin (anAngle) + gl_FragCoord.y * cos (anAngle);" EOL" if (abs (dFdx (ScreenSpaceCoord.x)) - abs (dFdy (ScreenSpaceCoord.y)) > 0.001)"
EOL" uint aBit = uint (floor (aRotatePoint / uFactor + 0.5)) & 15U;" EOL" {"
EOL" if ((uint (uPattern) & (1U << aBit)) == 0U) discard;" 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" vec4 aColor = getColor();"
EOL" if (aColor.a <= 0.1) discard;" EOL" if (aColor.a <= 0.1) discard;"
EOL" occFragColor = aColor;"; EOL" occFragColor = aColor;";

View File

@ -73,7 +73,12 @@ Standard_CString OpenGl_ShaderProgram::PredefinedKeywords[] =
"occOitDepthFactor", // OpenGl_OCCT_OIT_DEPTH_FACTOR "occOitDepthFactor", // OpenGl_OCCT_OIT_DEPTH_FACTOR
"occTexTrsf2d", // OpenGl_OCCT_TEXTURE_TRSF2D "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
}; };
// ======================================================================= // =======================================================================

View File

@ -73,6 +73,11 @@ enum OpenGl_StateVariable
OpenGl_OCCT_TEXTURE_TRSF2D, OpenGl_OCCT_TEXTURE_TRSF2D,
OpenGl_OCCT_POINT_SIZE, 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) // DON'T MODIFY THIS ITEM (insert new items before it)
OpenGl_OCCT_NUMBER_OF_STATE_VARIABLES OpenGl_OCCT_NUMBER_OF_STATE_VARIABLES
}; };

19
tests/bugs/vis/bug30713 Normal file
View File

@ -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