首页 > 技术文章 > unity屏幕灰色显示

Yellow0-0River 原文

C#脚本如下:

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 (!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);
        }
    }
}

shader脚本如下:

Shader "Custom/ImageEffect" {
    Properties {
        _MainTex("Base (RGB)",2D) = "white"{}
        _LuminosityAmount("GrayScale Amount",Range(0,1)) = 1.0
    }
    SubShader{
        Pass{
            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"
}

 C#脚本拖到摄像机上面即可。

推荐阅读