稻草人的麦田

图形技术
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[导入]运动模糊的制作

Posted on 2007-11-26 22:30  稻草人的麦田  阅读(366)  评论(0编辑  收藏  举报

今天说一下运动模糊的制作好了,我采用的引擎是ogre+ode,已经有人把ogreode做好了,而且还做了一个汽车可以在里面跑,可是那个汽车竟

然没有运动模糊,而且那个汽车跑的也实在太慢了,我看来要想办法加入点东西才行。
先说下运动模糊的原理,其实我也是边看边说,呵呵,先说一下最基础的运动模糊,就是dx里面那个例子的。
首先,运动模糊属于全屏特效,所以肯定要创建一个和屏幕大小一样的渲染目标。
然后,再创建二个D3DFMT_G16R16F格式的texture,不作为渲染目标来用,但是肯定要传到hlsl里,因此也把参数设置为

D3DUSAGE_RENDERTARGET,只是用来储存屏幕上像素的运动速度,分别储存水平速度和竖直速度。而创建两个的目的就是分别储存上一桢和当前

桢的。
再创建一个屏幕大小的四边形,并且设置屏幕坐标(坐标的设定牵扯Directly Mapping Texels to Pixels)
这样,预备工作就完了。
取得渲染目标,并且更改,然后清空所有渲染目标,和其他全屏特效方法一样。
下面进入每一桢内来讲:
在每一桢中首先是交换当前的速度贴图材质和上一桢的速度贴图材质。
然后记录当前的世界渲染矩阵和视图矩阵,然后在当前贴图材质中在shader中用计算出速度并且保存到贴图中去。这样计算之后就得到了两个

图,一个是上一桢中的图,一个就是这一桢的图。
下一步,切换到我们就要渲染到的真正的屏幕表面,进入shader中去,分别对上一桢和当前桢的屏幕图进行采样,采样的结果分别是是上一桢

的速度和当前的速度。对两者进行比较,V上〉v下则当前像素的速度是就是上一桢的速度乘像素模糊系数,否则就是乘当前的速度乘模糊系数

。之后进行如下操作:
    // For each sample, sum up each sample's color in "Blurred" and then divide
    // to average the color after all the samples are added.
    float3 Blurred = 0;   
    for(float i = 0; i < NumberOfPostProcessSamples; i++)
    {  
        // Sample texture in a new spot based on pixelVelocity vector
        // and average it with the other samples       
        float2 lookup = pixelVelocity * i / NumberOfPostProcessSamples + OriginalUV;
       
        // Lookup the color at this new spot
        float4 Current = tex2D(RenderTargetSampler, lookup);
       
        // Add it with the other samples
        Blurred += Current.rgb;
    }
这样做的结果就是当前像素向周围像素按照速度等级逐渐模糊。
返回值为 (Blurred / NumberOfPostProcessSamples, 1.0f);是对其进行了求平均数的操作。

我修改了dx里面的例子,懒的动手重新写,虽然知道这是对自己的不负责,但是算了。改后的效果如下:我把第一个的运动模糊去掉了。

 

其实这篇日志断断续续写了半个月,想起来也窝囊,公司出了点变故,搞得我们放了1个星期的假,我也给自己放了一个星期的假回学校玩了一个星期才过来。于是耽误了不少时间。这段时间因为公司引擎对光线支持的不是很好,很可能要重写部分模块,于是重新研究lightmap了,打算把以前没有仔细研究透的地方搞透彻,这才发现挺多繁琐的东西我不知道哪。呵呵,发现问题就要补了。


文章来源:http://songxiaoyu8.blog.163.com/blog/static/2081812820071026102930115