我最近正在使用glPolygonOffset(因子,单位)并找到一些有趣的东西。
我使用了GL_POLYGON_OFFSET_FILL,并将因子和单位设置为负值,以便拉出填充的对象。这个被拉动的物体应该覆盖在其后面绘制的线框。
这适用于对象内部的像素。然而对于那些在物体轮廓上的人来说,似乎没有拉动填充的物体并且那里仍有线条。
glEnable(GL_POLYGON_OFFSET_FILL);
float line_offset_slope = -1.f;
float line_offset_unit = 0.f;
// I also tried slope = 0.f and unit = -1.f, no changes
glPolygonOffset( line_offset_slope, line_offset_unit );
DrawGeo();
glDisable( GL_POLYGON_OFFSET_FILL );
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
DrawGeo();
我读了THIS POST关于glPolygonOffset()的含义和用法。但我仍然不明白为什么拉边不会发生在边界上的那些像素。
答案 0 :(得分:4)
要做到这一点,你绝对不需要 0.0f 的单位。你绝对希望在线框上方绘制的通道的深度值至少比线框小1个单位,无论绘制的图元的斜率如何。我将在下面讨论一种更为简单的方法。
另外需要注意的是,在光栅化过程中,线条基元比多边形具有different coverage rules。线条使用菱形图案进行覆盖测试,三角形使用正方形。您有时会看到软件对所绘制的所有内容应用子像素偏移量( 0.375 , 0.375 ),这是为了对三角形边缘进行覆盖测试而进行的。线条一致。但是,线条图元生成的深度值也与平面多边形不同,因此线条和三角形通常不会用于多遍渲染。
glPolygonMode (...)
不会更改实际的基本类型(它只会更改填充多边形的方式),因此如果这是您的实际代码,则不会出现问题。但是,如果您尝试在一次传递中使用GL_LINES
而在另一次传递中使用GL_TRIANGLES
,则在不考虑像素覆盖率时可能会得到不同的结果。
至于这样做更简单,您应该能够使用GL_LEQUAL
(默认值为GL_LESS
)的深度测试,并在假设您绘制时完全避免深度偏移两次传球都是相同的球体。您需要交换绘制线框和填充球体的顺序,但是应该在最后绘制的东西需要最后绘制。