標籤:blog http color strong width art
http://blog.csdn.net/xoyojank/article/details/1883520
什麼是景深效果?景深效果,簡稱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; //焦點範圍float fNearDis;float fFarDis; float4 ps_main( float2 TexCoord : TEXCOORD0 ) : COLOR0{ float4 color = tex2D( RenderTarget, TexCoord ); if( color.a > fNearDis && color.a < fFarDis ) return color; else return tex2D( BluredRT, TexCoord );} |
是不是看起來很不自然?為什麼呢?因為這樣實現的DOF在清晰與模糊的交界處過渡太生硬了,所以就像分成了三部分一樣-_-!
那我們增加兩個過渡不就成了?就像這樣:
| sampler RenderTarget;sampler BluredRT; //焦點範圍float fNearDis;float fFarDis;float fNearRange;float fFarRange; float4 ps_main( float2 TexCoord : TEXCOORD0 ) : COLOR0{ float4 sharp = tex2D( RenderTarget, TexCoord ); float4 blur = tex2D( BluredRT, TexCoord ); float percent = max(saturate(1 - (sharp.a-fNearDis)/fNearRange), saturate((sharp.a-(fFarDis-fFarRange))/fFarRange)); return lerp( sharp, blur, percent );} |