爲了繪製貼花我目前正在利用glPolygonOffset(-1,-1)
,當我通過欺騙貼花的zbuffer值來繪製我的貼花時,這使我擺脫了一些醜陋的z戰鬥僞影,就好像貼花的多邊形更接近相機。我也認爲我可以使用glPolygonOffset
和各種花色來相對於彼此排列貼花,但是這似乎是根據相機角度進行調整的,因此當我移動相機時,整個貼花最終會互換交換順序。如何使用OpenGL以特定順序繪製貼花?
,我已經合作過的另一種方法是在這裏本文檔中下:"Making Decals"
- 禁用寫深度緩存,並呈現A.
- 啓用寫深度緩衝區,渲染B.
- 禁用寫入顏色緩衝區,並再次渲染A.
- 啓用寫入的顏色緩衝區。
這是我在這樣的嘗試,但我真的不明白這到底是怎麼被擴展在相對順序繪製貼花對方,因爲當寫入啓用深度緩衝貼花繪製,我不會只是得到更多的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中訂購像這樣的貼圖。也許我只是使用了錯誤的搜索條件?這個過程還有另一個名字嗎?
關於您列出的第一個(4分)方法: 這裏不會啓用深度測試結果在貼圖之間發生z-fighting,並且基本上使渲染順序不相關?或者我誤解了深度測試的工作原理? – Lockyer
我無法通過使用較大的值使glPolygon偏移量工作,我不知道它用於處理高度成角度的多邊形的方程式,但我不認爲它真的是要以這種方式堆疊。在考慮了您發佈的更多的(4分)方法之後,我認爲它有可能發揮作用。我會嘗試一下並在這裏發佈結果。 – Lockyer
@Lockyer深度測試和深度編寫是單獨啓用的。如果你只是啓用了深度測試,被遮擋的像素仍然會被丟棄(我們想要的),但是z緩衝區不會被更新,所以你不會得到z-fighting以後的貼花 – dave