OpenGL:线框覆盖隐藏线移除

时间:2014-10-20 19:02:55

标签: opengl orientation polygons wireframe culling

我在研究科学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。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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