Unity Render Textures實(shí)現(xiàn)畫(huà)面特效——建立畫(huà)面特效腳本系統(tǒng)

轉(zhuǎn)自http://blog.csdn.NET/candycat1992/article/details/39255575

1.新建一個(gè)場(chǎng)景


2.將以下腳本添加到攝像機(jī)上

[csharp] view plain copy

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class TestRenderImage : MonoBehaviour {

#region Variables  
public Shader curShader;  
public float grayScaleAmount = 1.0f;  
private Material curMaterial;  
#endregion  

#region Properties  
public Material material  
{  
    get  
    {  
        if (curMaterial == null)  
        {  
            curMaterial = new Material(curShader);  
            curMaterial.hideFlags = HideFlags.HideAndDontSave;  
        }  
        return curMaterial;  
    }  
}  
#endregion  

// Use this for initialization    
void Start()  
{  
    if (SystemInfo.supportsImageEffects == false)  
    {  
        enabled = false;  
        return;  
    }  

    if (curShader != null && curShader.isSupported == false)  
    {  
        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);  
    }  
}  

// Update is called once per frame    
void Update()  
{  
    grayScaleAmount = Mathf.Clamp(grayScaleAmount, 0.0f, 1.0f);  
}  

void OnDisable()  
{  
    if (curMaterial != null)  
    {  
        DestroyImmediate(curMaterial);  
    }  
}  

}

3.新建一個(gè)shader僻肖,修改為以下代碼根欧,然后賦值給上面的腳本

[csharp] view plain copy

Shader "Custom/ImageEffect" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_LuminosityAmount ("GrayScale Amount", Range(0.0, 1.0)) = 1.0
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag

        #include "UnityCG.cginc"    
            
        uniform sampler2D _MainTex;    
        fixed _LuminosityAmount;    
            
        fixed4 frag(v2f_img i) : COLOR    
        {    
            //Get the colors from the RenderTexture and the uv's    
            //from the v2f_img struct    
            fixed4 renderTex = tex2D(_MainTex, i.uv);    
                
            //Apply the Luminosity values to our render texture    
            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"    

}

4.效果圖


分析:這里的特效是針對(duì)整個(gè)畫(huà)面的,通過(guò)修改shader可以整體地改變畫(huà)面的效果。

解釋:一旦通過(guò)上述的各種檢查余境,我們就需要調(diào)用內(nèi)置的OnRenderImage函數(shù)來(lái)實(shí)現(xiàn)畫(huà)面特效。這個(gè)函數(shù)負(fù)責(zé)從Unity渲染器中抓取當(dāng)前的render texture嚎卫,然后使用Graphics.Blit()函數(shù)再傳遞給Shader(通過(guò)sourceTexture參數(shù))勃救,然后再返回一個(gè)處理后的圖像再次傳遞回給Unity渲染器(通過(guò)destTexture參數(shù))。這兩個(gè)行數(shù)互相搭配是處理畫(huà)面特效的很常見(jiàn)的方法甲脏。你可以在下面的連接中找到這兩個(gè)函數(shù)更詳細(xì)的信息:OnRenderImage:該攝像機(jī)上的任何腳本都可以收到這個(gè)回調(diào)(意味著你必須把它附到一個(gè)Camera上)眶熬。允許你修改最后的Render Texture。Graphics.Blit:sourceTexture會(huì)成為material的_MainTex块请。

畫(huà)面特效是順序處理的聋涨,這就像Photoshop中的layers。如果你有多個(gè)屏幕特效负乡,你可以按順序添加給該Camera牍白,那么它們就會(huì)按照這個(gè)順序被處理。

上述的過(guò)程是被簡(jiǎn)化過(guò)的抖棘,但通過(guò)這些我們可以看出畫(huà)面特效的核心是如何工作的茂腥。最后狸涌,我們總結(jié)上述使用Render Texture實(shí)現(xiàn)畫(huà)面特效的核心過(guò)程:

在腳本中檢查當(dāng)前平臺(tái)對(duì)特效的支持;
通過(guò)OnRenderImage()函數(shù)抓取render texture最岗,再通過(guò)Graphics.Blit()函數(shù)傳遞給虛擬材質(zhì)中的Shader進(jìn)行后處理帕胆;
Shader的_MainTex即為接收到的render texture,在frag函數(shù)里對(duì)圖像進(jìn)行逐像素處理后再返回給OnRenderImage函數(shù)般渡,得到最后的屏幕畫(huà)面懒豹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驯用,隨后出現(xiàn)的幾起案子脸秽,更是在濱河造成了極大的恐慌,老刑警劉巖蝴乔,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件记餐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡薇正,警方通過(guò)查閱死者的電腦和手機(jī)片酝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挖腰,“玉大人雕沿,你說(shuō)我怎么就攤上這事『锫兀” “怎么了晦炊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宁脊。 經(jīng)常有香客問(wèn)我断国,道長(zhǎng),這世上最難降的妖魔是什么榆苞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任稳衬,我火速辦了婚禮,結(jié)果婚禮上坐漏,老公的妹妹穿的比我還像新娘薄疚。我一直安慰自己,他們只是感情好赊琳,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布街夭。 她就那樣靜靜地躺著,像睡著了一般躏筏。 火紅的嫁衣襯著肌膚如雪板丽。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音埃碱,去河邊找鬼猖辫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛砚殿,可吹牛的內(nèi)容都是我干的啃憎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼似炎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辛萍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起羡藐,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贩毕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后传睹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體耳幢,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岸晦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年欧啤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片启上。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邢隧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冈在,到底是詐尸還是另有隱情倒慧,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布包券,位于F島的核電站纫谅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溅固。R本人自食惡果不足惜付秕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侍郭。 院中可真熱鬧询吴,春花似錦、人聲如沸亮元。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爆捞。三九已至奉瘤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間煮甥,已是汗流浹背毛好。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工望艺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肌访。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓找默,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親吼驶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惩激,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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