1. 程式人生 > >第1章 歡迎來到Shader的世界

第1章 歡迎來到Shader的世界

歡迎來到Shader 的世界!我們曾不斷聽到周圍有人提出類似的問題:“ Shader 是什麼” “我應該看哪些書才能學好Shader" "學習Unity Shader,我應該從哪裡著手”。我們希望這本書可以告訴你這些問題的答案。如果本書是你學習Shader 的第一本書,我們希望這本書可以為你開啟一扇新的大門,讓你離製作心目中的優秀遊戲的心願更近一步:如果不是,我們同樣希望這本書可以讓你更深入地理解Shader 的方方面面,在學習Shader 的過程中更上一層樓。

1.1 程式設計師的三大浪漫

有人說,程式設計師的三大浪漫是編譯原理、作業系統和圖形學(是的,我己經聽到很多人在反駁這句話了,不要當真啦〉。不管你是否認同這句話,我們只是想借此說明圖形學在程式設計師心目中
的地位。正在看此書的你,想必多多少少都對圖形學或者渲染有一定興趣,也許你想要通過此書來學習如何實現遊戲中的各種特效,也許你僅僅是好奇那些絢麗的畫面是如何產生的。我們是程序員中的“外貌協會”,期待著用程式碼編寫出一個絢麗多姿的世界。這就是我們的浪漫。
我想,讀者大概都經歷過這樣的場景:當你在遊戲裡看到那些出色的畫面時,你很好奇這樣的遊戲是如何製作出來的,更具體的是,這樣的渲染效果是如何得到的。於是你搜索後發現,這個遊戲是Unity 引擎開發的,更巧的是, Unity 也是你熟知的引擎!於是你繼續搜尋,想要知道如何在Unity 裡實現這樣的效果,最後,你往往會得到“要編寫自己的Shader”這樣的答案。總算
有了一些頭緒,你繼續在網路上搜索如何學習編寫Shader。於是你看到了很多文章,這些文章告訴你Unity Shader 有哪些語法, 一個普通的漫反射或者邊緣高光的效果的程式碼是什麼樣子的。然後,你把這些程式碼貼上到Unity 中,儲存後執行,效果出現了! 一切看起來好像都很順利,可是,當你仔細閱讀這些程式碼時,卻往往沒有頭緒。你不知道為什麼要有一個名為vert 和frag 的函式,它們是什麼時候呼叫的,為什麼vert 函式裡要進行一些矩陣運算,這些矩陣是用來做什麼的,為什麼當你按照C#裡面的一些語法編寫時Shader 卻報錯了。這些疑問大大影響了你學習Shader 的信心,你開始覺得這是一個比學習C#難許多倍的事情,懷疑自己是不是還不具備學習如何編寫
Shader 的基礎。

如果上面的情景和你的經歷有些類似,那麼相信我,有很多人和你有一樣的煩惱。事實上,我們之所以會覺得學習Shader 比學習

C#這樣的程式語言更加困難, 一個原因是因為Shader 需要牽扯到整個渲染流程。當學習C++、C#這樣的高階語言時,我們可以在不瞭解計算機架構的情況下仍然編寫出實現各種功能的程式碼,這樣的高階語言更符合人類的思維方式。然而,Shader 並不是這樣的。我們之所以要學習Shader , 是想要學習如何把物體按照自己的意願渲染到螢幕上, 但是, Shader 只是整個渲染流程中的一個子部分。雖然它很關鍵, 但想要學習它,我們就需要了解整個渲染流程是如何進行的。和C++這樣的高階語言不同,儘管Shader 的編寫語言已經達到了我們可以理解的程度,但Shader 更多地是面向GPU 的工作方式,所以它的一些語法對我們來說並
不那麼直觀。因此,任何一篇只講語法、不講渲染框架的文章都無法解決讀者的困惑。

我們希望通過本書可以幫助讀者建立一個渲染流程的整體體系,這些基礎是跨越Shader 學習中層層障礙的重要因素。我們也相信,在學習完本書後,讀者可以自行回答本章開頭提出的那些問題。

1.2 本書結構

我們在編寫本書時儘量考慮到沒有渲染基礎的讀者們。因此,我們把整書分成了五大篇。

 基礎篇

這是很重要的一篇,儘管在本篇中我們沒有進行真正的程式碼編寫,但基礎篇會為初學者普及基本的理論知識以及必要的數學基礎。基礎篇包括了以下3 個章節。
第2章 渲染流水線  這一章講解了現代GPU 是如何實現整個渲染流水線的,這些內容對於理解Shader 的工作原理有著非常重要的作用。
第3章 Unity Shader基礎  Unity 在原有的渲染流程上進行了封裝,並提供給開發者新的圖像程式設計介面——Unity Shader。這一章將講解Unity Shader 的實現原理和基本語法,同時也將為讀者解答一些常見的困惑點。
第4章 學習Shader所需的數學基礎  數學向來是初學者面對的一大學習障礙。然而,在初級階段的渲染學習中,我們需要掌握的數學理論實際並不複雜。本章將為讀者講解渲染過程中常見的數學知識,如向量、矩陣運算、座標空間等。本章內容可以大大幫助讀者理解Shader 中的數學運算。為了幫助讀者加深理解,我們在講解過程中以一個具體的例子來闡述“一頭奶牛的鼻子是如何一步步被繪製到螢幕上的”。

 初級篇

在學習完基礎篇後,我們就正式開始了Unity Shader 的學習之旅。初級篇將會從最簡單的Shader 開始,講解Shader 中基礎的光照模型、紋理和透明效果等初級渲染效果。需要注意的是,我們在初級篇中實現的Unity Shader 大多不能直接用於真實專案中,因為它們缺少了完整的光照計算,例如陰影、光照衰減等,僅僅是為了闡述一些實現原理。在第9 章最後,我們會給出包括了完整光照計算的Unity Shader。初級篇包含了以下4 個章節。
第5章 開始Unity Shader 學習之旅  本章將實現一個簡單的頂點/片元著色器,並詳細解釋其中每個步驟的原理,這需要讀者對之前基礎篇的內容有所理解。本章還會給出關於Unity Shader 的一些常用的輔助技巧,例如如何除錯、檢視內建程式碼以及編寫規範等。
第6章 Unity中的基礎光照  本章將學習如何在Shader 中實現基本的光照模型,如漫反射、高光反射等。我們首先解釋如何從無到有實現一個光照模型,最後給出使用Unity 提供的內建函式來實現的版本。
第7章 基礎紋理  紋理的使用給渲染的世界帶來了更多的變化。這一章將會講述如何在Unity Shader 中使用法線紋理、遮罩紋理等基礎紋理。
第8章 透明效果  透明是遊戲中常用的渲染效果。這一章首先介紹了渲染的實現原理, 並給出了和Unity 的渲染順序相關的重要內容。在瞭解了這些內容的基礎上,我們將學習如何實現透明度測試和透明度混合等透明效果。

中級篇

中級篇是本書的進階篇章,主要講解Unity 中的渲染路徑、如何計算光照衰減和陰影、如何使用高階紋理和動畫等一系列進階內容。中級篇包含了以下3 個章節。
第9章 更復雜的光照  我們在初級篇中實現的光照模型沒有考慮一些重要的光照計算, 如陰影和光照衰減。本章首先講解Unity 中的

3 種渲染路徑和3 種重要的光源型別,再解釋如何在前向渲染路徑中實現包含了光照衰減、陰影等效果的完整的光照計算。在本章最後,我們會給出基於之前學習內容實現的包含了完整光照計算的Unity Shader。

第10章 高階紋理  這一章將會講解如何在Unity Shader 中使用立方體紋理、渲染紋理和程式紋理等高階紋理。
第11章 讓畫面動起來  靜態的畫面往往是無趣的。這一章將幫助讀者學習如何在Shader 中使用時間變數來實現紋理動畫、頂點動畫等動態效果。

高階篇

高階篇涵蓋了一些Shader 的高階用法,例如如何實現螢幕特效、利用法線和深度緩衝以及非真實感渲染等,同時, 我們還會介紹一些針對移動平臺的優化技巧。高階篇的結構如下。
第12章 屏幕後處理效果  螢幕特效是遊戲中常用的渲染手法之一。這一章將介紹如何在Unity 中實現一個基本的屏幕後處理腳本系統,並給出一些基本的螢幕特效的實現原理,如高斯模糊、邊緣檢測等。
第13章 使用深度和法線紋理  使用深度和法線紋理可以幫助我們實現很多螢幕特效。本章將介紹如何在Unity 中獲取這些特殊的紋理來實現螢幕特效。
第14章  非真實感渲染  很多遊戲使用了非真實感渲染的方法來渲染遊戲畫面。這一章將會給出常見的非真實感渲染的演算法,如卡通渲染、素描風格的渲染等。本章的擴充套件閱讀部分可以幫助讀者找到更多其他型別的非真實感渲染的實現方法。
第15章 使用噪聲  很多時候噪聲是我們的救星。本章給出了噪聲在遊戲渲染中的一些應用。
第16章 Unity中的渲染優化技術  優化往往是遊戲渲染中的重點。這一章介紹了Unity 中針對移動平臺使用的常見的優化技巧。

擴充套件篇

擴充套件篇旨在進一步擴充套件讀者的視野。本篇將會介紹Unity 的表面著色器的實現機制,並介紹基於物理的渲染的相關內容。最後,我們給出了更多的關於學習渲染的資料。擴充套件篇包含了以下4 個章節。
第17章 Unity 的表面著色器  探祕Unity 提出了一種新穎的Shader 形式一一表面著色器。本章將會介紹這些表面著色器是如何實現的, 以及如何使用這些表面著色器來實現渲染。
第18章 基於物理的渲染  Unity 5 終於引入了基於物理的渲染,這給Unity 引擎帶來了更強的渲染能力。這一章將介紹基於物理渲染的理論基礎,並解釋Unity 是如何實現基於物理的渲染的。我們還會在本章實現一個基本的場景來進一步闡述如何在Unity 5 中利用基於物理的渲染。
第19章 Unity 5 更新了什麼  相較於Unity 4.x, Unity 5 在Shader 方面有很多重要的更新。本章將給出Unity 5 中一些重要的更新,以幫助讀者解決在升級Unity 5 時所面對的各種問題。
第20章 還有更多內容嗎  圖形學的豐富多彩遠遠超乎我們的想象,我們相信一本書也遠遠無法滿足一些讀者強烈的求知慾。在最後一章中, 我們將給出許多非常有價值的學習資料,以幫助讀者進行更深入的學習。
那麼,你準備好了嗎?和我們一起進入Shader 的世界吧!