1. 程式人生 > >透明混合渲染順序機制

透明混合渲染順序機制

一、首先來說一下計算機如果解決可見性問題:

兩個步驟:1.深度測試。2.深度寫入。兩個步驟都可控制是否開啟、關閉。

在一個片元A進行渲染的時候,首先進行深度測試,用A的深度值Za與深度緩衝中的深度值Zz進行比較,如果Za > Zz說明A離攝像機更遠,則A的顏色值和深度值不會寫入到顏色緩衝和深度緩衝中。

以上是物體A開啟了深度測試和深度寫入的情況下的工作流程,如果要實現透明效果,則複雜了,因為透明度混合關閉了深度寫入。

 

二、為什麼進行透明度混合時半透明物體需要關閉深度寫入?

假設半透明物體A開啟深度寫入,在進行深度測試時,與深度緩衝中不透明物體B深度值相比,離攝像機更近,會直接把A的深度值覆蓋掉B的,顏色值也會覆蓋掉,B會看不到。重點:開啟深度寫入,會覆蓋掉顏色值,毫無保留

 

三、半透明物體A關閉深度寫入之後,不同的渲染順序就會導致不同結果。

(一)假設半透明物體A在不透明B的前面,A距離攝像機更近。

1)如果先渲染A,此時深度緩衝和顏色緩衝中都沒有值,A不會寫入到深度緩衝中,顏色值會寫入到顏色緩衝中。再渲染B,深度測試此時深度緩衝中沒有值,B的深度寫入到深度緩衝中,直接覆蓋掉A的顏色,導致看不到A,只能看到B。

2)如果先渲染B,B的深度值、顏色值寫入深度緩衝、顏色緩衝,A進行深度測試,深度值比深度緩衝裡深度值小,距離攝像機更近,會用A的透明度跟顏色緩衝中的顏色值進行混合。

(二)假設兩個半透明物體A跟B,A在B前面,距離攝像機更近:

1)如果先渲染A,此時深度緩衝和顏色緩衝中都沒有值,A不會寫入到深度緩衝中,顏色值會寫入到顏色緩衝中,B進行深度測試,但是此時深度緩衝中沒有值,而顏色緩衝中有顏色值,那麼B就會和A進行混合,看起來B在A前面,得到錯誤結果。

2)如果先渲染B,此時深度緩衝和顏色緩衝中都沒有值,B不會寫入到深度緩衝中,顏色值會寫入到顏色緩衝中,A進行深度測試,但是此時深度緩衝中沒有值,而顏色緩衝中有顏色值,那麼A就會和B進行混合,看起來A在B前面,結果正確。

注意:在顏色緩衝區裡沒有顏色值得時候,即使是半透明物體也會寫入進去,因為沒有顏色跟這個半透明物體混合。如果顏色緩衝區裡面有顏色值,並且進行深度測試時半透明物體離攝像機更近,那麼會透明混合。