glPolygonOffset()不适用于对象轮廓

时间:2015-01-08 01:18:53

标签: c opengl graphics

我最近正在使用glPolygonOffset(因子,单位)并找到一些有趣的东西。

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

这适用于对象内部的像素。然而对于那些在物体轮廓上的人来说,似乎没有拉动填充的物体并且那里仍有线条。

在拉动填充物体之前:

This is before I pull the filled object

拉出填充的物体后:

This is after I pull the filled object

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()的含义和用法。但我仍然不明白为什么拉边不会发生在边界上的那些像素。

1 个答案:

答案 0 :(得分:4)

要做到这一点,你绝对不需要 0.0f 的单位。你绝对希望在线框上方绘制的通道的深度值至少比线框小1个单位,无论绘制的图元的斜率如何。我将在下面讨论一种更为简单的方法。

另外需要注意的是,在光栅化过程中,线条基元比多边形具有different coverage rules。线条使用菱形图案进行覆盖测试,三角形使用正方形。您有时会看到软件对所绘制的所有内容应用子像素偏移量( 0.375 0.375 ),这是为了对三角形边缘进行覆盖测试而进行的。线条一致。但是,线条图元生成的深度值也与平面多边形不同,因此线条和三角形通常不会用于多遍渲染。

glPolygonMode (...)不会更改实际的基本类型(它只会更改填充多边形的方式),因此如果这是您的实际代码,则不会出现问题。但是,如果您尝试在一次传递中使用GL_LINES而在另一次传递中使用GL_TRIANGLES,则在不考虑像素覆盖率时可能会得到不同的结果。

至于这样做更简单,您应该能够使用GL_LEQUAL默认值为GL_LESS )的深度测试,并在假设您绘制时完全避免深度偏移两次传球都是相同的球体。您需要交换绘制线框和填充球体的顺序,但是应该在最后绘制的东西需要最后绘制。