运动模糊:简单的运动模糊效果实现思路方法



    当个物体快速移动时候, 人眼会感觉它变模糊. 同样现象在电影和照片上也存在. 产生这种现象原因是人眼并不是无限快地接收信息, 而是每隔段很短时间” 截取” 幅画面如果物体移动速度超过了人眼捕获画面速度, 那么物体会呈现条纹效果.
 
    了解现实世界中效果有助于我们用计算机去实现它. 理想思路方法是判断每个像素在相邻两帧的间移动速度, 跟据这个信息再来进行处理. 这个方案是可行, 但是有点复杂. 另种思路方法就是将当前帧画面跟上画面进行混合, 并不考虑物体移动速度. 这只是种近似效果, 并在如今视频游戏中得到了广泛应用.
\"\"

实现运动模糊屏幕效果有两方面: 是为了模拟现实中运动模糊 2是它可以减轻渲染中锯齿效果, 特别是在硬件不支持反锯齿情况下, 这是个廉价替代方案.
 
实现原理:
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_( float2 texCoord : TEXCOORD0 ) : COLOR
{
   float4 color1 = tex2D( Texture0, texCoord );
   float4 color2 = tex2D( Texture1, texCoord );
  
   //插值
   lerp( color1, color2, blur_factor );
}
 
最后把BluredRT输出到屏幕即可(按说这里应该再加个Pass, 我偷懒, 直接把BluredRT显示到窗口上看效果了)


快速拖动物体, 可以看到效果了^_^:
 \"\"
Tags:  flash模糊效果 模糊效果 ps模糊效果 运动模糊

延伸阅读

最新评论

发表评论