unity shader入門(mén)指南與總結(jié)

作者學(xué)習(xí)shader已經(jīng)有很長(zhǎng)一段時(shí)間了,這篇文章是對(duì)shader的整理和總結(jié)量瓜。shader的世界繽紛多彩打毛,浩瀚無(wú)窮柿赊,作者的認(rèn)識(shí)只是彌勒山下的一粒沙子,如滄海一粟幻枉,希望次文章可以對(duì)您有所幫助碰声,那便是作者最大的欣慰!

學(xué)習(xí)資料和工具推薦:

古人有云:工欲善其事必先利其器熬甫!

? ●書(shū)籍:

《Unity Shaders and Effects Cookbooks》作者讀的第一本書(shū)

《GPU 編程與CG 語(yǔ)言之陽(yáng)春白雪下里巴人》可以幫助你了解硬件胰挑,此書(shū)作者水平很高

《Real-Time Rendering.3rd》經(jīng)典之作,不過(guò)不適合入門(mén)

《Unity shader入門(mén)精要》一個(gè)女孩寫(xiě)的書(shū),適合大部分想要學(xué)unity shader的初學(xué)者

《untiy3d ShaderLab實(shí)戰(zhàn)詳解》適合入門(mén)unity shader

《3D數(shù)學(xué)基礎(chǔ):圖形與游戲開(kāi)發(fā)》如果真的想學(xué)好shader瞻颂,學(xué)數(shù)學(xué)是必須的豺谈,這是我覺(jué)得比較系統(tǒng)全面,并且適合入門(mén)的數(shù)學(xué)書(shū)籍

《GPU編程精粹》系列 ? 這個(gè)大神可以試試贡这,初學(xué)者不太適合學(xué)習(xí)

《Unity5.X從入門(mén)到精通》shader章節(jié) ? ?相信官方的水平

書(shū)籍暫且推薦這些茬末,其實(shí)還有很多,如果需要可以互相交流盖矫。

博客和教學(xué)資料:

風(fēng)雨沖的Shader教程系列

Unity shader官方手冊(cè)

Cg Programming in Unity

CgCookie的Shader初級(jí)視頻教程

CgCookie的Shader中級(jí)視頻教程

《unity shader入門(mén)精要》作者博客

國(guó)外教學(xué)視頻

學(xué)習(xí)資料暫時(shí)這些丽惭,如果有更好的歡迎補(bǔ)充

逆天工具:

Shader Forge


編寫(xiě)shader的可視化編輯器,使編寫(xiě)shader難度大大減少辈双,也方便開(kāi)發(fā)者理解shader吐根,大大增加開(kāi)發(fā)的效率,適合初學(xué)者(一般大神都鄙視這個(gè)工具辐马,大神都是用手寫(xiě))

Shader Forge插件百度網(wǎng)盤(pán)

Shader Forge教學(xué)視頻百度網(wǎng)盤(pán)

vs2013自動(dòng)補(bǔ)全代碼拷橘,語(yǔ)法高亮顯示插件


相信大部分開(kāi)發(fā)者已經(jīng)用慣了VS,但是VS居然不支持shader代碼高亮和自動(dòng)補(bǔ)全喜爷,這個(gè)是無(wú)法容忍的事冗疮,好在作者混跡github多年,上面奇人異事很多檩帐,故而找到這個(gè)插件术幔。

vs代碼高亮自動(dòng)補(bǔ)全插件


shader基礎(chǔ)


概念:Shader(著色器)實(shí)際上就是一小段程序,它負(fù)責(zé)將輸入的Mesh(網(wǎng)格)以指定的方式和輸入的貼圖或者顏色等組合作用湃密,然后輸出诅挑。繪圖單元可以依據(jù)這個(gè)輸出來(lái)將圖像繪制到屏幕上。輸入的貼圖或者顏色等泛源,加上對(duì)應(yīng)的Shader拔妥,以及對(duì)Shader的特定的參數(shù)設(shè)置,將這些內(nèi)容(Shader及輸入?yún)?shù))打包存儲(chǔ)在一起达箍,得到的就是一個(gè)Material(材質(zhì))没龙。之后,我們便可以將材質(zhì)賦予合適的renderer(渲染器)來(lái)進(jìn)行渲染(輸出)了缎玫。

Shader只是一段規(guī)定好輸入(顏色硬纤,貼圖等)和輸出(渲染器能夠讀懂的點(diǎn)和顏色的對(duì)應(yīng)關(guān)系)的程序。而Shader開(kāi)發(fā)者要做的就是根據(jù)輸入赃磨,進(jìn)行計(jì)算變換筝家,產(chǎn)生輸出而已。

如圖:


可以總結(jié)成一句話:

1.GameObject里有MeshRenderer邻辉,

2.MeshRenderer里有Material列表溪王,

3.每個(gè)Material里有且只有一個(gè)Shader腮鞍;

4.Material在編輯器暴露該Shader的可調(diào)屬性。

所以在扰,關(guān)鍵是如何編寫(xiě)shader。


unity自建shader說(shuō)明:

? ?Standard surface shader會(huì)產(chǎn)生一個(gè)包含了標(biāo)準(zhǔn)關(guān)照模型(使用了unity5中新添加的基于物理的渲染方法)的表面著色器模板(為我們提供了典型的表面著色器的實(shí)現(xiàn)方法)

? ? Unity shader則會(huì)產(chǎn)生一個(gè)不包含關(guān)照(但包含霧效)的基本的頂點(diǎn)/片元著色器

? ? Image effect shader則為我們實(shí)現(xiàn)各種屏幕后處理效果提供了一個(gè)基本的模板

? ? Compute shader會(huì)產(chǎn)生一種特殊的shader文件雷客,這類shader目的是利用GPU的并行性來(lái)進(jìn)行一些與常規(guī)渲染流水線無(wú)關(guān)的計(jì)算芒珠。

Unity Shader文件操作說(shuō)明:

? ? show generated code? 對(duì)于表面著色器,我們通過(guò)單擊show generated code按鈕來(lái)打開(kāi)一個(gè)新的文件搅裙,在該文件里將顯示unity在背后為該表面著色器生成的頂點(diǎn)/片元著色器皱卓。

? ? Compile and show code? 下拉列表可以讓開(kāi)發(fā)者檢查該unity shader針對(duì)的不同圖像編程接口(如opebgl ,d3d9,d3d11等)最終編譯成的shader代碼,我們可以利用這些代碼來(lái)分析和優(yōu)化著色器。

Unity內(nèi)置shader文件分析:

? ? CGIncludes文件夾中包含了所有的內(nèi)置包含文件

? ? DefaultResources文件夾中包含了一些內(nèi)置組件或功能所需要的unity shader部逮,例如一些GUI元素使用的shader

? ? DefaultResourcesExtra則包含了所有unity中內(nèi)置的shader

? ? Editor文件夾目前只包含一個(gè)腳本文件娜汁,它用于定義unity5引入的standard shader所用的材質(zhì)面板

(可以到官網(wǎng)下載內(nèi)置文件:https://unity3d.com/cn/get-unity/download/archive


Unity Shader的結(jié)構(gòu)


在unity里面,我們寫(xiě)shader兄朋,用到的是ShaderLab掐禁。ShaderLab是unity提供的編寫(xiě)unity shader的一種說(shuō)明性語(yǔ)言。

基礎(chǔ)結(jié)構(gòu)如下:


簡(jiǎn)單點(diǎn)颅和,可以總結(jié)成一下圖片:


●shader的名字:

每個(gè)Unity Shader文件的第一行都需要通過(guò)Shader語(yǔ)義來(lái)定義該Shader的名字傅事。

●shader的屬性:

在Properties語(yǔ)義塊中包含了一系列的屬性,這些屬性將會(huì)顯示在材質(zhì)面板中峡扩。

Properties的語(yǔ)義塊的形式通常如下:


其中的_Color就是表示屬性的名字蹭越,而"Main Color"則表示在材質(zhì)面板上出現(xiàn)的名字,Color則是為屬性定義的類型教届,Default Value表示我們?yōu)閷傩栽O(shè)置的默認(rèn)值响鹃,在我們第一次把Unity Shader賦給一個(gè)材質(zhì)時(shí),材質(zhì)面板上顯示的就是他的默認(rèn)值案训。


以上的類型可以規(guī)為以下幾類:

數(shù)字類型:他們的默認(rèn)值即為數(shù)據(jù)买置,如Int.Float.Range

四維向量:他們的默認(rèn)值是用圓括號(hào)包圍的一個(gè)四維向量,如Color.Vector

紋理類型:他們的默認(rèn)值是一個(gè)字符串后面跟一個(gè)花括號(hào)來(lái)指定的强霎,其中的字符串要么是空的要么是內(nèi)置的紋理的名稱堕义,如"black", "white"等,花括號(hào)的用處原本是用于指定一些紋理屬性的脆栋,但是在Unity5.0后的版本中這些選項(xiàng)被移除了倦卖。

具體代碼如下:


Properties語(yǔ)義塊的作用僅是為了讓這些屬性可以出現(xiàn)在材質(zhì)面板中:


●SubShader

1.設(shè)置渲染狀態(tài):

ShaderLab提供了一系列渲染狀態(tài)的設(shè)置指令,這些指令可以設(shè)置顯卡的各種狀態(tài)椿争,如開(kāi)啟混合/深度測(cè)試怕膛,具體選項(xiàng)如下。


2.標(biāo)簽:

SubShader的標(biāo)簽是一個(gè)鍵值對(duì)秦踪,它的鍵和值都是字符串類型褐捻,這些鍵值對(duì)是SubShader與渲染引擎之間的溝通橋梁掸茅。標(biāo)簽的結(jié)構(gòu)如下:

Tags { " TagName1 " = " Value1 " " TagName2 " = " Value2 "}

標(biāo)簽聲明僅可以在SubShader中場(chǎng)景,而不可以在Pass塊中聲明柠逞。Pass中雖然也可以定義標(biāo)簽昧狮,但這些標(biāo)簽是不同于SubShader中的標(biāo)簽的。具體內(nèi)容可以參考官方文檔:https://docs.unity3d.com/Manual/SL-SubShaderTags.html

3.Pass語(yǔ)義塊:

[Name]:首先我們可以在Pass中定義Pass的名稱板壮。

[Tags]:Pass語(yǔ)義塊的標(biāo)簽不同于SubShader的標(biāo)簽逗鸣,下面是Pass語(yǔ)義塊中的標(biāo)簽類型:


4.Fallback:

這一指令用于在其它的SubShader不能運(yùn)作的時(shí)候,使用Fallback值中的Shader绰精。


Unity Shader的形態(tài):


●固定管線

固定管線是為了兼容老式顯卡撒璧。都是頂點(diǎn)光照。之后固定管線可能是被Unity拋棄的功能笨使,所以最好不學(xué)它卿樱、當(dāng)它不存在。

●頂點(diǎn)/片元著色器


以上圖是可編程shader的編程格式硫椰,它具有復(fù)雜繁调,靈活性高的特點(diǎn),一直都是大神最喜愛(ài)的編寫(xiě)shader的方式靶草。具體用法和參數(shù)可以參考官方文檔:https://docs.unity3d.com/Manual/SL-SubShaderTags.html

●表面著色器


表面著色器是在頂點(diǎn)/片元著色器的上面做了一層抽象的封裝涉馁,目的是為了模擬人類的思維方式,使開(kāi)發(fā)人員開(kāi)發(fā)的難度大大降低爱致,并且寫(xiě)出來(lái)的程序易于理解和交流烤送,也大大減少了代碼量。但是弊端就是程序的靈活性低糠悯,擴(kuò)展性小帮坚,并且消耗的性能比較高。

具體內(nèi)容可以參考官方文檔:https://docs.unity3d.com/Manual/SL-SubShaderTags.html


●選擇Unity Shader的建議

1.除非設(shè)備是不支持可編程管線的著色器的互艾,才考慮使用固定函數(shù)著色器试和,否則都使用可編程管線的著色器。

2.想和各種光源打資產(chǎn)纫普,則可以使用表面著色器阅悍,但要注意他在移動(dòng)端的表現(xiàn)。

3.如果需要使用的光照數(shù)目特別少昨稼,那么頂點(diǎn)/片元著色器是一個(gè)更好的選擇节视。

4.如果有很多自定義的渲染效果,那么選擇頂點(diǎn)/片元著色器假栓。


總結(jié)


shader是一門(mén)博大精深的學(xué)科寻行,因?yàn)槔锩嫔婕暗酱罅康暮陀?jì)算機(jī)圖形學(xué)有關(guān)的內(nèi)容,不是單單靠一兩篇博客就可以說(shuō)清楚匾荆,弄明白的拌蜘。如果讀者們有意想精深學(xué)習(xí)shader編程杆烁,必須要花大量的時(shí)間打好基礎(chǔ)功,學(xué)習(xí)并非一朝一夕简卧。而且兔魂,在學(xué)的過(guò)程中不僅要知道“怎么用”,更重要的是要知道“為什么要這樣用”举娩,多多透過(guò)問(wèn)題的表象思考其本質(zhì)問(wèn)題析校,這樣才能朝大牛的方向不斷的前進(jìn)!


本人才疏學(xué)淺晓铆,如果有錯(cuò)誤的地方歡迎指正勺良!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绰播,一起剝皮案震驚了整個(gè)濱河市骄噪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蠢箩,老刑警劉巖链蕊,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谬泌,居然都是意外死亡滔韵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)掌实,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陪蜻,“玉大人,你說(shuō)我怎么就攤上這事贱鼻⊙缏簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵邻悬,是天一觀的道長(zhǎng)症昏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)父丰,這世上最難降的妖魔是什么肝谭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮蛾扇,結(jié)果婚禮上攘烛,老公的妹妹穿的比我還像新娘。我一直安慰自己镀首,他們只是感情好医寿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蘑斧,像睡著了一般靖秩。 火紅的嫁衣襯著肌膚如雪须眷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天沟突,我揣著相機(jī)與錄音花颗,去河邊找鬼。 笑死惠拭,一個(gè)胖子當(dāng)著我的面吹牛扩劝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播职辅,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼棒呛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了域携?” 一聲冷哼從身側(cè)響起簇秒,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秀鞭,沒(méi)想到半個(gè)月后趋观,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锋边,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年皱坛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豆巨。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剩辟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出往扔,到底是詐尸還是另有隱情贩猎,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布瓤球,位于F島的核電站融欧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卦羡。R本人自食惡果不足惜噪馏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绿饵。 院中可真熱鬧欠肾,春花似錦、人聲如沸拟赊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吸祟。三九已至瑟慈,卻和暖如春桃移,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葛碧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工借杰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人进泼。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓蔗衡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親乳绕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绞惦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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