如果它是與順序無關的透明膠片,那麼基本問題是深度緩衝區存儲每個像素的深度,但如果您正在編寫部分透明幾何的視圖,那麼不止一個片段對每個像素都有貢獻。
如果您要穩健地解決問題,則需要每個像素有序的深度列表,然後回到最近的不透明片段。然後你會按照相反的順序走這個列表。在實踐中,OpenGL不會像可變大小的數組那樣做事情,所以人們通過按照先後順序繪製它們的幾何圖形來達到非常好的效果。
GL_SAMPLE_ALPHA_TO_COVERAGE
的一個替代方案是切換到屏幕門透明度,無論是以非常高的分辨率還是採用多重採樣,都無法區分真正的透明度。理想情況下,你會這樣做,但這會使OpenGL重複性規則失效。儘管如此,因爲你在GLSL,你可以自己做。您的採樣器只需輸入alpha,並將其用作輸出最終像素的概率。因此,從某個地方抓住一個範圍在0.0到1.0之間的隨機值,如果它大於alpha,則丟棄該像素。始終以1.0的alpha值輸出,並使用正常的深度緩衝區。 Answers like this對你可以做些什麼來獲得GLSL中的隨機數字有了更多的瞭解,顯然你想盡可能多地進行多重採樣。
Eric Enderton寫了a decent paper(其中有slide version)關於隨機順序無關的透明度,並附帶一個值得檢查的DirectX實現。
「正確混合alpha通道」是什麼意思?你想解決什麼問題?你是否想要做一些與訂單無關的事情? – 2012-03-23 20:27:11
除了Nicol Bolas所說的內容:對於與訂單無關的透明度,一些額外的深度緩衝區是不夠的。什麼可以分層分解場景,這就是所謂的深度剝離。但是,這不是微不足道的。 – datenwolf 2012-03-23 20:36:20
@NicolBolas,是的。如果我可以從glsl讀取Z-Buffer,那麼我有一個簡單的方法來做到這一點! – 2012-03-24 07:27:17