这里需要使用 Unity 的 OnRenderImage
函数对渲染后的画面进行处理
其中还需要使用 Graphics.Blit(src, dest)
函数来对渲染纹理进行对应的shader处理
- 脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteAlways]
[RequireComponent(typeof(Camera))]
public class PostEffectBase : MonoBehaviour
{
protected Material CheckShaderAndCreateMaterial(Shader shader, Material material)
{
if (shader == null) return null;
if (shader.isSupported && material != null && material.shader == shader)
return material;
if (!shader.isSupported) return null;
material = new Material(shader) { hideFlags = HideFlags.DontSave };
return material;
}
}
using System;
using UnityEngine;
public class BrightnessSaturationAndContrast : PostEffectBase
{
public Shader briSatConShader;
private Material briSatConMaterial;
public Material material
{
get
{
briSatConMaterial = CheckShaderAndCreateMaterial(briSatConShader, briSatConMaterial);
return briSatConMaterial;
}
}
[Range(0f, 3f)]
public float brightness = 1.0f;
[Range(0f, 3f)]
public float saturation = 1.0f;
[Range(0f, 3f)]
public float contrast = 1.0f;
private 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);
}
else Graphics.Blit(src, dest);
}
}
- shader
Shader "Hidden/Brightness_Saturation_And_Contrast"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Brightness ("Brightess", Float) = 1.0
_Saturation ("Saturation", Float) = 1.0
_Contrast ("Contrast", Float) = 1.0
}
SubShader
{
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct a2f
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
half _Brightness;
half _Saturation;
half _Contrast;
v2f vert (a2f v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 renderTex = tex2D(_MainTex, i.uv);
fixed3 finalColor = renderTex.rgb * _Brightness;
fixed luminance = dot(unity_ColorSpaceLuminance, renderTex);
fixed3 luminanceColor = fixed3(luminance, luminance, luminance);
finalColor = lerp(luminance, finalColor, _Saturation);
finalColor = lerp(unity_ColorSpaceGrey.xyz, finalColor, _Contrast);
return fixed4(finalColor, renderTex.a);
}
ENDCG
}
}
}
参考 Unity Shader 入门精要这本书