Shader 灰频效果

发表于2018-02-09
评论0 648浏览
灰频效果在游戏中出现也比较多,对于此种效果,是怎么用shader实现的呢?下面就给大家介绍下实现灰频效果的shader代码。

效果图: 

Shader代码:
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);
        }
    }
}
将此代码拖拽到摄像机上,启用或者禁用此脚本即可看到效果

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: