【问题标题】:OpenGL: Wireframe overlay hidden line removalOpenGL:线框覆盖隐藏线去除
【发布时间】:2014-12-15 20:55:48
【问题描述】:

我在可视化科学 3D 模型时遇到了一个问题。任务是渲染一个填充了颜色和线框覆盖的模型。这适用于具有闭合曲面的实体模型。

问题 1:

我有几个多边形,但在渲染之前对它们的可见性/方向一无所知。为了确保正确显示所有多边形,我首先顺时针绘制所有多边形,然后逆时针绘制所有多边形,线框叠加层也是如此。这似乎适用于某些型号,但不适用于所有型号。

我的一些模型最终看起来像 this

问题 #2:

我不知道这是否与问题 #1 有关,但 PolygonOffset 使某些边缘看起来很糟糕,可能是因为模型多边形的混合方向:Wireframe edges

**代码:**

由于给我的限制,我必须在 Fortran 77 中编写代码。尽管如此,OpenGL 调用保持不变。这是绘制模型的代码:

c     Draw object 
      do 10 i=1,2
c       Select correct orientation
        if(ccw) then 
            call glFrontFace(GL_CCW)
        else
            call glFrontFace(GL_CW)
        endif

c       Set object color
        call glColor3f(1.0,1.0,1.0)

c       Set polygon mode to fill
        call glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)

c       Set polygon offset and enable offset (float for glPolygonOffset,
c       otherwise it won't work)
        call glPolygonOffset(1.0,2.0)
        call glEnable(GL_POLYGON_OFFSET_FILL)

c       Draw object
        call glCallList(lindex)

c       Disable polygon offset
        call glDisable(GL_POLYGON_OFFSET_FILL)

c       Reverse orientation
        ccw = .not. ccw
 10   continue

c     Draw Wireframe onto Object
      do 20 i=1,2
c       Select correct orientation
        if(ccw) then 
            call glFrontFace(GL_CCW)
        else
            call glFrontFace(GL_CW)
        endif

c       Set object color
        call glColor3f(0.0,0.0,0.0)

c       Set polygon mode to wireframe
        call glPolygonMode(GL_FRONT_AND_BACK,GL_LINE)

c       Draw object
        call glCallList(lindex)

c       Set polygon mode to fill
        call glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)

c       Reverse orientation
        ccw = .not. ccw
 20   continue

其他信息:启用剔除,深度函数为 GL_LESS。

【问题讨论】:

  • 请稍作修改,以便我们以问题的形式进行修改,以便我们更好地回答。
  • 您似乎想使用 GL_POLYGON_OFFSET_FILL 绘制一个实体对象,然后在其上绘制一个线框。您可以通过在绘制线框之前执行 glDisable(GL_DEPTH_TEST) 和之后执行 glEnable(GL_DEPTH_TEST) 以更简单的方式实现这一点,并且您根本不需要 GL_POLYGON_OFFSET_FILL。另外,如果你在绘制之前执行 glDisable(GL_CULL_FACE),你可以摆脱这种丑陋的 glFrontFace(GL_CCW)/glFrontFace(GL_CW) 杂耍。
  • 感谢您的回答。禁用线框绘图的深度测试并不能解决问题,因为现在所有线框线都显示在每个模型上,但我只想看到可见的线框线。

标签: opengl orientation polygons wireframe culling


【解决方案1】:

我找到了问题的原因:我使用了 16 位深度缓冲区,切换到 32 位消除了所有问题。

【讨论】:

    【解决方案2】:

    如果使用 CW 和 CCW,为什么要使用 GL_FRONT_AND_BACK 进行渲染。当然只是使用 GL_FRONT。 glOffset 有其局限性,因此某些边缘可能会偏移到您的模型中,因此仅在某些边缘参差不齐,这完全取决于它们所在的一侧。看着 X2d4K,我觉得模型本身可能包含“错误”定向的表面,所以最好尝试在不进行背面剔除的情况下这样做。那么深度缓冲区隐藏方向的任何变化应该没有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多