屏幕後期處理-調整屏幕亮度、飽和度、對比度
1、場景創建
1.1 hierarchy視圖包含:一個main camera、一個directional light、一個sprite(一個texture type爲Sprite(2D and UI))
1.2 project 視圖中新建:
一個C#腳本命名爲PostEffectsBase,用於建立基本的屏幕後期處理系統。代碼如下:
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
[RequireComponent (typeof(Camera))]
public class PostEffectsBase : MonoBehaviour {
// Use this for initialization
void Start () {
CheckResources ();
}
//檢查資源是否符合標準
protected void CheckResources()
{
bool isSupported = CheckSupport();
if (isSupported == false)
NotSupported ();
}
protected bool CheckSupport()
{
if (SystemInfo.supportsImageEffects == false || SystemInfo.supportsRenderTextures == false) {
Debug.LogWarning("This platform does not support image effects or render textures");
return false;
}
return true;
}
protected void NotSupported()
{
enabled = false;
}
//指定一個shader來創建一個用於處理渲染紋理的材質
protected Material CheckShaderAndCreateMaterial(Shader shader , Material material)
{
if (shader == null) {
return null;
}
if (shader.isSupported && material && material.shader == shader) {
return material;
}
if (!shader.isSupported) {
return null;
} else {
material = new Material(shader);
material.hideFlags = HideFlags.DontSave;
if(material)
{
return material;
}
else
return null;
}
}
}
再創建一個C#腳本命名爲BrightnessSaturationAndContrast,繼承上面的基類,提供調整亮度、飽和度、對比度的參數。將此腳本t添加到main camera上。
using UnityEngine;
using System.Collections;
public class BrightnessSaturationAndContrast : PostEffectsBase {
public Shader briSatConShader;
public Material briSatConMaterial;
public Material material{
get {
//調用基類中的方法可創建與shader對應的材質球
briSatConMaterial = CheckShaderAndCreateMaterial(briSatConShader,briSatConMaterial);
return briSatConMaterial;
}
}
[Range(0,3.0f)]
public float brightness =1.0f;
[Range(0,3.0f)]
public float saturation =1.0f;
[Range(0,3.0f)]
public float contrast =1.0f;
//定義OnRenderImage函數來進行特效處理,當前渲染的圖像存儲在第一個參數對應的源紋理中,
//通過函數中的一系列操作後第二個參數的紋理顯示到屏幕上。
void OnRenderImage(RenderTexture src,RenderTexture dest)
{
if (material != null) {
material.SetFloat ("_Brightness", brightness);
material.SetFloat ("_Saturation", saturation);
material.SetFloat ("_Contrast", contrast);
//Graphics.Blit使用特定的unity shader來對當前圖像進行處理,再把返回的渲染紋理顯示到屏幕
Graphics.Blit (src, dest, material); //參數src傳遞給shader中名爲_Maintex的紋理屬性
} else
Graphics.Blit (src, dest); //圖像直接顯示到屏幕上不做任何處理
}
}
創建一個shader命名爲BriSatAndCon,一個材質球命名爲Render。將Render的shader爲BriSatAndCon。
Shader "LT/BriSatAndCon" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_Brightness ("Brightness", Float) = 1 // 亮度係數 值由C#腳本傳遞
_Saturation ("Saturation", Float) = 1 // 飽和度係數 值由C#腳本傳遞
_Contrast ("Contrast", Float) = 1 // 對比度係數 值由C#腳本傳遞
}
SubShader {
Tags { "RenderType"="Opaque" }
pass{
ZTest Always
Cull off
Zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float _Brightness;
float _Saturation;
float _Contrast;
struct v2f {
half2 uv : TEXCOORD0;
float4 pos : POSITION;
};
v2f vert (appdata_img v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = v.vertex;
return o;
}
fixed4 frag(v2f i): SV_Target
{
fixed4 renderTex = tex2D(_MainTex,i.uv);
//apply brightnees亮度=原顏色*亮度係數
fixed3 finalColor = renderTex.rgb * _Brightness;
//apply saturation飽和度 ,計算該像素對應的亮度值:對每一個顏色分量*待定係數相加。
fixed luminance = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.721 * renderTex.b;
//創建一個飽和度爲0的顏色值
fixed3 luminaceColor = luminance;
finalColor = lerp(luminaceColor,finalColor,_Saturation);
//apply Contrast對比度
fixed3 avgColor = fixed3(0.5,0.5,0.5); //創建一個對比度爲0的顏色
finalColor = lerp(avgColor,finalColor,_Contrast);
return fixed4(finalColor,renderTex.a);
}
ENDCG
}
}
FallBack off
}
將此shader手動拖拽到main camera上BrightnessSaturationAndContrast中的briSatConShader。調節其他參數在game視圖中查看效果。