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())
{
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;
}

View 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;";

View File

@ -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
};
// =======================================================================

View File

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

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