1.介绍

  在电子游戏中模拟速度的一种最好的方法就是使用运动模糊。运动模糊是游戏中最重要的效果之一,尤其是在赛车游戏中,因为它可以增加真实感和速度感。运动模糊还可以帮助游戏画面的平滑,尤其是对于帧速小于等于30的游戏来说。但是,在已有的游戏引擎加入运动模糊是具有挑战性的,因为大多数运动模糊技术需要重新渲染场景,以产生基于每个像素的速度缓冲。这种多轮渲染的方法是具有限制性的:许多应用程序在将场景多次送往图形管线时,并不能保持原有的帧速。

  其他生成基于每个像素的速度映射图的方法包括使用多个渲染目标,然后将速度信息输出到其中一个渲染目标。这种方法的主要不足在于需要改变场景的着色器,增加相应的代码,以计算速度并将其输出到第二个渲染目标。这种方法的另一个不足在于渲染到多个目标在一些平台上可能降低性能。另外,一些平台只有有限的渲染内存,要求一种机制来在1280*720或者更大的帧缓存上使用多个渲染目标。

  在这章中,我们将介绍一项使用深度缓冲作为纹理输入到片段着色器程序来生成场景速度映射图的技术。片段着色器程序使用深度值和视图投影矩阵,为每一个像素计算世界坐标中的位置,而深度值保存在深度缓存中。一旦我们计算出该像素在世界坐标中的位置,我们就可以使用前一帧的视图投影矩阵对它进行变换。然后我们可以计算当前帧和前一帧中视口坐标中该位置的差别,以生成每一个像素的速度值。运动模糊的效果可以通过使用速度向量作为方向来组合帧缓存上的多重采样,然后进行归一化最后产生模糊的效果。

  这项技术的好处在于可以放在后期处理阶段。这将使得这项技术可以很容易地集成到已有的图形引擎中,这些引擎所运行的硬件可能允许在深度缓存上采样作为纹理。

  图1和图2展示了使用运动模糊前后的区别。

图1 使用了运动模糊的场景

图2 没有使用运动模糊的场景

2.从深度缓存提取物体的位置

  当一个物体被渲染并且它的深度值被写入深度缓存时,保存在深度缓存的值是三角面片的z值的插值,该z值是这样计算出来的:首先三角形的三个顶点被世界视图投影矩阵转换,然后xyz坐标被齐次坐标中的w值所除。通过使用深度缓存作为纹理,我们可以提取出渲染到深度缓存的物体的世界坐标中的位置。我们先将视口中的位置使用视图投影矩阵的逆矩阵进行转化,然后用w值乘以结果,得出对应的世界坐标中的位置。令视口位置为像素在视口空间的位置,也就是说,x、y坐标的值在-1到1的范围内,而原点在屏幕的中心。那个像素在深度缓存中的深度值作为z值,而w值设为1。

  我们可以将某一像素的视口位置定义为H:

  令M为世界视图投影矩阵,而W为该像素的世界坐标:

  下面是HLSL/Cg代码:

// Get the depth buffer value at this pixel.

float zOverW = tex2D(depthTexture, texCoord);

// H is the viewport position at this pixel in the range -1 to 1.

float4 H = float4(texCoord.x * 2 - 1, (1 - texCoord.y) * 2 - 1,

zOverW, 1);

// Transform by the view-projection inverse.

float4 D = mul(H, g_ViewProjectionInverseMatrix);

// Divide by w to get the world position.

float4 worldPos = D / D.w;
一旦我们计算出世界坐标,我们可以使用前一帧的视图投影坐标对其进行变换,然后得到屏幕位置上的差别,以计算像素的速度,代码如下:

// Current viewport position

float4 currentPos = H;

// Use the world position, and transform by the previous view-

// projection matrix.

float4 previousPos = mul(worldPos, g_previousViewProjectionMatrix);

// Convert to nonhomogeneous points [-1,1] by dividing by w.

previousPos /= previousPos.w;

// Use this frame's position and last frame's to compute the pixel

// velocity.

float2 velocity = (currentPos - previousPos)/2.f;

  请求深度缓存作为纹理使用的方法取决于使用的平台,依赖于图形API。访问深度缓存作为纹理的细节在Gilham 2006中有详细讨论。如果硬件不支持从深度缓存中采样作为纹理的话,就要使用多个渲染目标然后将深度输出到一个单独的渲染目标,或者将深度值输出到颜色缓存的alpha通道。

3.运行运动模糊

一旦我们有了像素的速度,我们可以在颜色缓存中沿着那个方向采样,累计颜色值来得到运动模糊的值,如下代码:

// Get the initial color at this pixel.

float4 color = tex2D(sceneSampler, texCoord);

texCoord += velocity;

for(int i = 1; i < g_numSamples; ++i, texCoord += velocity)

{

// Sample the color buffer along the velocity vector.

float4 currentColor = tex2D(sceneSampler, texCoord);

// Add the current color to our color sum.

color += currentColor;

}

// Average all of the samples to get the final blur color.

float4 finalColor = color / numSamples;

我们可以在图3中看到运行结果,注意到接近观察者的地形比远处的地形更模糊。

图3 运动模糊的运行结果

4.处理动态的物体

  这项技术使用在静止的物体上效果非常好,因为它只考虑到摄像机的运动。但是,如果需要更加精确地记录动态物体的速度,那么我们可以生成独立的速度纹理。

  为了生成缸体动态物体的速度纹理,首先要使用当前帧的视图投影矩阵以及前一帧的视图投影矩阵对物体进行变换,然后计算视口位置的差异。接着将两个变换后的位置传入片段着色器,并计算速度。这项技术在DirectX 9 SDK's 的运动模糊示例中被描述。

5.屏蔽的物体

  取决于应用程序,你可能需要屏蔽场景的某个部分,不对此部分使用运动模糊。比如,在赛车游戏中,你需要保持所有车辆的清晰度和细节,而不对其进行模糊。一种简单的方法是渲染一个掩模到一个单独的纹理或者到颜色缓存的alpha通道,然后使用这个掩模来决定什么像素应该被模糊。

6.额外的工作

  使用深度缓存计算物体的世界坐标的技术是非常有用的。我们可以使用这项技术实现深度域的效果,正如Gilham 2006中所描述,还有场景雾也可以使用深度缓存作为后期处理来实现。

7.总结

  在这章中,我们讨论了一种使用深度缓存中的深度值来计算物体的世界坐标的方法,并且介绍了那些信息如何用于在一个游戏引擎中实现运动模糊的效果。将运动模糊作为后期处理实现的技术可以很简单地集成到一个已有的渲染引擎中,并能够提供比传统的多轮解决方法更好的性能。

8.参考文档

[1]Gilham, David. 2006. "Real-Time Depth-of-Field Implemented with a Post-Processing Only Technique." In Shader X5, edited by Wolfgang Engel, pp. 163–175. Charles River Media.

[2]Microsoft Corporation. 2006. "DirectX 9.0 Programmer's Reference."

转载于:https://www.cnblogs.com/wangshaohao/archive/2012/11/14/2769663.html

使用后期处理效果实现运动模糊相关推荐

  1. UnityShader入门精要-屏幕后处理效果 亮度饱和度对比度、边缘检测、高斯模糊、bloom效果、运动模糊

    (从这里开始可能会记录的更简略一些,时间紧张想迅速读完这本书的主要内容,可能有的部分不会自己上手做) 屏幕后处理通常指渲染完整个场景得到屏幕图像后,再对图像进行操作,抓取屏幕可以使用OnRenderI ...

  2. ae运动模糊怎么调整_ae运动模糊怎么用?为什么我打开开关后没什么效果,看不出来。有没有什么视屏可以看看?...

    展开全部 1.点击运动模糊,会看到参数设置,如下图: 2.先来看看运动模糊,打32313133353236313431303231363533e4b893e5b19e31333431363031开有三 ...

  3. URP——后期处理特效——运动模糊Motion Blur

    Motion Blur 运动模糊效果模拟了真实相机拍摄物体运动速度快于曝光时间时图像中出现的模糊.这通常是由于物体快速移动,或曝光时间过长所致. 通用渲染管道(URP)只模糊摄像机的运动. Using ...

  4. Motion Blur 运动模糊 后期处理系列6

    Motion Blur 运动模糊 本文档主要是对Unity官方手册的个人理解与总结(其实以翻译记录为主:>) 仅作为个人学习使用,不得作为商业用途,欢迎转载,并请注明出处. 文章中涉及到的操作都 ...

  5. 如何消除摄影中的运动模糊?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|计算机视觉life 如果你试过去拍摄一些运动场景,例如拍 ...

  6. matlab 维纳滤波恢复运动模糊,运动模糊恢复专题

    相关背景知识 1.运动模糊的定义 wiki百科上的定义是:运动模糊或运动模糊(motion blur)是静态场景或一系列的图片像电影或是动画中一样快速移动,使物体产生明显运动痕迹. [图片上传失败.. ...

  7. 【youcans 的 OpenCV 例程 200 篇】104. 运动模糊退化模型

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程 2 ...

  8. ae运动模糊怎么调整_如何快速成长为一名AE高手?

    Adobe After Effects是一种数字视觉效果.动态图形和合成应用程序,用于电影制作.视频游戏和电视制作的后期制作过程.最常见的操作便是AE用于抠像,跟踪,合成和动画. 图片来自:apple ...

  9. 两个一样的图像相除会怎么样_【壮凌自动化分析】一种动力电池生产中基于图像运动模糊的速度检测方法...

    一种动力电池生产中基于图像运动模糊的速度检测方法 1.西南大学 电子信息工程学院,重庆 400715) 2.非线性电路与智能信息处理重庆市重点实验室,重庆 400715) 1.当前背景与成熟方法介绍 ...

最新文章

  1. P1155 双栈排序(二分图的染色判断+链式前向星)
  2. OpenCV中的CV_IMPL是什么意思?
  3. Python vaptcha手势人机验证码识别
  4. 5种Python逐行读取文件的方式
  5. Logback日志系统配置攻略
  6. mysql 更改 uf_SQL经典实例(四)插入、更新和删除
  7. 2019知道c语言答案,2019年全国计算机二级C语言练习及答案四
  8. LABEL MATRIX里用计数器自动生成流水号和自定义条码格式
  9. Python 文件的读写操作
  10. PS2022 安装教程
  11. 设备管理---要点练习及总结
  12. 上海计算机学业水平考试,上海信息科技学业水平考试复习资料整理——计算机系统.pdf...
  13. kettle An error occurred, processing will be stopped: 错误 解决方法
  14. 采购预制发票MIR7 发票校验屏幕格式调整
  15. 响应服务器554 5.7.1,554 5.7.1:中继访问被拒绝的centos后缀
  16. 来点热闹的生活吧!!!O(∩_∩)O哈哈~
  17. [树莓派]基于Python开发树莓派软件流程
  18. 百度员工猝死 是否过劳死引发争论
  19. SQL下三种执行CMD命令的方法
  20. 【人脸识别】解析MS-Celeb-1M人脸数据集及FaceImageCroppedWithAlignment.tsv文件提取

热门文章

  1. 中职计算机教师个人自我诊改报告,教师自我诊改报告
  2. 送你了,思科设备基础配置命令大全(一),赶紧收藏......
  3. AHPA:开启 Kubernetes 弹性预测之门
  4. 和 VMware、深信服、天翼云、招商云专家一起聊聊云原生边缘计算
  5. SpringCloud 应用在 Kubernetes 上的最佳实践 — 高可用(熔断)
  6. ubuntu版php开发工具,Ubuntu 中搭建 LAMP 及 php 开发工具
  7. linux 7za下载,Linux安装7za
  8. java每秒限流_java限流工具类
  9. python2.7安装tensorflowgpu_Ubuntu16.04+Python2.7+CUDA9.0+cuDNN7.0+TensorFlow 1.6 安装随笔
  10. 原平 计算机培训,原平编程培训,原平编程培训班,原平编程培训完找什么工作 - IT教育频道...