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