【Unity Shader入門精要學(xué)習(xí)】高級(四)

屏幕后處理效果

Bloom

Bloom特效是游戲中常見的一種屏幕效果酥郭。這種特效可以模擬真實攝像機的一種圖像效果衙传,它讓畫面中較亮的區(qū)域“擴散”到周圍的區(qū)域中,造成一種朦朧的效果。


大象之夢

一盖桥、Bloom的實現(xiàn)原理

1、首先根據(jù)一個閥值提取出圖像中較亮的區(qū)域题翻,把它們存儲在一張渲染紋理中

像素亮度閥值為0.5

可以看見只有較亮的地方不是黑色揩徊,其余地方全是黑色(0.0.0)
2、然后對這個渲染紋理進行高斯模糊用來模擬擴散效果
高斯模糊

上面的模糊不是很明顯嵌赠,因為像素采樣距離比較短
3塑荒、最后把這個渲染紋理和源圖像進行混合,得到最終結(jié)果
原圖像

Bloom

二姜挺、實現(xiàn)

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bloom : PostEffectsBase
{
    public Shader bloomShader;
    private Material bloomMaterial = null;

    public Material material
    {
        get
        {
            bloomMaterial = CheckShaderAndCreateMaterial(bloomShader, bloomMaterial);
            return bloomMaterial;
        }
    }

    [Range(0, 4)] public int iterations = 3;
    [Range(0.2f,3.0f)] public float blurSpread = 0.6f;
    [Range(1, 8)] public int downSample = 2;
    [Range(0.0f, 1.0f)] public float luminanceThreshold = 0.6f;
    
    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        if (material != null)
        {
            material.SetFloat("_LuminanceThreshold",luminanceThreshold);
            int rW = src.height / downSample;
            int rH = src.width / downSample;

            RenderTexture buffer0 = RenderTexture.GetTemporary(rW, rH, 0);
            buffer0.filterMode = FilterMode.Bilinear;
            //提取較亮的區(qū)域
            Graphics.Blit(src,buffer0,material,0);
            //Graphics.Blit(buffer0,dest);
            
            //進行高斯模糊
            for (int i = 0; i < iterations; i++)
            {
                material.SetFloat("_BlurSize",1.0f+i*blurSpread);
                RenderTexture buffer1 = RenderTexture.GetTemporary(rW,rH,0);
                Graphics.Blit(buffer0,buffer1,material,1);
                
                RenderTexture.ReleaseTemporary(buffer0);
                buffer0 = buffer1;
                buffer1 = RenderTexture.GetTemporary(rW, rH, 0);
                Graphics.Blit(buffer0,buffer1,material,2);
                buffer0 = buffer1;
            }
            //進行Bloom效果
            material.SetTexture("_Bloom",buffer0);
            Graphics.Blit(src,dest,material,3);
            
            RenderTexture.ReleaseTemporary(buffer0);
        }
        else
        {
            Graphics.Blit(src,dest);
        }
    }
}
Shader "Unlit/Bloom"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Bloom("Bloom Texture",2D)="black"{}
        _LuminanceThreshold("Luminance Threshold",float)=0.5
        _BlurSize("BlurSize",float) = 1.0
    }
    SubShader
    {
        CGINCLUDE
        #include "UnityCG.cginc"

        sampler2D _MainTex;
        half4 _MainTex_TexelSize;
        sampler2D _Bloom;
        float _LuminanceThreshold;
        float _BlurSize;

        struct v2f
        {
            float4 pos:SV_POSITION;
            half2 uv:TEXCOORD0;
        };

        fixed luminance(fixed4 color)
        {
            return  0.2125 * color.r + 0.7154 * color.g + 0.0721 * color.b;
        }

        v2f vertExtraBright(appdata_img v)
        {
            v2f o;
            o.pos = UnityViewToClipPos(v.vertex);
            o.uv = v.texcoord;

            return o;
        }

        fixed4 fragExtraBright(v2f i):SV_TARGET
        {
            fixed4 texColor = tex2D(_MainTex,i.uv);
            fixed luminanceVal = luminance(texColor);
            fixed val = clamp(luminanceVal - _LuminanceThreshold,0,1);
            //return fixed4(val,val,val,1);
            return texColor * val;
        }

        v2f vertBloom(appdata_img v)
        {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.uv = v.texcoord;

            return o;
        }

        fixed4 fragBloom(v2f i):SV_TARGET
        {
            return tex2D(_MainTex,i.uv) + tex2D(_Bloom,i.uv);
        }

        ENDCG

        ZTest Always Cull Off ZWrite Off

        Pass
        {
            NAME "EXTRABRIGHT"
            CGPROGRAM
            #pragma vertex vertExtraBright
            #pragma fragment fragExtraBright
            ENDCG
        }

        UsePass "Unlit/GaussionBlur/GAUSSION_BLUR_VERTICAL"
        UsePass "Unlit/GaussionBlur/GAUSSION_BLUR_HORZONTAL"

        Pass 
        {
            NAME "BLOOM"
            CGPROGRAM
            #pragma vertex vertBloom
            #pragma fragment fragBloom
            ENDCG
        }
    }

    Fallback Off
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末齿税,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炊豪,更是在濱河造成了極大的恐慌凌箕,老刑警劉巖拧篮,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牵舱,居然都是意外死亡串绩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門仆葡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赏参,“玉大人,你說我怎么就攤上這事沿盅“崖ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵腰涧,是天一觀的道長韧掩。 經(jīng)常有香客問我,道長窖铡,這世上最難降的妖魔是什么疗锐? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮费彼,結(jié)果婚禮上滑臊,老公的妹妹穿的比我還像新娘。我一直安慰自己箍铲,他們只是感情好雇卷,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颠猴,像睡著了一般关划。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翘瓮,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天贮折,我揣著相機與錄音,去河邊找鬼资盅。 笑死调榄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的律姨。 我是一名探鬼主播振峻,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼择份!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烫堤,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荣赶,失蹤者是張志新(化名)和其女友劉穎凤价,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拔创,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡利诺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剩燥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慢逾。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灭红,靈堂內(nèi)的尸體忽然破棺而出侣滩,到底是詐尸還是另有隱情,我是刑警寧澤变擒,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布君珠,位于F島的核電站,受9級特大地震影響娇斑,放射性物質(zhì)發(fā)生泄漏策添。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一毫缆、第九天 我趴在偏房一處隱蔽的房頂上張望唯竹。 院中可真熱鬧,春花似錦苦丁、人聲如沸浸颓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猾愿。三九已至,卻和暖如春账阻,著一層夾襖步出監(jiān)牢的瞬間蒂秘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工淘太, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留姻僧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓蒲牧,卻偏偏與公主長得像撇贺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冰抢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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