一、使用屏幕后处理效果 进行更改 亮度、饱和度、对比度
声明一个摄像机上的脚本BrightnessSaturationAndContrast,继承上一节的基类用来调用相关函数。
思想大概就是:
先创建一个函数,用来继承基类,那么我们就可以使用相关函数进行材质创建,调用函数。
然后我们创建一个Shader赋值给上面脚本(脚本内使用Shader创建材质),用来进行特效处理。
脚本代码:
using UnityEngine;
using System.Collections;
public class BrightnessSaturationAndContrast : PostEffectsBase {
public Shader briSatConShader;
private Material briSatConMaterial;
public Material material { //声明shader并根据shader创建材质
get {
briSatConMaterial = CheckShaderAndCreateMaterial(briSatConShader, briSatConMaterial);
return briSatConMaterial;
}
}
[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 (material != null) { //这里会检查材质是否可用,
material.SetFloat("_Brightness", brightness); //可用的话设置材质相应参数
material.SetFloat("_Saturation", saturation);
material.SetFloat("_Contrast", contrast);
Graphics.Blit(src, dest, material); //使用Blit函数传递材质的Shader进行处理src,在传递出给dest
} else {
Graphics.Blit(src, dest); //如果材质不可用,直接不进行处理。
}
}
}
Shader:
Shader "Unity Shaders Book/Chapter 12/Brightness Saturation And Contrast" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {} //之前说的Blit函数src参数会传递给_MainTex,我们使用这个来接收src。
//实际上我们不需要创建下面这三个属性,因为我们是通过摄像机上的脚本进行设置这三个参数的,摄像机中可以直接改变
//并且我们的材质是临时创建的,并没用需要在材质面板上去调节这三个参数
_Brightness ("Brightness", Float) = 1 //亮度、、饱和度、对比度、
_Saturation("Saturation", Float) = 1
_Contrast("Contrast", Float) = 1
}
SubShader {
Pass {
ZTest Always Cull Off ZWrite Off //屏幕后处理通常都要设置,“标配”:关闭深度写入
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
half _Brightness;
half _Saturation;
half _Contrast;
struct v2f {
float4 pos : SV_POSITION;
half2 uv: TEXCOORD0;
};
v2f vert(appdata_img v) { //直接使用appdata_img结构体,它包含了顶点坐标纹理坐标等分量,是UnityCG.cginc中的。
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
return o;
}
fixed4 frag(v2f i) : SV_Target {
fixed4 renderTex = tex2D(_MainTex, i.uv);
// Apply brightness
fixed3 finalColor = renderTex.rgb * _Brightness; //对采样得出的像素颜色添加亮度
// Apply saturation
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); //使用_Saturation插值luminanceColor和finalColor,用来调整饱和度。
// Apply contrast
fixed3 avgColor = fixed3(0.5, 0.5, 0.5); //创建对比度为0的颜色值。各分量都是0.5。
finalColor = lerp(avgColor, finalColor, _Contrast); //使用_Contrast进行插值,得到调整对比度后的颜色值。
return fixed4(finalColor, renderTex.a); //返回最终结果。
}
ENDCG
}
}
Fallback Off
}