glPolygonOffset() 不适用于对象轮廓

0 c opengl graphics

我最近正在使用 glPolygonOffset( Factor,units ) 并发现一些有趣的东西。

\n

我使用了 GL_POLYGON_OFFSET_FILL,并将因子和单位设置为负值,以便填充的对象被拉出。这个拉动的物体应该覆盖紧随其后绘制的线框。

\n

这对于对象内部的像素是正确的。然而,对于那些在对象轮廓上的对象,填充的对象似乎没有被拉动,并且那里仍然有线条。

\n

在拉动填充对象之前:

\n

\xc2\xa0\xc2\xa0这是在我拉动填充对象之前

\n

拉动填充对象后:

\n

\xc2\xa0\xc2\xa0这是我拉动填充对象之后的结果

\n
glEnable(GL_POLYGON_OFFSET_FILL);\nfloat line_offset_slope = -1.f;\nfloat line_offset_unit = 0.f;\n// I also tried slope = 0.f and unit = -1.f, no changes\n\nglPolygonOffset( line_offset_slope, line_offset_unit );\nDrawGeo();\n\nglDisable( GL_POLYGON_OFFSET_FILL );  \nglPolygonMode( GL_FRONT_AND_BACK, GL_LINE );\nDrawGeo();\n
Run Code Online (Sandbox Code Playgroud)\n

我读过这篇关于 glPolygonOffset() 的含义和用法的文章。但我仍然不明白为什么边界上的那些像素没有发生拉动。

\n

And*_*man 5

要正确执行此操作,您绝对不需要0.0f单位。您绝对希望在线框之上绘制的通道的深度值至少比线框近 1 个单位,无论绘制的图元的斜率如何。不过,我将在下面讨论一种更简单的方法。

另一件需要注意的事情是,线图元在光栅化过程中具有与多边形不同的覆盖规则。线条使用菱形图案进行覆盖测试,三角形使用正方形。有时您会看到软件应用子像素偏移,例如(0.375 0.375)这样的子像素偏移,这是作为一种黑客行为来使三角形边缘和线条的覆盖测试保持一致。然而,线基元生成的深度值也与平面多边形不同,因此线和三角形通常不适合多通道渲染。

glPolygonMode (...)不会更改实际的图元类型(它只会更改多边形的填充方式),因此如果这是您的实际代码,那么这不会成为问题。但是,如果您尝试这样做GL_LINES在一次传递和GL_TRIANGLES另一次传递中执行此操作,并且不考虑像素覆盖,则可能会得到不同的结果。

至于更简单地做到这一点,您应该能够使用深度测试GL_LEQUAL默认为GL_LESS)并完全避免深度偏移,假设您在两次传递中绘制相同的球体。然而,您将需要交换绘制线框和填充球体的顺序 - 应该在顶部的东西需要最后绘制。