Unity Shader屏幕后处理效果

屏幕后处理效果(screen post-processing effects)是游戏中实现屏幕特效的常见方法。通常是指在渲染整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效。使用这种技术可以为游戏画面添加更多的艺术效果,例如景深(Depth of Firld)、动态模糊(Motion Blur)等。Unity为我们提供了这样一个方便的接口-OnRenderImage函数:

MonoBehaviour.OnRenderImage(RenderTexture src,RenderTexture dest)

当我们在脚本中声明此函数后,Unity会把当前渲染得到的图像存储在第一个参数对应的源渲染纹理中,通过函数中的一系列操作后,在把目标渲染纹理,即第二个参数对应的渲染纹理显示到屏幕上。我们通常是利用Graphics.Blit函数来完成对渲染纹理的处理。

public static void Blit(Texture src,RenderTexture dest);
public static void Blit(Texture src,RenderTexture dest,Material mat,int pass = -1);
public static void Blit(Texture src,Material mat,int pass = -1);

利用卷积(convolution)进行图像的边缘检测

卷积操作指的是使用一个卷积核(kernel)对一张图像中的每个像素进行一系列操作。卷积核通常是一个四方形网格结构,该区域内每个方格都有一个权重值。当对图像中的某个像素进行卷积时,我们会卷积核的中心放置于该像素上,翻转核之后再依次计算核中每个元素和其覆盖的图像像素值的乘积并求和,得到的结果就是该位置的新像素值。
在这里插入图片描述
在这里插入图片描述

高斯模糊

高斯模糊同样利用了卷积计算,它使用的卷积核名为高斯核。高斯核是一个正方形大小的滤波核,其中每个元素的计算都是基于下面的高斯方程:
在这里插入图片描述

Bloom效果

Bloom让画面中较亮的区域“扩散”到周围的区域中,造成一种朦胧的效果。
Bloom效果实现原理:首先根据一个阈值提取出图像中的较亮区域,把它们存储在一张渲染纹理中,再利用高斯模糊对这张渲染进行模糊处理,模拟光线扩散的效果,最后再将其和原图像进行混合,得到最终的效果。

运动模糊

在这里插入图片描述
运动模糊的实现由多种方法。一种实现方法是利用累积缓存(accumulation buffer)来混合多张连续的图像。当物体快速移动产生多张图像后,我们取它们之间的平均值作为最后的模糊图像。这种方法对性能的消耗很大,因为想要获取多张帧图像往往意味着我们需要在同一帧里渲染多次场景。另一种应用广泛的方法是创建和使用速度缓存(velocity buffer),这个缓存中存储了各个像素当前的运动速度,然后利用该值来决定模糊的方向和大小。

猜你喜欢

转载自blog.csdn.net/qq_39258338/article/details/85337008