2014-10-20 91 views
0

在處理科學3D模型時,我遇到了一個問題。任務是渲染一個填充了顏色和線框覆蓋的模型。這適用於具有封閉表面的實體模型。OpenGL:線框疊加隱藏線刪除

問題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。

+0

請稍微編輯一下以便以問題形式提供,以便我們可以更好地回答。 – demongolem 2014-10-20 19:10:19

+0

看起來好像要使用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)玩雜耍。 – pelya 2014-10-20 19:33:24

+0

謝謝你的回答。禁用線框圖的深度測試並不能解決問題,因爲現在所有的線框線都顯示在每個模型上,但我只想看到可見的線框線。 – user3413372 2014-10-20 20:33:25

回答

0

如果使用CW和CCW爲什麼要使用GL_FRONT_AND_BACK進行渲染。當然只是使用GL_FRONT。 glOffset有它的侷限性,所以一些邊緣可能會偏移到你的模型中,因此只有一些邊緣是不齊的,這一切都取決於它們所在的一面。看着X2d4K,我得到的印象是模型本身可能包含「錯誤」定向的曲面,所以最好不要使用背面剔除。深度緩衝不應該隱藏任何方向上的變化。

0

我發現我的問題的原因:我用了一個16位深度緩衝區,切換到32位消除了所有的問題。