UnityShader 全屏界面變灰

之前的面試的時候有被問到胆描,像4月4號清明節(jié)的時候诅妹,很多軟件的界面都變成灰色饼酿,想要實現(xiàn)這個有什么思路抖甘,當時由于緊張枉侧,沒有什么思路帽氓,后面想想盟猖,用屏幕后處理是可以實現(xiàn)的担巩,像很多游戲方援,主角死亡后,游戲畫面變灰涛癌,會不會也是這么實現(xiàn)的呢犯戏?話不多說,直接上代碼:
CS代碼:
首先我要準備渲染RenderTexture的材質(zhì)拳话,這里我們使用一個可以在屏幕后處理中使用的通用基類先匪。

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
[RequireComponent (typeof(Camera))]
public class PostEffectsBase : MonoBehaviour {
    protected void Start() {
        CheckResources();
    }
    
    protected void CheckResources() {
        bool isSupported = CheckSupport();
        
        if (isSupported == false) {
            NotSupported();
        }
    }

    // 檢測設(shè)備是否支持屏幕特效和渲染紋理
    protected bool CheckSupport() {
        if (SystemInfo.supportsImageEffects == false || SystemInfo.supportsRenderTextures == false) {
            Debug.LogWarning("This platform does not support image effects or render textures.");
            return false;
        }
        
        return true;
    }

    protected void NotSupported() {
        enabled = false;
    }

    // 創(chuàng)建新的材質(zhì)去渲染動態(tài)紋理
    protected Material CheckShaderAndCreateMaterial(Shader shader, Material material) {
        if (shader == null) {
            return null;
        }
        
        if (shader.isSupported && material && material.shader == shader)
            return material;
        
        if (!shader.isSupported) {
            return null;
        }
        else {
            material = new Material(shader);
            material.hideFlags = HideFlags.HideAndDontSave;
            if (material)
                return material;
            else 
                return null;
        }
    }
}

創(chuàng)建一個我們操作界面變灰的腳本,繼承自PostEffectsBase弃衍,同時將該腳本掛到攝像機上呀非。

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class SceneGray : PostEffectsBase
{
    //設(shè)置渲染的shader
    public Shader curShader;
    //灰度程度0~1,0為原來顏色镜盯,1為灰色
    public float grayScaleAmount = 1.0f;
    //新創(chuàng)建的材質(zhì)
    private Material curMaterial;

    Material material
    {
        get
        {
            if (curMaterial == null)
            {
                curMaterial = CheckShaderAndCreateMaterial(curShader,curMaterial);
            }
            return curMaterial;
        }
    }
    //屏幕后處理函數(shù)岸裙,設(shè)置shader參數(shù)
    void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
    {
        if (curShader != null)
        {
            material.SetFloat("_LuminosityAmount", grayScaleAmount);
            Graphics.Blit(sourceTexture, destTexture, material);
        }
        else
        {
            Graphics.Blit(sourceTexture, destTexture);
        }
    }
    //設(shè)置灰度程度
    void Update()
    {
        grayScaleAmount = Mathf.Clamp(grayScaleAmount, 0, 1.0f);
    }
    //刪除新建的材質(zhì)
    void OnDisable()
    {
        if (curMaterial)
        {
            DestroyImmediate(curMaterial);
        }
    }
}

shader代碼:

Shader "Custom/GrayColor" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _grayScale("_grayScale",Float) = 1.0
    }
    SubShader {
        Pass {  
            ZTest Always Cull Off ZWrite Off
            
            CGPROGRAM  
            #pragma vertex vert  
            #pragma fragment frag  
              
            #include "UnityCG.cginc"  
              
            sampler2D _MainTex;  
            half _grayScale;
              
            struct v2f {
                float4 pos : SV_POSITION;
                half2 uv: TEXCOORD0;
            };
              
            v2f vert(appdata_img v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord;   
                return o;
            }
        
            fixed4 frag(v2f i) : SV_Target {
                fixed4 renderTex = tex2D(_MainTex, i.uv); 
                //置灰后的灰色值
                float gray = dot(renderTex.rgb, float3(0.299, 0.587, 0.114));
                fixed4 grayColor = fixed4(gray, gray, gray,renderTex.a);
                //將原來的顏色與灰色做插值運算
                fixed4 finalColor = lerp(renderTex,grayColor,_grayScale);
                return finalColor;
            }  
              
            ENDCG
        }  
    }
    
    Fallback Off
}

最終效果:


GrayScaleAmount=0.png
GrayScaleAmount=1.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市速缆,隨后出現(xiàn)的幾起案子降允,更是在濱河造成了極大的恐慌,老刑警劉巖激涤,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拟糕,死亡現(xiàn)場離奇詭異判呕,居然都是意外死亡,警方通過查閱死者的電腦和手機送滞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門侠草,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人犁嗅,你說我怎么就攤上這事边涕。” “怎么了褂微?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵功蜓,是天一觀的道長。 經(jīng)常有香客問我宠蚂,道長式撼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任求厕,我火速辦了婚禮著隆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呀癣。我一直安慰自己美浦,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布项栏。 她就那樣靜靜地躺著浦辨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沼沈。 梳的紋絲不亂的頭發(fā)上流酬,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音庆冕,去河邊找鬼康吵。 笑死劈榨,一個胖子當著我的面吹牛访递,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播同辣,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拷姿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旱函?” 一聲冷哼從身側(cè)響起响巢,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棒妨,沒想到半個月后踪古,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體含长,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年伏穆,在試婚紗的時候發(fā)現(xiàn)自己被綠了拘泞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡枕扫,死狀恐怖陪腌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烟瞧,我是刑警寧澤诗鸭,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站参滴,受9級特大地震影響强岸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砾赔,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一请唱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧过蹂,春花似錦十绑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脆诉,卻和暖如春甚亭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背击胜。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工亏狰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偶摔。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓暇唾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辰斋。 傳聞我的和親對象是個殘疾皇子策州,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容