using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace rkt.Assets.TestFob.Scripts
{
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
class PostEffectBase:MonoBehaviour
{
protected void CheckResources()
{
bool isSupported = CheckSupport();
if(isSupported == false)
{
NotSupported();
}
}
/// <summary>
/// 检查是否支持后处理
/// </summary>
/// <returns></returns>
protected bool CheckSupport()
{
if (SystemInfo.supportsImageEffects == false)
{
Debug.LogWarning("This platform does not support image effect or render textures");
return false;
}
return true;
}
/// <summary>
/// 如果不支持取消激活
/// </summary>
protected void NotSupported()
{
this.enabled = false;
}
/// <summary>
/// 检查是否支持后处理
/// </summary>
protected void Start()
{
CheckResources();
}
/// <summary>
/// 检查和创建材质
/// </summary>
/// <param name="shader"></param>
/// <param name="mat"></param>
/// <returns></returns>
protected Material CheckShaderAndCreateMaterial(Shader shader,Material mat)
{
if(shader == null)
return null;
if (shader.isSupported && mat && mat.shader == shader)
return mat;
else
{
mat = new Material(shader);
mat.hideFlags = HideFlags.DontSave;
if (mat)
return mat;
else
return null;
}
}
}
}
调整屏幕亮度、饱和度和对比度
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace rkt.Assets.TestFob.Scripts
{
class BrigtnessSaturationAndContrast:PostEffectBase
{
public Shader briSatConShader;
private Material 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;
public Material material
{
get
{
briSatConMaterial = CheckShaderAndCreateMaterial(briSatConShader,briSatConMaterial);
return briSatConMaterial;
}
}
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (material != null)
{
material.SetFloat("_Brightness", brightness);
material.SetFloat("_Saturation", saturation);
material.SetFloat("_Contrast", contrast);
Graphics.Blit(source, destination, material);
}
else
Graphics.Blit(source, destination);
}
}
}
Shader "Unlit/BrightnessSaturationAndContrast"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Brightness ("Brightness",Float) = 1
_Saturation ("Saturation",Float) = 1
_Contrast ("Contrast",Float) = 1
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
//关闭深度写入是为了防止它挡住在后面被渲染的物体
ZTest Always Cull Off ZWrite Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
half _Brightness;
half _Saturation;
half _Contrast;
fixed4 _Color;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
fixed3 finalColor = col.rgb * _Brightness; //颜色相乘调明亮度
fixed luminanceColor = 0.299 * col.r + 0.587 * col.g + 0.114 * col.b; //灰色值
finalColor = lerp(luminanceColor,finalColor,_Saturation); //饱和度
fixed3 avgColor = fixed3(0.5,0.5,0.5);
finalColor = lerp(avgColor,finalColor,_Contrast); //对比度
return fixed4(finalColor,col.a);
}
ENDCG
}
}
}