unity shader入門指南與總結

作者學習shader已經有很長一段時間了,這篇文章是對shader的整理和總結。shader的世界繽紛多彩,浩瀚無窮,作者的認識只是彌勒山下的一粒沙子,如滄海一粟,希望次文章可以對您有所幫助,那便是作者最大的欣慰!

學習資料和工具推薦:

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

? ●書籍:

《Unity Shaders and Effects Cookbooks》作者讀的第一本書

《GPU 編程與CG 語言之陽春白雪下里巴人》可以幫助你了解硬件,此書作者水平很高

《Real-Time Rendering.3rd》經典之作,不過不適合入門

《Unity shader入門精要》一個女孩寫的書,適合大部分想要學unity shader的初學者

《untiy3d ShaderLab實戰詳解》適合入門unity shader

《3D數學基礎:圖形與游戲開發》如果真的想學好shader,學數學是必須的,這是我覺得比較系統全面,并且適合入門的數學書籍

《GPU編程精粹》系列 ? 這個大神可以試試,初學者不太適合學習

《Unity5.X從入門到精通》shader章節 ? ?相信官方的水平

書籍暫且推薦這些,其實還有很多,如果需要可以互相交流。

博客和教學資料:

風雨沖的Shader教程系列

Unity shader官方手冊

Cg Programming in Unity

CgCookie的Shader初級視頻教程

CgCookie的Shader中級視頻教程

《unity shader入門精要》作者博客

國外教學視頻

學習資料暫時這些,如果有更好的歡迎補充

逆天工具:

Shader Forge


編寫shader的可視化編輯器,使編寫shader難度大大減少,也方便開發者理解shader,大大增加開發的效率,適合初學者(一般大神都鄙視這個工具,大神都是用手寫)

Shader Forge插件百度網盤

Shader Forge教學視頻百度網盤

vs2013自動補全代碼,語法高亮顯示插件


相信大部分開發者已經用慣了VS,但是VS居然不支持shader代碼高亮和自動補全,這個是無法容忍的事,好在作者混跡github多年,上面奇人異事很多,故而找到這個插件。

vs代碼高亮自動補全插件


shader基礎


概念:Shader(著色器)實際上就是一小段程序,它負責將輸入的Mesh(網格)以指定的方式和輸入的貼圖或者顏色等組合作用,然后輸出。繪圖單元可以依據這個輸出來將圖像繪制到屏幕上。輸入的貼圖或者顏色等,加上對應的Shader,以及對Shader的特定的參數設置,將這些內容(Shader及輸入參數)打包存儲在一起,得到的就是一個Material(材質)。之后,我們便可以將材質賦予合適的renderer(渲染器)來進行渲染(輸出)了。

Shader只是一段規定好輸入(顏色,貼圖等)和輸出(渲染器能夠讀懂的點和顏色的對應關系)的程序。而Shader開發者要做的就是根據輸入,進行計算變換,產生輸出而已。

如圖:


可以總結成一句話:

1.GameObject里有MeshRenderer,

2.MeshRenderer里有Material列表,

3.每個Material里有且只有一個Shader;

4.Material在編輯器暴露該Shader的可調屬性。

所以,關鍵是如何編寫shader。


unity自建shader說明:

? ?Standard surface shader會產生一個包含了標準關照模型(使用了unity5中新添加的基于物理的渲染方法)的表面著色器模板(為我們提供了典型的表面著色器的實現方法)

? ? Unity shader則會產生一個不包含關照(但包含霧效)的基本的頂點/片元著色器

? ? Image effect shader則為我們實現各種屏幕后處理效果提供了一個基本的模板

? ? Compute shader會產生一種特殊的shader文件,這類shader目的是利用GPU的并行性來進行一些與常規渲染流水線無關的計算。

Unity Shader文件操作說明:

? ? show generated code? 對于表面著色器,我們通過單擊show generated code按鈕來打開一個新的文件,在該文件里將顯示unity在背后為該表面著色器生成的頂點/片元著色器。

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

Unity內置shader文件分析:

? ? CGIncludes文件夾中包含了所有的內置包含文件

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

? ? DefaultResourcesExtra則包含了所有unity中內置的shader

? ? Editor文件夾目前只包含一個腳本文件,它用于定義unity5引入的standard shader所用的材質面板

(可以到官網下載內置文件:https://unity3d.com/cn/get-unity/download/archive


Unity Shader的結構


在unity里面,我們寫shader,用到的是ShaderLab。ShaderLab是unity提供的編寫unity shader的一種說明性語言。

基礎結構如下:


簡單點,可以總結成一下圖片:


●shader的名字:

每個Unity Shader文件的第一行都需要通過Shader語義來定義該Shader的名字。

●shader的屬性:

在Properties語義塊中包含了一系列的屬性,這些屬性將會顯示在材質面板中。

Properties的語義塊的形式通常如下:


其中的_Color就是表示屬性的名字,而"Main Color"則表示在材質面板上出現的名字,Color則是為屬性定義的類型,Default Value表示我們為屬性設置的默認值,在我們第一次把Unity Shader賦給一個材質時,材質面板上顯示的就是他的默認值。


以上的類型可以規為以下幾類:

數字類型:他們的默認值即為數據,如Int.Float.Range

四維向量:他們的默認值是用圓括號包圍的一個四維向量,如Color.Vector

紋理類型:他們的默認值是一個字符串后面跟一個花括號來指定的,其中的字符串要么是空的要么是內置的紋理的名稱,如"black", "white"等,花括號的用處原本是用于指定一些紋理屬性的,但是在Unity5.0后的版本中這些選項被移除了。

具體代碼如下:


Properties語義塊的作用僅是為了讓這些屬性可以出現在材質面板中:


●SubShader

1.設置渲染狀態:

ShaderLab提供了一系列渲染狀態的設置指令,這些指令可以設置顯卡的各種狀態,如開啟混合/深度測試,具體選項如下。


2.標簽:

SubShader的標簽是一個鍵值對,它的鍵和值都是字符串類型,這些鍵值對是SubShader與渲染引擎之間的溝通橋梁。標簽的結構如下:

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

標簽聲明僅可以在SubShader中場景,而不可以在Pass塊中聲明。Pass中雖然也可以定義標簽,但這些標簽是不同于SubShader中的標簽的。具體內容可以參考官方文檔:https://docs.unity3d.com/Manual/SL-SubShaderTags.html

3.Pass語義塊:

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

[Tags]:Pass語義塊的標簽不同于SubShader的標簽,下面是Pass語義塊中的標簽類型:


4.Fallback:

這一指令用于在其它的SubShader不能運作的時候,使用Fallback值中的Shader。


Unity Shader的形態:


●固定管線

固定管線是為了兼容老式顯卡。都是頂點光照。之后固定管線可能是被Unity拋棄的功能,所以最好不學它、當它不存在。

●頂點/片元著色器


以上圖是可編程shader的編程格式,它具有復雜,靈活性高的特點,一直都是大神最喜愛的編寫shader的方式。具體用法和參數可以參考官方文檔:https://docs.unity3d.com/Manual/SL-SubShaderTags.html

●表面著色器


表面著色器是在頂點/片元著色器的上面做了一層抽象的封裝,目的是為了模擬人類的思維方式,使開發人員開發的難度大大降低,并且寫出來的程序易于理解和交流,也大大減少了代碼量。但是弊端就是程序的靈活性低,擴展性小,并且消耗的性能比較高。

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


●選擇Unity Shader的建議

1.除非設備是不支持可編程管線的著色器的,才考慮使用固定函數著色器,否則都使用可編程管線的著色器。

2.想和各種光源打資產,則可以使用表面著色器,但要注意他在移動端的表現。

3.如果需要使用的光照數目特別少,那么頂點/片元著色器是一個更好的選擇。

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


總結


shader是一門博大精深的學科,因為里面涉及到大量的和計算機圖形學有關的內容,不是單單靠一兩篇博客就可以說清楚,弄明白的。如果讀者們有意想精深學習shader編程,必須要花大量的時間打好基礎功,學習并非一朝一夕。而且,在學的過程中不僅要知道“怎么用”,更重要的是要知道“為什么要這樣用”,多多透過問題的表象思考其本質問題,這樣才能朝大牛的方向不斷的前進!


本人才疏學淺,如果有錯誤的地方歡迎指正!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容