如何進一步學習 shader (CG) 的知識?
因為是做手游的shader,對效率和效果也都有比較高的要求,所以前一段時間一直在熟悉GPU的渲染流程以及基本的CG演算法,現在已經可以熟練閱讀複雜shader和shader的效果應用。
前些天在看到一個大神寫的shader中發現了可以直接用normalDir和ViewDir做為貼圖的紋理坐標直接模擬了類似高光的效果,直接膜拜。現在感覺做shader很大一部分就像在做線性代數的數學題,所以也在補習線性代數的一些東西。特別想成為那種對於CG的各個函數信手拈來的使用,各個效果瞭然於胸的Shader高手,想請問各位大神哪些書里有我想要學習的知識?是要開始多看一些圖形學演算法么?求推薦。
1. 高層
深入了解各種計算圖形學及數字圖像學的演算法,要知道它們要解決什麼問題,現存有那些解決方案,每個方案的優缺點是甚麼。書籍太多,不在此列舉,可參考本人的豆列:
- 計算機圖形: 入門/API類 http://book.douban.com/doulist/1445744/
- 計算機圖形: 進階/專門 http://book.douban.com/doulist/1445680/
- 計算機圖形: Gems類 http://book.douban.com/doulist/1445745/
- 計算機圖形: 專欄結集 http://book.douban.com/doulist/1445806/
- 計算機圖形: 動畫 http://book.douban.com/doulist/1445716/
- 計算機圖形: 相關數學 http://book.douban.com/doulist/1445735/
- 計算機圖形: 其他參考 http://book.douban.com/doulist/1447740/
遊戲圖形程序員必讀的是《Real Time Rendering》(見進建/專門豆列),和shader有關的較前沿著作有《GPU Pro》叢書(見Gems類列)。
計算機圖形學並不是追求物理上完全正確的解,而是觀眾/玩家看上去覺得好看。為了優化,有些問題可以通過近似化來減少運算,學習一些擬合函數(也需了解底層提供的現成函數),並作出嘗試。例如基於物理著色中的BRDF擬合[1]、SSS模擬[2]。
有時候,可以分解一些複雜的函數,生成查找表(LUT)減少運算量,如下面[1]的示例:
2. 底層
通常shader是圖形演算法實現的一部分,程序員需要了解shader語言提供的指令,以及它們如何影射至更底層的匯編指令,有時候還要了解具體的GPU架構和特性。有些指令可能較少用,例如ddx/ddy這些,有時候能用於優化。可以參考shader語言手冊、各GPU廠商的官方文件,以及GDC的一些講座[3][4]。
3. 數學
如題主所言,數學佔了很大的部分,建議閱讀[5][6],之後可以找相關數學的豆列。
參考
[1] Brian Karis, "Real Shading in Unreal Engine 4", ACM SIGGRAPH 2013 Courses: Physically based shading in theory and practice, ACM, 2013. http://blog.selfshadow.com/publications/s2013-shading-course/[2] Colin Barré-Brisebois, Marc Bouchard, "Real-Time Approximation of Light Transport in Translucent Homogenous Media", Gpu Pro 2. Vol. 2. CRC Press, 2011. Slides: GDC 2011 – Approximating Translucency for a Fast, Cheap and Convincing Subsurface Scattering Look[3] Emil Persson, "Low-Level Thinking in High-Level Shading Languages", GDC 2013. Slides: Humus - Articles
[4] Emil Persson, "Low-level Shader Optimization for Next-Gen and DX11", GDC 2014. Slides: Humus - Articles[5] Lengyel, Eric. Mathematics for 3D game programming and computer graphics. 3rd Edition, Cengage Learning, 2012.[6] Schneider, Philip, and David H. Eberly. Geometric tools for computer graphics. Morgan Kaufmann, 2002.按照樓主的說法,已經具有一些基礎了,只是要更進一步而已。
據我了解來看,樓主可以做以下事情提升自己:0. 圖形學的物理原理。圖形學的物理原理是一切效果的基石,不管你怎麼去思考,圖形效果的物理背景總是優先考慮的。因為它們直觀,而且被其他學科例如幾何光學等充分檢驗過。例如光線在界面和介質中的傳播是折射與反射的基礎、例如散射是體積光和Godray(丁達爾效應)的基礎。當你能將一種光學現象(例如鏡面反射)與它的物理背景聯繫起來,你就理解了問題的一半。這一部分的參考資料可見:《PBRT》
1. 數學技巧。物理學會告訴你基本的方程,對你的方程進行數學分析,會讓你把握一個數學物理模型的主要方面,簡化問題的表達或者是讓簡單的模型進一步處理更加複雜的問題。這些內容會分散在不同paper中,可能需要你有一定的閱讀量。例如BRDF到BTF的簡化、SSS材質的簡化等。此處推薦《Real Time Rendering》
2. 程序技巧。僅僅有數學你的模型可能還沒有辦法在有限時間內以足夠好的效果呈現出來。這個時候需要一定的程序技巧進行偷工減料。例如查找表、Level Of Detail等。Paper,歷年SIGGRAPH的Course,UE和CE的代碼,都是程序技巧的源泉。這部分內容非常分散,很多都是見招拆招就事論事,必須要有大量的積累。另外這一部分還有很多Tricky,這也是為什麼往往對著paper,但是總是做不出理想的效果的原因。這一部分幾乎完全要靠個人感覺。除了多實驗,多讀別人的結果外,沒有什麼太好的辦法。當然,GPU Gems和Shader X系列是挺不錯的選擇。
3. 技術美術經驗。本質上講,圖形學是糊弄眼睛的技術。所以圖形學中也會有一些完全不講道理的技巧和方法。有時候一些看起來很炫、原理很複雜的東西,可能不講道理會更方便。典型的例子包括鏡頭炫光、Skybox、抖動紋理坐標模擬bump/heat hazing。所以哪些選擇在程序上實現,哪些由美術直接出一個唬弄人的效果,這個需要很充分的經驗。這方面部分有專著或者成體系。大部分都可能是道聽途說或者是靈機一動。這些內容,可能要比程序技巧更難找。
4. GPU編程經驗。不管怎麼折騰,最後總是要把一切都放到GPU上。Mobile GPU和桌面GPU相比,Vendor更多,設計更加復(華)雜(而)精(不)巧(實),所以到處都是G點(哦,不對,是瓶頸),戳起來很有講究。比如某些卡上,內存訪問是瓶頸,那有一些就要靠計算;在TBR上,就要盡量利用TBR的優勢,把Viewport拆開繪製,等等。這些內容一般都見於硬體廠商的Slides中,歷年的GDC Course都是比較理想的資料來源。
推薦你個網站叫做shaderlab 上面很多 神奇的效果。 不過效果這種東西 有時候需要藝術修養的,一些簡單的圖 組合起來 產生特別好的效果, 可以看看火炬之光 1這款遊戲的編輯器, 叫做torchEdit, 下載遊戲的時候,自帶的, 裡面的效果做法都很樸素。
系統的學習shader,涉及到多個領域,一個是圖形圖像領域自身,例如繪製圖形,繪製顏色,噪音,分型,圖像處理,圖像模擬等內容,可以參考這個 視頻裡面的一些內容,
Unity shader 從0到1
有一個系統性的介紹,後續再深入學習,就需要去分析一些遊戲,和論文裡面的內容了。還有就是shader學習,良好的基礎開發環境很重要,unity作為一款遊戲引擎,用來學習shader非常方便。《GPU編程與CG語言之陽春白雪下里巴人》這書的名字可真夠長的,不過寫的確實不錯,可謂深入淺出。在書的結尾部分有基礎材質演算法,搞懂這些就算入門了。
以上大都是程序來回答你的問題。我作為一個美術出身的技術美術來回答一下。
程序部分各位大神已經講的很清楚了,我主要說視覺的部分。shader說到底是要給人眼展現結果,也就是要讓人腦負責視覺的部分認可你展現的視覺效果。首先要弄清楚人腦對什麼類的視覺信號敏感。一般來說是移動,輪廓,明暗,顏色,材質,這樣排下去,寫shader就是研究明白你試圖模仿的真實物體有什麼樣的視覺信號,然後簡明扼要地模仿出來。
所以,學點美術對寫shader大有用處,另外也去學點心理學什麼的,看什麼樣的刺激,能以最小的計算代價,能讓玩家達到最大的心理預期。
學shader最重要的是要學以致用,勤做練習。使用GPA,Nsight等軟體不斷的反覆分析其他shader進行對比。多從自己做的個別人做的shader上挑毛病。參考對應的論文,反覆重構驗證。
推薦個網站吧
Shadertoy BETA這個網站上面有很多的ps效果 大部分都是可以直接看到代碼的用obj法線和攝像機法線夾角模擬高光有什麼可膜拜的。。。
推薦閱讀:
※在頂級遊戲開發的過程中需要怎樣的編程實力?
※unity和ue4以後那個發展好?
※Unity 3D引擎有多強大?
※如何評價「仙劍奇俠傳六」使用Unity 3D引擎?
※去網易遊戲做開發需要怎樣的水平?