效果图:
Shader代码:
Shader "Custom/HuiPin" {
Properties{
_MainTex("Main Tex",2D)="white"{}
_LuminosityAmout("GrayScale Amout",Range(0,1))=1.0
}
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
//#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
sampler2D _MainTex;
fixed _LuminosityAmout;
fixed4 frag(v2f_img i):COLOR{
fixed4 renderTex = tex2D(_MainTex,i.uv);
float luminosity = 0.299 * renderTex.r + 0.587 * renderTex.g + 0.114*renderTex.b;
fixed4 finalColor = lerp(renderTex,luminosity,_LuminosityAmout);
return finalColor;
}
ENDCG
}
}
FallBack "DIFFUSE"
}
c#代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class TestRenderImage : MonoBehaviour {
public Shader curShader;
public float grayScaleAmount = 1.0f;
private Material curMaterial;
Material material
{
get
{
if (curMaterial == null)
{
curMaterial = new Material(curShader);
curMaterial.hideFlags = HideFlags.HideAndDontSave;
}
return curMaterial;
}
}
void Start()
{
if (!SystemInfo.supportsImageEffects)
{
enabled = false;
return;
}
if (!curShader && !curShader.isSupported)
{
enabled = false;
}
}
void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
{
if (curShader != null)
{
material.SetFloat("_LumionsityAmount", grayScaleAmount);
Graphics.Blit(sourceTexture, destTexture, material);
}
else
{
Graphics.Blit(sourceTexture, destTexture);
}
}
void Update()
{
grayScaleAmount = Mathf.Clamp(grayScaleAmount, 0, 1.0f);
}
void OnDisable()
{
if (curMaterial)
{
DestroyImmediate(curMaterial);
}
}
}
将此代码拖拽到摄像机上,启用或者禁用此脚本即可看到效果