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:
parent
80289f0312
commit
d34b3ccb8f
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;";
|
||||
|
@ -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
|
||||
|
||||
};
|
||||
|
||||
// =======================================================================
|
||||
|
@ -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
19
tests/bugs/vis/bug30713
Normal 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
|
Loading…
x
Reference in New Issue
Block a user