再谈运动模糊【Unity Shader入门精要13.2】

本文探讨了运动模糊的实现,特别是通过速度映射图来确定模糊的大小和方向。介绍了两种生成速度缓冲的方法,包括修改物体Shader代码和利用深度纹理计算世界空间位置。重点讲解了《GPU Gems3》中提到的方法,虽然性能上可能受影响,但能在一个屏幕后处理步骤完成。本教程适用于摄像机快速运动的场景,对于物体快速运动的情况,需要更精确的速度映射贴图。
摘要由CSDN通过智能技术生成

使用速度映射图:速度映射图中存储了每个像素的速度,然后使用这个速度决定模糊的大小和方向

速度缓冲的生成有多种方法:

一种方法是把场景中所有物体的速度渲染到一张纹理中,但这种方法的缺点在于需要修改场景中所有的物体的Shader代码,使其添加计算速度的代码并输出到一个渲染纹理中

《GPU Gems3》第27章中介绍了一种生成速度映射图的方法,这种方法利用深度纹理在片元着色器中为每个像素计算其在世界空间下的位置,这是通过使用当前的视角*投影矩阵的逆矩阵对NDC下的顶点坐标进行变换得到的,当得到世界空间下的顶点坐标后,使用前一帧的视角*投影矩阵对其进行变换,得到该位置在前一帧的NDC坐标,然后计算前一帧和当前的位置差,生成该像素的速度。这种方法的优点是可以在一个屏幕后处理步骤完成整个效果的模拟,但缺点是需要在片元着色器中进行矩阵纹理操作,对其性能有影响

本节实现的运动迷糊使用于场景静止,摄像机快速运动的情况

这是因为我们在计算时只考虑了摄像机的运动,因此,如果把代码应用到一个物体快速运动而摄像机静止的场景,就会发现不会产生任何运动模糊效果,

如果想要对快速移动的物体产生运动模糊的效果,就需要生成更加精确的速度映射贴图(可以在Unity自带的ImageEffect包中找到更多的运动模糊的实现方法)

 

//13.2 再谈运动模糊

Shader "Unlit/Chapter13-MotionBlurWithDepthTexture"
{
	Properties{
	_MainTex("Base (RGB)", 2D) = "white" {}
	_BlurSize("Blur Size", Float) = 1.0
	}
		SubShader{
		CGINCLUDE

#include "UnityCG.cginc"

	sampler2D _MainTex;//输入的渲染纹理,UNITY传递的
	half4 _MainTex_TexelSize;
	sampler2D _CameraDepthTexture;/
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值