什麼是景深效果?
景深效果,簡稱dof,在人眼跟光學攝像裝置上很常見.如下圖:
簡單地來說,就是近處跟遠處的景物模糊,而焦點附近的物體則很清晰.至於為什麼會產生這樣的效果,我就懶得說了:p
那麼怎麼來實現這種效果呢?
看圖:
從攝像機開始,按距離分成三部分:
近距離模糊,焦點範圍(清晰),遠距離模糊
渲染的時候按深度(即距離)進行判斷,在焦點範圍內則是清晰的,否則就進行模糊處理.
整個過程分三個pass:
1.將場景渲染到乙個rendertarget,做為清晰版.
2.將上一步得到的rendertarget進行模糊處理,得到bluredrt(模糊版).
3.合成.跟據距離來判斷是否應該模糊,如果不在焦點範圍內則繪製bluredrt,否則就繪製rendertarget.
那麼,還有乙個問題,深度值怎麼計算呢?
公式: wdepth = depth / far_z_clip.
在這裡我是把深度值存在alpha通道中一塊渲染到rendertarget,這樣在最後一步直接取color.a就可以進行深度判斷了
(右圖為alpha通道,儲存了深度值)
shader與最終效果
sampler rendertarget;
sampler bluredrt;
//焦點範圍
是不是看起來很不自然?
為什麼呢?因為這樣實現的dof在清晰與模糊的交界處過渡太生硬了,所以就像分成了三部分一樣-_-!
那我們增加兩個過渡不就成了?
就像這樣:
//焦點範圍
webgl 實現景深效果(二)
上回我們說到,僅僅使用簡單的混合會導致渲染出現兩個問題 那麼如何解決這兩個問題呢?答案是對前景和後景分開做處理。我們可以先處理後景,再處理前景。後景混入前景的問題好辦,在計算模糊時,我們對範圍內每乙個畫素做乙個判斷,如果是前景或者對焦區域的點,就將其排除掉。前景邊緣過於清晰的問題就需要用點小技巧了 ...
unity中的景深效果,shader(CG)
在unity中景深效果,正交和透視投影不能用同一shader來實現,在正交投影中,物體座標最終會投射到 1,1,1 1,1,1 的投影空間,且貌似最後,1 z 1以及.w 1.而透視投影的投影空間,near w far,0 z far.深度圖上是 z w 是這樣嗎?如果要做深度圖的話應該是這樣。以下...
Shader 實驗02 後處理實現景深效果
景深 depth of field 是指在攝影機鏡頭或其他成像器前沿能夠取得清晰影象的成像所測定的被攝物體前後距離範圍。而景深效果是指在焦距之外的地方都是模糊的,只有焦距的地方清晰。通過取樣攝像機的深度紋理,得到當前螢幕紋理每個點的深度,使用深度值與焦距值得到每個點到焦距的距離,並使用距離來對原影象...