2017-02-21 25 views
1

我對OpenGL相當陌生,試圖通過創建自己的簡單遊戲引擎來重新發明輪子(爲了好玩),現在我試圖製作一個帶有文本的HUD。爲此,我正在編程生成用於紋理四邊形的片段着色器的字體紋理貼圖,據我所知,這是正常的方法?Stacking部分透明的字體紋理是通過改變渲染順序來打破的

這個作品大多正常,文字在屏幕上會出現一個透明背景讓你看到什麼是它背後如預期(圖1)

如果我再在同一區域中添加另一個文本網第一個但具有更高的Z指數(更接近相機),它呈現在前面文本的頂部並以預期的方式混合(正確使用?)(圖2)

但是,如果我反轉z-index - 以便第一個字符串(粉紅色的字符串)更接近相機(但渲染順序不變),我在圖4中看到效果。 3其中 - 雖然文字背景仍然是透明的,但似乎覆蓋了其他文字,而不是與其混合。

注意:如果我顛倒渲染兩個網格的順序,則會發生同樣的效果,只不過白色文本將成爲違規者。

換句話說,爲什麼只有z索引的順序與渲染順序匹配才能正確混合?我的假設是,如果我試圖在具有部分透明背景的四邊形「後面」渲染某個東西,我必須先渲染它,否則深度測試會將其頂部切掉。這是我應該習慣的圖形渲染的基本規則嗎?我是否需要跟蹤堆疊順序並確保按照正確的順序渲染項目?

render order affects blending

回答

2

雖然你可能能夠通過紋理的透明部分看,OpenGL的不能。當它混合顏色時,它仍然將深度緩衝區設置爲某個值,並且當您想要渲染某個值時,它會被不可見部分遮擋。

要解決此問題,您可以禁用深度測試,也可以從後向前排列三角形。

+1

如果不想讓文本顯示在對象後面,也可以禁用文本幾何的深度寫入,但保持深度測試的啓用。 – BDL