2015-09-18 62 views
3

我正在製作一個體素遊戲,並且我已經將水設計爲0.5 alpha的立方體。它的偉大工程,如果所有的水是在同一高度,如下圖中:OpenGL體素遊戲 - 避免透明重疊

Water at the same height

但是,如果水不是在同一高度,字母重疊的情況:

Alpha overlapping at different heights

如何防止發生這種重疊? (例如,只繪製每個像素最近的水體,丟棄剩餘的水體)。我是否需要使用FrameBuffers,通過多次傳遞來繪製場景,或者通過使用替代混合函數或採用另一種較少的GPU昂貴的方法就足夠了?

回答

3

我找到了一個答案,沒有畫多場合的場景。我希望它可以幫助某人:

我們將爲每個像素繪製最近的水體,丟棄剩餘的水體,從而避免重疊。

  1. 首先,您通常繪製固體塊。
  2. 然後,在禁用顏色緩衝區glColorMask(false,false,false,false)中的寫入之後,繪製水。 Z緩衝區將根據需要進行更新,但不會有水被抽出。
  3. 最後,您可以在顏色緩衝區(glColorMask(true,true,true,true))中啓用寫入,並將depthFunc設置爲LEQUAL(glDepthFunc(GL_LEQUAL))。只有最近的水像素才能通過深度測試(將其設置爲LEQUAL而不是EQUAL處理,但存在一些罕見但可能的浮點逼近誤差)。啓用混合,再拉水會產生我們想要的效果:

enter image description here