前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单的运动模糊效果实现

简单的运动模糊效果实现

作者头像
逍遥剑客
发布2018-05-21 14:56:17
9930
发布2018-05-21 14:56:17
举报
文章被收录于专栏:逍遥剑客的游戏开发

当一个物体快速移动的时候, 人眼会感觉它变模糊. 同样的现象在电影和照片上也存在. 产生这种现象的原因是人眼并不是无限快地接收信息的, 而是每隔一段很短的时间” 截取” 一幅画面。如果物体移动的速度超过了人眼捕获画面的速度, 那么物体会呈现条纹效果.

了解现实世界中的效果有助于我们用计算机去实现它. 理想的方法是判断每个像素在相邻两帧之间移动的速度, 跟据这个信息再来进行处理. 这个方案是可行的, 但是有点复杂. 另一种方法就是将当前帧的画面跟上一帧的画面进行混合, 并不考虑物体的移动速度. 这只是一种近似效果, 并在如今的视频游戏中得到了广泛的应用.

实现运动模糊屏幕效果有两方面的目的: 一是为了模拟现实中的运动模糊 二是它可以减轻渲染中的锯齿效果, 特别是在硬件不支持反锯齿的情况下, 这是一个廉价的替代方案.

实现原理:

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显示到窗口上看效果了)

快速拖动物体, 可以看到效果了^_^:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2007年10月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档