如何系統的學習 Unity 3D 中的 shader 編寫(nvidia cg 編程)?
相信一定也有很多做unity3d開發的朋友對shader這一塊有疑問。unity3d算是比較新的引擎,最近手游又比較火,很多unity3d程序猿應該是從其他專業轉過來的,比如本人以前就是搞java web開發的,所以對這一塊的知識體系不太了解。
我看了nvidia官網上的 The Cg Tutorial: Chapter 1. Introduction ,算是稍微入了點門,然後看了 Cg Programming/Unity 中的一些例子(有很多看不懂的),結合unity3d官方文檔,能寫一些簡單的shader,但複雜的東西就不太懂了(比如上次看到一個鏡面反射的例子,裡面有些矩陣運算,不太明白那演算法怎麼來的,當然自己線性代數不好也是硬傷)。感覺cg編程涉及的東西很多,數學、物理、編程、3D模型什麼的都要懂一些,要學的東西很多很雜,有些迷茫。不想再東拼西湊找例子,這裡拷一段那裡拷一段的寫shader,而是按照自己的想法寫。請問有什麼好書籍可以幫助我系統地學習這一塊的知識( 包括計算機圖形學、數學等各個方面的書籍)?
謝邀,這會是個比較漫長的學習過程
(一)國內引進出版的書籍
國內引進或出版的圖形學書籍很多,但是大部分是糟粕,看它們是浪費時間3D數學基礎:圖形與遊戲開發這本可以補數學基礎,矩陣變換,線性代數啥的圖形著色器:理論與實踐(第2版)
這本是比較新的講 opengl shader 的
DirectX 9.0 3D遊戲開發編程基礎
這本是國內出版或引進的 d3d 書籍中唯一能看的(二)國內沒有引進的書籍,可以下載電子版或上淘寶買列印版
OpenGL Shading Language可以認為是 glsl 的聖經Introduction to 3D Game Programming: With Directx 11
可以認為是 d3d11 的聖經,這本是 DirectX 9.0 3D遊戲開發編程基礎 的升級版(三)個人推薦3D數學基礎:圖形與遊戲開發DirectX 9.0 3D遊戲開發編程基礎
Introduction to 3D Game Programming: With Directx 11最近也在學習shader,推薦幾篇博客供題主入門。
1、首先來兩篇最最基礎文章對shader有大體的認識。這兩篇文章會分析shader中的一行行代碼,講解語法和作用並加以擴展。讀完後就基本了解了shader中的屬性、Tags、LOD、光照模型等是怎麼回事。
貓都能學會的Unity3D Shader入門指南(一)貓都能學會的Unity3D Shader入門指南(二)2、然後可以看《Unity Shader and Effect Cookbook》,或者它的中文版《Unity著色器和屏幕特效開發秘笈》。這本書會展示shader中的各個方面,如漫反射著色、紋理貼圖、鏡面反射等等。
可能由於這本書方方面面都有涉及,有時會忽略一些比較關鍵的細節,而這恰恰使初學者困惑。有一位博主記錄下了根據這本書學習的筆記,題主可以直接看博客來學習:【Unity Shaders】概述及Diffuse Shading介紹3、在第2步的過程中,你可能需要查閱shader中各個概念函數的更詳細的情況,這時你會需要Unity官方手冊以及Cg教程:
Unity - Manual: Shaders
Unity - Manual: Shader ReferenceThe Cg Tutorial4、學習shader的時候,你不僅想知道怎麼用,可能還想了解它背後的機制,那這篇文章你肯定不能錯過:
【Unity Shaders】初探Surface Shader背後的機制5、這些都熟練了,對shader也都比較熟悉了。你可以嘗試去創造屬於自己的shader,也可以去Shadertoy BETA尋求靈感,感受shader的鬼斧神工。不知道國內能不能登得上去—— Cg Programming 的 Wikibooks (鏈接:Wikibooks, open books for an open world)。尤其是Unity那一部分,寫的相當細緻外帶示例代碼,英文能力允許的話建議直接刷一遍。剛開始實習的時候就把所有的列印出來邊讀邊記筆記邊實踐,同時結合Unity的Shader部分的Documentation,很快就入門然後自己寫光照模型和Vertex/Fragment Shader了。
看過了這些,之後沒事兒再看點別的書或教程重溫一下真是神清氣爽。
還得看NVidia良心免費彩色pdf 《GPU GEMS IIIIII》。這三本書十分精彩,我在當初還沒免費的時候就買過了,一本一百多。
自己回答一下,再補充兩本書:
1.《Unity Shaders and Effects Cookbook》主要講Unity的Surface Shader 編程技巧,非常實用。除了光照以外還有Image effects在Unity中的實現。強力推薦。2. 《Real-Time Rendering》
比較底層的內容,夯實基礎(自己還沒看完)發現了新的好書再繼續更新!僅針對你只想學些shader編程來講:
1、先要明白shader在整個3D流水線中的地位或者是作用,建立流水線概念的過程,是理解整個當代3D的基礎。
2、把Unity當做shader編輯器,這一方面講,unity的確也是不錯的,:)。由簡到難的分析和實驗各個shader,調試各種參數,用unity的所見即所得界面,了解shader內部代碼的意義。
3、就每個遇到的問題,在互聯網上查找該問題的可能的答案。如Diffuse light的演算法公式究竟是什麼,shadow map的矩陣幹嘛用的。在這塊上,請盡量查找英文資料,會痛快些。
就這麼三點,第一點是面,能幫助自己確定方向。第三點是點,知道自己的短線位置在哪裡。書籍不舉例,只知道我第一本看的書是《3D遊戲編程大師技巧》。後來在各種查找過程中,各種不同的書籍自然會進入自己的腰包,沒有一本是需要全部讀完的。但是讀完所有的每本的某一個部分,應該每本書都算是讀完了,你明白的。
數學推薦這部——《Mathematics for 3D Game Programming and Computer Graphics 3rd》另外就是看看這個推薦遊戲程序員養成計劃 (更新2013.3.19)
最近在跟著這個教程做,Shader編程教程(3月2日更新67課)【會員免費】
現在呢,能看懂大部分Unity Shader的源碼。我覺得看視頻聽課,省時省力,照著視頻跟著做就好,買個會員免費看了(不是廣告,真心推薦),對於漲的工資來說太划算了。作為入門和強化基礎知識這個視頻最好不過了。之前買了很多書紅寶書和藍寶書都買了N版,圖形學的書也下了些電子版的,看著呢比較耗精力和時間適合入門之後作為補充和深入是不錯的。大概說下視頻好的地方吧
1.會講線性代數基礎。然後用C#會實現個mini數學庫,到最後會用來實戰,跟著做就好。看完這部分我再看,Cocos2d-x 3.x的數學庫和OpenGL SB5的數學庫就差不多都能看懂了。原理都是一樣的。2.會用C#的System.Drawing(忘了怎麼拼)這個庫,結合自己實現的數學庫來教你繪製一個3d的立體在屏幕上,System.Drawing是二維的,我用的是Mac沒裝Windows系統,所以沒跟著練,但是看完後知道原理了,如果讓我不用OpenGL或其他硬體加速的圖形庫,而用只支持二維坐標的一個圖形庫來畫3d圖像的話,照貓畫虎也能實現一個。
3.會講Unity中常用的Shader API(雖然官方文檔也有)。
4.臨時出去有事,等會更新 233回來了,視頻中老師語速偏慢,有足夠的時間去思考去理解,同時也治好了困擾我多個月的失眠:)。
unity的shader淺淺的包裝了一下cg。類似fx。總之就是一個DSL,對cg和渲染流程做了一些描述。所以基本上,你還是需要了解shader語言及基本的渲染流程。 @張靜vinjn和 @kUANG tOBY提到的書對頭。速學的話,我補充一本:《GPU Programming And Cg Language Primer 1rd Edition》。國內的人寫的小冊子,很不錯。
shader 只是一小段 運行在gpu上面的程序,因此需要首先去系統學習圖形學,接著進階學習 NVIDIA的 cg 書籍。圖形學包括矩陣計算,gpu流水線等等內容。而unity 的 shader其實是更高階的內容。如果你只是求快 看看unity 的 wiki 中關於shader的樣例即可。下面這個視頻不錯,有專門講解shader相關基礎概念知識的內容,可以看看。Unity RPG MMO-火炬之光開發
這個網站可以參考 Shadertoy BETA
不過是同樣的問題,因為很多代碼都是式子,是經過計算之後得出的,計算過程在代碼里沒有體現,所以根本不知道那些奇怪的數字和算式都是怎麼來的。
我覺得學習shader就和學習語言很相似,在學會基本的語法,結構後,最好是實踐。但是我還真沒遇到純程序員能把shader寫的很「好」的。因為很多時候寫出來了還需要給出好的案例,這樣別人才會用。Unity現在的shader結構比較複雜。只是學書上的知識,一到實際應用就各種問題了。所以還是實踐吧。把一個簡單的shader寫的兼容性,控制性都很好。然後出幾個實際的效果案例。其實shader本質不是很難,難的是如何出好的效果。對效果的研究花費的精力遠多於shader本身。所以培養一些美術細胞是必須的。
亞馬遜搜 馮樂樂,直接就有unity shader對口的書
推薦一本書,Unity Shader and Effect Cookbook,但一般的Shader都可以用Shader Forge搞定。Shader Forge是一個可視化的,nose-based的shader編輯器。簡單來說,就是你在圖形化界面把各種effect按一定邏輯連接好,它可以自動生成shader的代碼。
我比較推薦《互動式計算機圖形學:基於OpenGL的自頂向下方法(第6版)》配合《計算機圖形學/基於3D圖形開發技術》食用風味更佳。學習shader會遇到一些比較基礎的數學問題,google、wiki和度娘基本能夠解決。
五十弦 | 50 Strings這是我找到的最好的入門教程,沒有之一,誰用誰知道。
怎麼說呢?寫這個東西實現效果是一方面,實現效果之後效率能不能達標是另一方面,效率效果都可以目標平台是否兼容也是一方面。前期學點語法能入門,後期提升還要靠深厚的數學功底和悟性。這個東西國內有能力的人不一定教你,能力不足的人自己也是一知半解,最重要的是自己要具備極高的悟性和正確的學習方法,祝你好遠~外加一句,unity中的默認shader都需要深度優化以後才能用於手機項目。還有一點是unity不是推薦用CG寫,而是用CG寫可以編出來不同平台的代碼。這也是cg設計的初衷
馮樂樂 unity shader入門精要,入門的話看這個蠻不錯的
我現在看的是這本,之前是看的遊戲蠻牛裡面的教程,題主可以去看看,講的還可以吧!
推薦閱讀:
※為什麼緩衝區能提升性能?
※程序員是否需要大尺寸的顯示器?
※coursera上有哪些值得學習的Python,數據分析的課程?
※哪些程序或服務可以方便地保存常用代碼片段?
※為什麼C++的逗號運算符是可以重載的?