示例:屏幕后期处理——灰度处理
GrayImageShader.Shader
Shader "Custom/GrayImageShader" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _LuminosityAmount ("GrayScale Amount", Range(0.0, 1)) = 1.0 } SubShader { Pass { //使用纯CG代码,而不是Unity内置的表面着色器语言。 //这能使我们屏幕特效更加优化。 CGPROGRAM #pragma vertex vert_img #pragma fragment frag #pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc" uniform sampler2D _MainTex; fixed _LuminosityAmount; 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, _LuminosityAmount); return finalColor; } ENDCG } } FallBack "Diffuse" }
TestRenderImage.cs
using UnityEngine; using System.Collections; [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(null != curShader && !curShader.isSupported) { enabled = false; } } //对屏幕后期处理 void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture) { if (curShader != null) { material.SetFloat("_LuminosityAmount", grayScaleAmount); Graphics.Blit (sourceTexture, destTexture, material); } else { Graphics.Blit (sourceTexture, destTexture); } } void Update () { grayScaleAmount = Mathf.Clamp (grayScaleAmount, 0.0f, 1.0f); } void OnDisable() { if (curMaterial) DestroyImmediate (curMaterial); } }
将TestRenderImage挂在主摄像机上
编辑器中效果截图
grayScaleAmount = 0
grayScaleAmount = 0.5
grayScaleAmount = 1