有序透明度最基本的使用painters algorithm完成。
畫家的算法在對象需要在另一個對象的前面和後面繪製,或者單個對象具有多個透明的子組件的情況下分解。我們不能輕易地將網格的子組件相對於彼此進行排序。
雖然它不能解決問題z-buffer允許我們優化渲染。大多數遊戲使用這個稍微複雜的算法作爲渲染的基礎。
- 呈現所有按材料狀態排序的不透明物體或從前到後 以避免透支。
- 渲染所有透明對象從前到後排序。
遊戲結合使用各種技術來避免此問題。
將模型拆分爲不重疊的透明部分。通常這是隱式完成的,因爲遊戲的透明對象通常會使用與模型其餘部分不同的材質。您還可以使用多層透明度來分割模型,使每個新模型的圖層不重疊。例如,您可以將松樹模型徑向分成5個部分。
這在固定功能管道中更爲常見。現代遊戲只是試圖避免這個問題。
避免模型中的半透明部件。僅將透明度用於消除鋸齒邊緣,以及透明對象可將場景乾淨地分割爲兩個單獨的對象組。 (例如Windows或水上飛機)。像這樣分裂世界並將這些塊前後渲染,可以在不引起其他透明物體明顯切除的情況下繪製出抗鋸齒邊緣。即使它們重疊,只要您的alpha測試設置爲高於〜30%,邊緣本身往往看起來很好。
半透明物體通常呈現爲粒子效果。草和煙是最常見的例子。效果或草地物體組的點列表按每個幀進行排序。這比排序任意子網格要簡單得多。許多戶外遊戲都有複雜的草地和樹葉實例系統。這些允許它們渲染單獨的葉子和刀片,並且正確地對這些葉片進行排序,並避免以這種方式進行大部分渲染開銷,但是它們嚴格限制對象的類型。
許多效果可以使用加法和減法混合而不是阿爾法混合以獨立的順序完成。
如果您的平滑邊緣仍然不可接受,有幾個簡單的選項。您可以將模型的任何部分以低於75%的透明度抖動。或者,您可以通過使用coverage到alpha來讓硬件爲您提供沒有可見工件的工具。這會導致多重採樣硬件抖動透支樣本中的邊緣。它不會給你一個平滑的漸變,但如果你已經打算使用MSAA,4-16級別的alpha對於抗鋸齒邊緣是完全可以接受的,並且是免費的。
有很多警告和特殊情況。如果有水,則可能需要使用模板或深度測試渲染任何與水相交的半透明物體兩次。
將相機移入和移出透明物體始終存在問題。
渲染複雜的半透明物體幾乎是不可能的。就像建築物或幽靈的X射線視圖一樣。許多遊戲只是將這種類型的對象渲染爲疊加。但使用現代硬件,各種更復雜的方案都是可能的。
更復雜的方案
的深度剝離的渲染,你從後到前渲染多遍不同的Z剪切平面複合場景,無論順序還是什麼對象包含字母的方法。它比你所期望的要便宜,因爲許多對象只能渲染一個或兩個片。但它並不完美,許多遊戲開發者認爲它太昂貴了。
Order Independent Transparency還有很多其他品種。使用現代化的GPU和計算器,我們可以一次渲染一個緩衝區,其中每個像素都是一堆可能的切片。然後,我們可以對堆棧進行排序並在後處理中混合這些切片,並且只有在像素上有透明層時纔會導致性能損失。
OIT仍然大多隻用於2.5D遊戲(如小大星球)的特殊情況。但我相信它可能最終成爲遊戲編程的核心工具。
禁用z緩衝時遇到的問題與結束顏色依賴於繪製順序有關。一種方法是從最遠到最近的所有透明對象進行排序,然後按照該順序進行繪製。在這個頁面上有幾篇文章:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-10-transparency/它處理確切的問題。 – BWG