【问题标题】:glPolygonOffset() not work for object outlineglPolygonOffset() 不适用于对象轮廓
【发布时间】:2015-01-08 01:18:52
【问题描述】:

我最近在玩 glPolygonOffset(factor, units),发现了一些有趣的东西。

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

【问题讨论】:

    标签: c opengl graphics


    【解决方案1】:

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

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

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

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

    【讨论】:

    • +1,提到不同的覆盖规则很有趣,我不知道。
    • 感谢您的回复。是的,我对这两种情况都使用了 GL_TRIANGLES,因此不同的覆盖规则问题在这里不适用。我不会坚持使用 glPolygonOffset。这似乎是不可预测的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多