1. 程式人生 > >簡單的運動模糊效果實現

簡單的運動模糊效果實現

當一個物體快速移動的時候, 人眼會感覺它變模糊. 同樣的現象在電影和照片上也存在. 產生這種現象的原因是人眼並不是無限快地接收資訊的, 而是每隔一段很短的時間” 擷取” 一幅畫面。如果物體移動的速度超過了人眼捕獲畫面的速度, 那麼物體會呈現條紋效果. 瞭解現實世界中的效果有助於我們用計算機去實現它. 理想的方法是判斷每個畫素在相鄰兩幀之間移動的速度, 跟據這個資訊再來進行處理. 這個方案是可行的, 但是有點複雜. 另一種方法就是將當前幀的畫面跟上一幀的畫面進行混合, 並不考慮物體的移動速度. 這只是一種近似效果, 並在如今的視訊遊戲中得到了廣泛的應用. 實現運動模糊螢幕效果有兩方面的目的: 一是為了模擬現實中的運動模糊 二是它可以減輕渲染中的鋸齒效果, 特別是在硬體不支援反鋸齒的情況下, 這是一個廉價的替代方案. 實現原理: 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顯示到視窗上看效果了)
快速拖動物體, 可以看到效果了^_^: