天天看點

簡單的運動模糊效果實作

  當一個物體快速移動的時候, 人眼會感覺它變模糊. 同樣的現象在電影和照片上也存在. 産生這種現象的原因是人眼并不是無限快地接收資訊的, 而是每隔一段很短的時間” 截取” 一幅畫面。如果物體移動的速度超過了人眼捕獲畫面的速度, 那麼物體會呈現條紋效果.   了解現實世界中的效果有助于我們用計算機去實作它. 理想的方法是判斷每個像素在相鄰兩幀之間移動的速度, 跟據這個資訊再來進行處理. 這個方案是可行的, 但是有點複雜. 另一種方法就是将目前幀的畫面跟上一幀的畫面進行混合, 并不考慮物體的移動速度. 這隻是一種近似效果, 并在如今的視訊遊戲中得到了廣泛的應用.

簡單的運動模糊效果實作

實作運動模糊螢幕效果有兩方面的目的: 一是為了模拟現實中的運動模糊 二是它可以減輕渲染中的鋸齒效果, 特别是在硬體不支援反鋸齒的情況下, 這是一個廉價的替代方案.   實作原理: 1.先将場景渲染到一個RenderTarget1上 2.将RenderTarget1跟上一幀渲染的結果進行混合, 并輸出到RenderTarget2 3.将RenderTarget2輸出到螢幕, 并将其保留到下一幀進行混合 詳見下圖:  

簡單的運動模糊效果實作

Shader 實作

簡單的運動模糊效果實作
兩個Pass Teapot Pass将場景正常渲染到BaseSceneRT上.   BlurPass進行混合, 輸出到BluredRT, 注意同時這裡BluredRT做為Texture1輸入上一幀的結果是以設定在渲染時不進行清除操作.   混合時需要一個比例值blur_factor進行插值, 在這裡我設定為0.5 PixelShader代碼: sampler2D Texture0; sampler2D Texture1; float blur_factor;   float4 ps_main( float2 texCoord : TEXCOORD0 ) : COLOR {    float4 color1 = tex2D( Texture0, texCoord );    float4 color2 = tex2D( Texture1, texCoord );       // 插值    return lerp( color1, color2, blur_factor ); }   最後把BluredRT輸出到螢幕即可(按說這裡應該再加一個Pass的, 我偷懶, 直接把BluredRT顯示到視窗上看效果了)

快速拖動物體, 可以看到效果了^_^:  

簡單的運動模糊效果實作

繼續閱讀