Unity屏幕后处理 - GameKong/restaurant GitHub Wiki

1.什么是屏幕后处理?

屏幕后处理指的是渲染完整个场景得到屏幕图像后,再对整个图像进行一系列操作,实现各种屏幕特效。使用这种技术可以为游戏画面添加更多效果,例如:调整屏幕亮度、饱和度、对比度,边缘检测、高斯模糊、运动模糊等。

2.在unity中如何实现屏幕后处理?

1.得到场景渲染后的屏幕图像,Unity抓取屏幕的接口OnRenderImage函数。

// unity抓取屏幕的接口,函数内部自定义处理过程,该接口所在脚本必须挂在camera上。
// src是抓取屏幕后的纹理存储的对象, dest经过处理后的纹理存储的对象(最终使用该纹理渲染到屏幕)
void OnRenderImage(RenderTexture src, RenderTexture dest)

2.将得到的渲染纹理通过函数中一系列操作后,绘制到目标渲染纹理,最终绘制到屏幕上。在OnRenderImage函数中,通常利用Garphics.Blit函数来完成对渲染纹理的处理。

// source是源纹理
// dest目标纹理
// mat处理纹理所用的材质,若为空则处理完纹理后不储存在目标纹理中,而是直接渲染到屏幕
// pass处理纹理所用的pass(-1代表以此使用所有pass进行处理,否则为对应的pass序号)
public static void Blit(Texture source, RenderTexture dest);
public static void Blit(Texture source, RenderTexture dest, Material mat, int pass = -1);
public static void Blit(Texture source, Material mat, int pass = -1);

// 用法
void OnRenderImage(RenderTexture src, RenderTexture dest)
{
    // Read pixels from the source RenderTexture, apply the material, copy the updated results to the destination RenderTexture
    Graphics.Blit(src, dest, mat);
}

3.调整屏幕纹理的亮度、饱和度、对比度

  • 亮度:图像的明暗程度。从rgb值简单理解就是rgb值越大亮度越高。
  • 饱和度:图片颜色的饱满程度。图片饱和度的调整方式:调整像素突出的颜色值,让红的更红,绿的更绿。简单的说这就是提高图片的饱和度,反之降低饱和度。 (偏离同等亮度的灰色的程度)
  • 对比度:图像明暗的差异。图片对比度的调整方式:就是让图片中暗的部分越暗,而将图片中亮的部分越亮,就是提高对比度,反之降低对比度。 (偏离中间亮度的灰色的程度)

4.边缘检测

  1. 卷积核通常就是一个四边形网格区域,区域内每个方格的数字代表一个权重值,在对某个像素进行卷积时,将该像素放在四边形中心区域,然后依次计算卷积核中每个权重值和它覆盖的像素值的乘积并求和,最终得到一个结果值。不同的卷积核和算法能实现不同的效果。

2.边缘检测卷积核,两个方向的卷积核分别用于检测x方向和y方向上的边缘信息,使用边缘检测卷积核分别计算每个像素两个方向的梯度值Gx, Gy。 整体梯度值越大,越有可能是边缘点。

                                    整体的梯度值公式:G = √(Gx² + Gy²)
                          开根号计算量大,使用近似的梯度值公式:G = |Gx| + |Gy|

5.高斯模糊

高斯模糊权重值计算公式: σ是标准方差,一般取值为1。 x,y是距离卷积核中心的横纵偏移量,根据该公式可以计算出高斯模糊卷积核。一个NxN的高斯核对一个WxH大小的图像进行卷积计算,需要进行NxNxWxH次,随着N不断增加采样次数会变得很大,可将N维卷积核抽象为2个大小为N的一维卷积核进行高斯模糊,也能获得近似的效果。

6.Bloom光线扩散效果

实现步骤:

  1. 根据一个阈值提取出图像较亮的部分,把它存储在一张渲染纹理中。
  2. 再将这张亮度的渲染纹理进行高斯模糊处理,模拟光线扩散效果。
  3. 最后将原图像和高斯模糊后的亮度图像颜色值相加,得到最终效果。