
想要实现屏幕后处理的基础在于得到选然后的屏幕图像,即抓取屏幕,Unity为我们提供了一个方便的接口 OnRenderImage 函数; 函数声明如下
Monobehavior.OnRenderImage(RenderTexture src, RenderTexture dest);
// 在 OnRenderImage 函数中,我们通常是利用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);
// 参数pass默认值为-1,表示将会依次调用Shader内的所有Pass.否则,只会调用给定索引的Pass
// 默认情况下,OnRenderImage函数会在所有不透明和透明的Pass执行完毕后被调用,以便对场景中的所有游戏对象都产生影响
// 如果想在不透明Pass执行完毕后立即调用OnRenderImage,我们可以在OnRenderImage函数前添加ImageEffectOpaque属性来实现这样的需求fixed3 finalColor = renderTex.rgb * _Brightness;fixed luminance = 0.2125 * color.r + 0.7154 * color.g + 0.0721 * color.b;
fixed3 luminanceColor = fixed3(luminance, luminance, luminance);
finalColor = lerp(luminanceColor, finalColor, _Saturation);fixed3 avgColor = fixed3(0.5, 0.5, 0.5);
finalColor = lerp(avgColor, finalColor, _Contrast);边缘检测是描边效果的一种实现方法,原理是利用一些边缘检测算子对图像进行卷积操作(convolution)
在图像处理中,卷积操作指的就是使用一个卷积核(kernel)对一张图像中的每个像素进行一系列的操作。卷积核通常是一个四方形网格结构,该区域的每个方格都有一个权重值。当对图像中的某个像素进行卷积时,我们会把卷积核的中心放置于该像素上,翻转核之后再依次计算核中每个元素和其覆盖的图像像素值的成绩并求和,得到的结果就是该位置的新像素值

模糊的实现有很多方法,例如均值模糊、中值模糊

Bloom实现原理非常简单,我们首先更具一个阈值提取图像中的较亮区域,把他们存储在一张渲染纹理中,再利用高斯模糊对这张渲染纹理进行牧户处理,模拟光线扩散效果,最后再将其和原图像进行混合,得到最终效果
运动模糊是真实世界中的摄像机的一种效果。如果在摄像机曝光时,拍摄场景发生了变化,就会产生模糊的画面