Unity Shader入门精要之 screen post-processing effect

时间:2021-01-30 18:26:11

本篇记录了学习Unity Shader入门精要的屏幕后处理的一些知识点。

OnRenderImage(RenderTexture src, RenderTexture dest)

以上函数是Unity提供的接口,当前渲染得到的图像存储在 src 中,在函数中通过一些操作后将处理后里的图像存储在 dest 中显示到屏幕中。

Graphics.Blit(Texture source, RenderTexture dest, Material mat, int pass)

该函数 source 传给 mat 使用的Shader中名为 _MainTex 的属性, mat 使用的 shader 会对屏幕做各种处理,然后传给 dest, pass 默认为 -1 ,若为 - 1 会依次调用shader中的所有Pass,否则只会调用指定的Pass。

判断当前设备是否支持屏幕特效:

 UnityEngine.SystemInfo.supportsImageEffects

判断当前设备是否支持某种格式的渲染纹理:

 UnityEngine.SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGB32)

使用一个Shader之前需要判断当前设备的显卡是否支持该Shader,判断方式:

shader.isSupported 

1、调整屏幕的亮度(Brightness)、饱和度(Saturation)、对比度(Contrast)

调整亮度 即 将原颜色rgb分量的乘以亮度系数(0-1)

调整饱和度 即 在饱和度为0的颜色值与原颜色之间插值(0-1)

调整对比度 即 在对比度为0的颜色值与原颜色之间插值(0-1)

以下是本人对案例一些片元着色器代码的个人理解,纯属学习之用

 fixed4 frag(v2f i) : SV_Target
{
fixed4 renderTex = tex2D(_MainTex, i.uv); //获取对原屏幕图像的采样结果 // Apply brightness
//调整亮度 即 将原颜色乘以亮度系数(0-1)即可
fixed3 finalColor = renderTex.rgb * _Brightness; // Apply saturation
//亮度值 即 每个颜色分量乘以对应的特定的亮度系数再相加,注意亮度值是一个特定的概念0
//r- 0.2125 g-0.7154 b- 0.0721
fixed luminance = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.0721 * renderTex.b;
//创建饱和度为0的颜色值,即rgb三个颜色分量值都为亮度值
fixed3 luminanceColor = fixed3(luminance, luminance, luminance);
//在饱和度为0的颜色值与实际的颜色之间插值(0-1),即可得到希望的饱和度颜色
finalColor = lerp(luminanceColor, finalColor, _Saturation); // Apply contrast
//创建对比度为0的颜色值,即rgb三个颜色分量的值相等
fixed3 avgColor = fixed3(0.5, 0.5, 0.5);
//在对比度为0的颜色值与实际的颜色之间插值(0-1),即可得到希望的对比度颜色
finalColor = lerp(avgColor, finalColor, _Contrast); return fixed4(finalColor, renderTex.a);
}