简介
屏幕后处理(Post-Processing)是从渲染完成后再进行特定的处理技术,以改变游戏画面的颜色、饱和度、对比度、景深和运动模糊等等。这些特效可以增强游戏场景的观感,利用具有高分辨率和带宽等优势的纹理贴图,能够进一步增强特效的真实感。本次项目中,将使用Unity Shader,ASE与Cg语言进行屏幕后处理,项目包括简单图像处理(亮度、色相、饱和度、对比度、晕影效果);模糊处理(均值模糊、高斯模糊、双向模糊、Kawase模糊等);Bloom效果和ToneMapping算法。大概会分为三个小节进行更新。
-
后处理在渲染管线流程
在渲染管线中,后处理通常位于渲染过程的末尾,即在所有的渲染通道(例如顶点着色器、片段着色器等)完成之后执行后处理操作。后处理操作是在已经渲染的图像上进行的,它不会影响到场景的几何形状或光照等因素。
一般来说,后处理操作会在渲染目标纹理(例如帧缓存或渲染纹理)上进行。在每一帧的渲染完成后,后处理操作会将渲染目标纹理作为输入,并应用各种效果和滤镜来修改图像的外观。
简单图像处理
简单图像处理实现了一些简单的修图功能,包括亮度处理、色相调整、饱和度与对比度调整和晕影效果的实现。
亮度处理
亮度处理就是通过调整图像中像素的亮度值来改变图像的整体亮度,以下使用线性的亮度调整,通过对每个像素乘上一个亮度值常熟来增加或减少亮度。
定义属性_Brightness用于控制亮度变换,在fragment shader中进行计算
//获取图像颜色值
half4 col = tex2D(_MainTex, i.uv);
//亮度处理
half3 final_color = col.rgb * _Brightness;
创建C#脚本控制后处理Shader
OnRenderImage() 是Unity 中用于在渲染每一帧图像之前或之后执行自定义后处理操作的函数。它是 MonoBehaviour 类的一个方法,可以在脚本中实现。通过OnRenderImage(),控制每一帧渲染图像之后需要执行的执行自定义的后处理效果。
创建C#脚本EasyImageEffect.cs,传入对应的Material材质用于控制各种后处理的效果。编写OnRenderImage()函数。
注意:只能搭载在Main Camera上才能正确执行OnRenderImage()方法。
[ExecuteInEditMode()]
public class EasyImageEffect : MonoBehaviour
{
public Material material;
public float Brightness = 1;
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
material.SetFloat("_Brightness", Brightness);
Graphics.Blit(source, destination, material);
}
// Start is called before the first frame update
void Start()
{
if(material == null || SystemInfo.supportsImageEffects == false
|| material.shader ==null || material.shader.isSupported == false)
{
enabled = false;
return;
}
}
}
声明一个公共材质变量 material,用于指定要应用效果的材质。还声明了一个公共浮点数变量 Brightness,用于控制图像的亮度。
在OnRenderImage()中设置材质的 _Brightness 属性,然后,使用 Graphics.Blit 函数将源纹理 source 绘制到目标纹理 destination 上,并应用材质。
在Start()方法中检查材质是否有效(不为空且支持图像效果),以及材质的 Shader 是否有效(不为空且支持)。如果不满足条件,则禁用脚本。使用[ExecuteInEditMode()]规定Unity在编辑