2012-06-08 37 views
3

爲了繪製貼花我目前正在利用glPolygonOffset(-1,-1),當我通過欺騙貼花的zbuffer值來繪製我的貼花時,這使我擺脫了一些醜陋的z戰鬥僞影,就好像貼花的多邊形更接近相機。我也認爲我可以使用glPolygonOffset和各種花色來相對於彼此排列貼花,但是這似乎是根據相機角度進行調整的,因此當我移動相機時,整個貼花最終會互換交換順序。如何使用OpenGL以特定順序繪製貼花?

,我已經合作過的另一種方法是在這裏本文檔中下:"Making Decals"

  1. 禁用寫深度緩存,並呈現A.
  2. 啓用寫深度緩衝區,渲染B.
  3. 禁用寫入顏色緩衝區,並再次渲染A.
  4. 啓用寫入的顏色緩衝區。

這是我在這樣的嘗試,但我真的不明白這到底是怎麼被擴展在相對順序繪製貼花對方,因爲當寫入啓用深度緩衝貼花繪製,我不會只是得到更多的z戰鬥?

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_BLEND); 

//Render a red solid quad on the color mask 
glDepthMask(false); 
glColor3f (1.0f, 0.0f, 0.0f); 
glBegin (GL_QUADS); 
    glVertex2f(-1,-1); 
    glVertex2f(-1,1); 
    glVertex2f(1,1); 
    glVertex2f(1,-1); 
glEnd(); 

//Render the coincident decal, a transparent square works fine for now 
glDepthMask(true); 
glColor4f(0.0f, 1.0f, 0.0f, 0.5f); 
glTranslatef(0, 1, 0.0f); 
glScalef(0.5f, 0.5f, 0.5f); 
glBegin (GL_QUADS); 
    glVertex2f(-1,-1); 
    glVertex2f(-1,1); 
    glVertex2f(1,1); 
    glVertex2f(1,-1); 
glEnd(); 

//Render the red quad again but only on the depth buffer 
glColorMask(false, false, false, false); 
glLoadIdentity(); 
glColor3f(1.0f, 0.0f, 0.0f); 
glBegin (GL_QUADS); 
    glVertex2f(-1,-1); 
    glVertex2f(-1,1); 
    glVertex2f(1,1); 
    glVertex2f(1,-1); 
glEnd(); 
glColorMask(true, true, true, true); 

這似乎是在大多數遊戲中所做的事情,所以我確信有很多更好的解決方案我錯過了。然而,我做了很多搜索,並且還沒有能夠拿出任何教程來在openGL中訂購像這樣的貼圖。也許我只是使用了錯誤的搜索條件?這個過程還有另一個名字嗎?

回答

2

按照您的建議使用glPolygonOffset,並且前後渲染事物可能會提供比其他選項更好的性能,因爲它應該充分利用GPU中的「早期Z」優化。

您可能想嘗試將較大的數字傳遞給glPolygonOffset,例如(-4,-4)爲第一個貼花,第二個爲(-8,-8)等 - 這不是一門精確的科學;)

當然,在您的glPolygonOffset變得如此之大以至於您的貼花出現在他們不應該看到的東西前面之前,您可以用這種方式繪製多少個貼花。

Re攝像機角度的事情:factor參數glPolygonOffset應該爲高角度的多邊形添加額外的法則。

你可以嘗試另一種方法是:

  • 渲染的所有規則的幾何形狀正常
  • 禁用深度寫入(但保留啓用深度測試)
  • glPolygonOffset(-1, -1)
  • 繪製所有貼花,從後前面

而另一種可能更有效的方法:

  • 清除模板緩存爲0,在幀的開始(在同一時間在清除其他緩衝區)
  • 渲染的所有規則的幾何形狀正常
  • 禁用深度寫入(但保留深度測試啓用)
  • glPolygonOffset(-1, -1)
  • glStencilFunc(GL_NOTEQUAL, 1, 1)glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE)
  • 繪製所有貼花,由前向後
+0

關於您列出的第一個(4分)方法: 這裏不會啓用深度測試結果在貼圖之間發生z-fighting,並且基本上使渲染順序不相關?或者我誤解了深度測試的工作原理? – Lockyer

+0

我無法通過使用較大的值使glPolygon偏移量工作,我不知道它用於處理高度成角度的多邊形的方程式,但我不認爲它真的是要以這種方式堆疊。在考慮了您發佈的更多的(4分)方法之後,我認爲它有可能發揮作用。我會嘗試一下並在這裏發佈結果。 – Lockyer

+0

@Lockyer深度測試和深度編寫是單獨啓用的。如果你只是啓用了深度測試,被遮擋的像素仍然會被丟棄(我們想要的),但是z緩衝區不會被更新,所以你不會得到z-fighting以後的貼花 – dave