Unity Shader学习笔记(19)屏幕后处理效果、调整亮度、饱和度、对比度

您所在的位置:网站首页 unity调整场景的亮度 Unity Shader学习笔记(19)屏幕后处理效果、调整亮度、饱和度、对比度

Unity Shader学习笔记(19)屏幕后处理效果、调整亮度、饱和度、对比度

2023-09-22 21:09| 来源: 网络整理| 查看: 265

纹理动画部分介绍完了,下面要介绍的是Unity的屏幕后期处理效果,使用MonoBehaviour.OnRenderImage来实现,以及调整屏幕的亮度、饱和度、对比度的方法,想知道的可以看看,会对大家学习屏幕后处理有很大的帮助。屏幕后处理效果(screen post-processing effects)

即在渲染完场景得到屏幕图像后在进行处理的效果,如景深、运动模糊等。

Unity提供接口方便处理渲染后的图像:OnRenderImage。第一个参数渲染得到纹理,第二个参数是输出到屏幕的纹理。 MonoBehaviour.OnRenderImage (RenderTexture src, RenderTexture dest)

在上面函数内,通常使用Graphics.Blit函数处理渲染纹理。  - source:当前屏幕的渲染纹理或上一步处理完的渲染纹理。 - dest:目标渲染纹理,为null时就直接把结果显示在屏幕上。 - mat:使用的材质,材质的shader会进行屏幕后处理,source会传入这个shader名为_MainTex的纹理。 - pass:默认-1,即顺序调用Shader内所有Pass。否则只会调用给定索引的Pass。 - sacle:源纹理的缩放。 - offset:源纹理的偏移量。

实现屏幕后处理效果的基类 PostEffectsBase using UnityEngine; /// /// 屏幕后处理效果基类 /// [ExecuteInEditMode] [RequireComponent(typeof(Camera))] public class PostEffectsBase : MonoBehaviour { private Camera mainCamera; public Camera MainCamera { get { return mainCamera = mainCamera == null ? GetComponent() : mainCamera; } } public Shader targetShader; private Material targetMaterial = null; public Material TargetMaterial { get { return CheckShaderAndCreateMaterial(targetShader, targetMaterial); } } /// /// 检测资源,如果不支持,关闭脚本活动 /// protected void Start() { if (CheckSupport() == false) enabled = false; } /// /// 检测平台是否支持图片渲染 /// /// protected bool CheckSupport() { if (SystemInfo.supportsImageEffects == false) { Debug.LogWarning("This platform does not support image effects or render textures."); return false; } return true; } /// /// 检测需要渲染的Shader可用性,然后返回使用了该shader的material /// /// 指定shader /// 创建的材质 /// 得到指定shader的材质 protected Material CheckShaderAndCreateMaterial(Shader shader, ref Material material) { if (shader == null || !shader.isSupported) return null; if (material && material.shader == shader) return material; material = new Material(shader); material.hideFlags = HideFlags.DontSave; return material; } } 调整亮度(Brightness)、饱和度(Saturation)、对比度(Contrast)

调整后图像与原图对比: 

通过mono脚本处理屏幕后效果:

public class BrightnessSaturationAndContrast : PostEffectsBase { [Range(0.0f, 3.0f)] public float brightness = 1.0f; [Range(0.0f, 3.0f)] public float saturation = 1.0f; [Range(0.0f, 3.0f)] public float contrast = 1.0f; void OnRenderImage(RenderTexture src, RenderTexture dest) { if (TargetMaterial != null) { TargetMaterial.SetFloat("_Brightness", brightness); TargetMaterial.SetFloat("_Saturation", saturation); TargetMaterial.SetFloat("_Contrast", contrast); } Graphics.Blit(src, dest, TargetMaterial); } }

材质的shader:

Pass { // 关掉深度写入,避免挡住后面物体渲染,(如果OnRenderImage在所有不透明Pass后直接执行(而非所有都渲染完)) ZTest Always Cull Off ZWrite Off ... fixed4 frag(v2f i) : SV_Target { fixed4 renderTex = tex2D(_MainTex, i.uv); // 亮度 fixed3 finalColor = renderTex.rgb * _Brightness; // 饱和度 fixed luminance = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.0721 * renderTex.b; fixed3 luminanceColor = fixed3(luminance, luminance, luminance); // 饱和度为0的颜色值 finalColor = lerp(luminanceColor, finalColor, _Saturation); // 对比度 fixed3 avgColor = fixed3(0.5, 0.5, 0.5); // 对比度为0的颜色值 finalColor = lerp(avgColor, finalColor, _Contrast); return fixed4(finalColor, renderTex.a); } } Unity Shader学习笔记系列教程:Unity Shader学习笔记(一)DrawCallUnity Shader学习笔记(2)Shader、ShaderLab、Cg/HLSL/GLSLUnity Shader学习笔记(3)Unity Shader模板、结构、形式Unity Shader学习笔记(4)Unity Shader内置变量、函数、ShaderModelUnity Shader学习笔记(5)第一个简单ShaderUnity Shader学习笔记(6) 漫反射Unity Shader学习笔记(7)高光反射Unity Shader学习笔记(8)纹理映射、凹凸映射Unity Shader学习笔记(9)渐变纹理、遮罩纹理Unity Shader学习笔记(10)纹理(Texture)的属性Unity Shader学习笔记(11)渲染队列、透明效果Unity Shader学习笔记(12)渲染路径(Rendering Path)Unity Shader学习笔记(13)混合光源、光的衰减Unity Shader学习笔记(14)阴影Unity Shader学习笔记(15)立方体纹理、反射、折射、菲涅尔反射Unity Shader学习笔记(16)渲染纹理(Render Texture)Unity Shader学习笔记(17)程序纹理(Procedural Texture)、程序材质Unity Shader学习笔记(18)纹理动画、顶点动画、广告牌技术Unity Shader学习笔记(20)卷积、卷积核、边缘检测算子、边缘检测Unity Shader学习笔记(21)模糊、高斯模糊Unity Shader学习笔记(22)Bloom效果Unity Shader学习笔记(23)运动模糊Unity Shader学习笔记(24)深度纹理、法线纹理Unity Shader学习笔记(25)全局雾效Unity Shader学习笔记(26)边缘检测(深度和法线纹理)Unity Shader学习笔记(27)渲染轮廓线(描边)方法、卡通风格渲染、素描风格渲染Unity Shader学习笔记(28)噪声纹理、消融效果、水波效果、噪声雾效Unity Shader学习笔记(29)表面着色器(Surface Shader)Unity Shader学习笔记(30)Unity中渲染优化技术Unity Shader学习笔记(31)基于物理的渲染技术(PBS)、BRDFUnity Shader学习笔记(32)Unity中的Standard ShaderUnity Shader学习笔记(33)全局光照(GI)、反射探针、线性空间和伽马空间、HDR


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3