計算機圖形學,下一步如何提高?

pbrt第二第三版

高數一套,練習大部分都認認真真做了,概率論有些沒有做,因為pbrt用到一些微積分加概率論,所以買了。圖形學原理大概是最早看的一本書,大部分都忘記了,怎麼高效的畫直線有點印象……3d遊戲編程大師技巧是講用軟體自己實現渲染流水線,pipeline每個部分處理什麼功能還有點印象,但是大部分細節想不起來了。

cpp和windows的一些東西,感覺比圖形學要容易,看起來也有自己的心得,但是肯定也談不上精通,如果有時間可以一直研究下去,看看cpp標準還有編譯原理什麼的,但是感覺如果光是精通工具,也做不了什麼東西……

遊戲引擎架構很早就看了,但是大部分看不懂,所以雜七雜八買了其他那些書,因為總結的太精闢了,除非已經是3d渲染方面的有經驗的開發者,還是很難看懂那些精鍊過的東西的。vulkan這本書寫的不好,錯誤較多,但是大概理解怎麼回事,比如用cmdlist降低CPU佔用,多線程支持,手動管理顯存,和dx12思路差不多。對了好像有一種通用的shader語言。opengl聖經這本書的例子都很有意思,想找時間再看一次,演算法導論這本書只看了前面一些,排序演算法和樹結構什麼的,3d場景管理有用到,但是習題都沒有做。dx11這本書感覺比dx12寫的要好,雖然是同一個人。

數字信號與系統,為了理解抗鋸齒(我可以說抗別名嗎),很有意思,大部分能看懂,知道傅立葉變換大概怎麼回事,沒有做練習,想再看一遍。離散數學是為了看演算法導論,但是後面的圖部分都跳過了,這是本寫的很好的書,有時間想再看。最下面這本圖形學的書又愛又恨,難度起伏不定,後面好些東西超綱,數學需要加強(高數之後不知道應該看哪些數學方面的基礎知識,微分幾何?還是那些拓撲結構?還是signalsystem里那種詭異的singularity functions)……rtr3索引的文獻太多,有些總結性的東西沒有看懂(rtr3最後說的,track down the original sources,我還沒有做,還是時間時間時間的問題)。

這些是今年除了pbrt3剩下的想看的書。

還有幾本書在宿舍沒有拍,包括一套費恩曼物理學講義和一些cpp,Erlang什麼的,費恩曼物理學講義只看了第一冊,記了幾個公式,本來很想看看量子物理部分,但是估計看不懂,信心不足,而且就算是基於物理的渲染,估計很多年也到不了模擬量子物理的程度。

現在問題來了,在沒有進入計算機圖形學這個大坑之前我沒有想到會這麼難,需要這麼多背景知識(數學、物理,我就不說什麼視覺心理學眼球的cone rod了),我以為會一點cpp就夠了,所以我一個基礎不太好的本科生搞這個有前途嗎?後面我應該加強基礎比如數學和物理,還是加強應用方面?後面我應該如何分配時間更好,我知道我可能應該挑幾本精通一下比如superbible,rtr3,pbrt,但是有些新書又很想看,比如gpu zen和rtr4,我怎麼才能夠跟上腳步呢(rtr3說的keep abreast of the field,我感覺好難)?這個行業真的需要那麼強的天賦嗎?繼續努力還有希望嗎?我覺得我以前的編程能力是野路子,現在的理論也是野路子,正常流程我覺得應該是數學-物理-信號與系統-演算法-cpp-圖形學-各類API-rtr3類技術總結性的書-引擎架構-各種gpu or shader pro類以跟上腳步,但是我完全沒有按照這個流程。


葉大神已經關注你的問題,但沒有回答。

無論是圖形學還是C++都是深坑,一旦進入,沒有十幾年的時間,是不會成為專家的。你存在的問題是:你的數學基礎還不足你讓能夠完全看懂圖形學那些書,你的項目經驗還不足你讓能夠體會C++中那些要義,但書你已經買了很多,眉毛鬍子一把抓地讀了很多,當你讀不懂的時候,你就應該意識到你的學習方式方法有待商榷了。

另外,我想問你:題主,你買那麼多書做什麼,你又不打算做學術研究,最關鍵的是還看不懂……買書只是形式,你已經陷入形式主義了,我覺得你已經陷入一種誤區,即把買書等同於學習本身了。其實上不是,學習或一項技能的習得其實是一個要漫長很多的過程,本質上是在你的大腦內部長出新的神經突觸,那些神經連接及神經網路構建的過程,是一個很漫長的過程,就像樹木的成長一樣,需要十幾年甚至二十幾年,常說「十年樹木,百年樹人」,就是這個道理,不能拔苗助長。關鍵是要動手寫代碼,以項目驅動,以需求驅動,只有這樣才能形成正反饋。要明確自己的目標,然後把大的目標分割成無數個可以執行的小目標,divide and conquer,先把小目標一個個解決掉,最後大目標也就實現了。

我給你3條建議:

1.心裡有個目標,有目標後直接上手寫代碼,實在不行就在Youtube上看視頻學習。

我推薦的幾個Youtube頻道:

a.Handmade Hero頻道,Handmade hero項目的目的就是教你一步一步開發一個2.5D遊戲引擎的,裡面有你想要學習的3d渲染部分知識。

https://www.youtube.com/user/handmadeheroarchive

最新一期是教你寫一個光線追蹤器

b. 遊戲引擎編程

https://www.youtube.com/watch?v=AAFkdrP1CHQlist=PLmV5I2fxaiCI9IAdFmGChKbIbenqRMi6Z

兩個頻道的主人分別是Casey Muratori和Jonathan Blow(Jonathan Blow是《時空幻境》及《見證者》的開發者策劃,可謂「獨立遊戲第一人」,獨立遊戲正是從他的《時空幻境》開始進入大眾視野的),他們兩個人都是有將近40年編程經驗的人,從他們身上學到的都是乾貨

c.學習DirectX或OpenGL/OpenglES

網上有大把的視頻,我不貼鏈接了。


2.前期研究cocos2dx/Orge3D,後期可研究Unreal/Unity,或者直接研究Unity或Unreal渲染相關的模塊,這樣你就有了目標,哪裡不會學習哪裡,就不會迷茫;


3.關注我的專欄 (偷笑

自製遊戲引擎


謝邀。題主的書看的不錯,我也很喜歡看書。

從事遊戲開發已經13年了,也做過很多年渲染和優化相關的工作,負責過軒轅傳奇絕大部分Shader的編寫和維護,底層架構的開發和優化。是的圖形學是個大坑可以學一輩子。。。

每個人的發展方向都不一樣,但我覺得只要熱愛遊戲熱愛編程朝著一個目標不斷努力總會做出點什麼。對於怎麼發展我也有些迷茫並不是順風順水,所以這裡簡單介紹一下我的經歷。

湊巧的是我入門圖形學也是看了3D遊戲編程大師這本書。和樓主類似,大學專業玩遊戲沒學到什麼東西,畢業之後因為喜歡遊戲就進了遊戲公司主要做一些邏輯開發,鍛煉了基本的編程知識,因為認真肯干評價還不錯但對圖形學完全不了解。

當時一直覺得圖形學和我是兩個世界,但是因為看了domo啟示錄對渲染和引擎產生了濃厚的興趣,也沒有人指引所以隨便抓了一本3D遊戲編程大師就看了起來。看第一遍的時候還不是很懂。但當時工作比較輕鬆,就看了第二遍,而且照著書寫邊看,說到底圖形學就是一堆數學。這一遍看完基本對渲染的原理有了比較深入的了解,並且也實現了一個軟體光柵化的圖形引擎。我感覺這本書就像九陰真經九陽真經,是內功,學了這本書之後我還是不了解OpenGL和DX的API,還是沒寫過Shader。但是在後續的開發過程中我知道了模型和貼圖是怎麼渲染到屏幕上變成一個個像素的,知道了整個渲染管線的各個階段,知道了頂點和像素是怎麼處理的,在後續的開發中就比一般人看的遠了解的深。

這時候剛好又有一家網遊公司挖人,也因為我的軟體光柵化引擎就順利跳槽開始做一些優化和渲染相關的工作了,雖然當時的項目還是固定管線的。再積累了一段時間以後,剛好騰訊一個MMORPG項目招圖形學相關的人員就去了。。。雖然當時我沒寫過shader,但是因為對渲染關係比較了解,很快就熟悉並上手了,並且在後面將近5的開發中負責了絕大部分Shader的編寫和維護,重寫了Gamebryo的渲染底層,使用Ubershader管理生成shader。重新實現了高光,反射,軟陰影,景深,後期處理描邊,投影貼花,動態模糊,AO,ligtmap等等。另外也做了大量的優化工作,做到當時幾萬種設備能同屏300人戰鬥不卡,因為是一款目標二三線用戶的網遊優化相對更重要一些。這個階段對渲染還是非常狂熱的。

但隨著遊戲上線也就面臨了一些選擇,是繼續朝渲染引擎方向發展還是朝著產品和遊戲開發本身發展呢?渲染是一門非常龐大的學科引擎開發就更不用說了,如果選擇渲染和引擎的方向勢必花費非常多的時間和精力,很難參與到遊戲開發中來。我做渲染和優化這麼多年,很多美術策劃同事都不熟,很多人也不知道我具體幹了些什麼,感覺非常獨立。這個選擇我覺得就像程序發展上選擇是專家還是全棧一樣,要麼朝著渲染和引擎方向一直鑽研,要麼就在渲染和優化能力達到一定程度之後去研究遊戲開發其他各個方面的知識,朝全棧的方向發展。

對我而言促使我進入遊戲行業並不斷努力至今的還是源自對遊戲的熱愛,雖然入門晚也不是天才,但因為喜歡所以付出更多的時間和精力走到現在。所以考慮了很久之後還是選擇更偏向遊戲開發,也去學了更多其他方面的知識,遊戲邏輯。AI,物理,UI,伺服器等各個模塊都有做過,管理和溝通上也在不斷學習。這是我選擇的方向。

不過個人感覺再好的技術也是呈現在產品之上的,所以不管是繼續深入學習渲染還是忘遊戲開發方向努力,還是要找對方向努力開發一款成功的產品。


學而不思則罔,思而不學則殆。

一,3d引擎是一個工程與數學相互妥協的藝術結晶;

1.1 工程要堆代碼的

僅在windows上一個實現一個簡單的d3d demo就上千行的代碼,任何一個狀態的設置問題都有可能渲染錯誤,需要工程的思想與代碼的水平,便引發下面的填坑技能:

C++的坑,C++11的坑;C++調試的坑,圖形調試的坑,VS,renderdoc,nsight的坑。多線程的坑,dll的坑; (不展開)

字元串的坑,有幾個人知道,char,TChar, unicode, uft8,utf-16,UCS2,utf-32, gb2312,這些編碼規則之間的聯繫與區別;

編譯的坑,鏈接器的坑;每次編譯工程要3個小時,習慣了就好。

這些需要基本的功力,需要自己親自動手去寫的,需要時間的,不是一兩本書就可能學會的。 (問題是沒有書講這個)

1.2 數學:

1.2.1最簡單的: 圖形學最基本的數學類型,float,這個大家都用過吧,但是IEEE-754的標準有多少人研究過,正負位,對數位,有效位,為什麼(16,777,219.0f &>= 16,777,221.0f),這些坑要爬過才能說是了解最基本的數學。

1.2.2圖形學的坑,

1.2.2.1 簡單測試模型總得會做吧

不可能是個模型都從網上下吧,也不可能是個模型都讓美術去做(分裂頂點的測試用例,UV鏡像的測試用例,多個骨骼影響頂點的用例),3ds max, Maya的基本操作要會,做個帶骨骼的小人會跑動應該會的。

1.2.2.2 材質總得會製作

基本的ps操作應該會,通道要熟悉,格式類型要熟悉,更不用說DDS,BC,DXT,ETC,AST的格式了,BC一共7個系,帶不帶alpha,哪個用來壓diffuse,哪個用來壓normal,哪個用來壓mask,這個要知道,加壓演算法是什麼,這個也要知道。

1.2.2.3 模型總得會導入

fbx的文檔要讀很多遍,FbxNode的11個變換矩陣每個是什麼含義要了解,頂點,法線,光滑組,uv,材質,骨骼導入,蒙皮,morph,這些導入要會寫,否則連模型都沒有更不用談圖形學了。然後是對模型的處理,根據光滑組,材質分mesh,算normal,算Tangent,等等。 SpeedTree的一堆,AbcModel的一堆,加起來所有光模型導入的代碼UE就2W行,沒這2W行的代碼,導進去的模型(特別是tangent)都不一定是對的,談什麼渲染。

1.2.2.4 Tangent

渲染的核心在於Tangent,因為光照需要Tangent。但是這個Tangent怎麼算為什麼要這麼算,為什麼ue,u3d,vray,xNormal, hoduni等都用業界標準演算法Mikkt? 估計題主看完PBRT都不知道Geometry那章里,mesh shape里有很精確關於Tangent的定義,這是我見到過的最精確的Tanget空間的定義,參數化表面方程可以解決很多問題。不知道題主注意了沒。說到Tangent就會說到BumpMap中的NormalMap,NormalMap與模型是depenent的而不是隨手拿一個擾動下是個意思,自己寫代碼烘焙一個NormalMap就知道了,首先要保證低模的Tangent空間與渲染的目標Tangent空間一致。這就是UE文檔中寫到要用XNormal來烘NormalMap,因為XNormal用的是Mikkt演算法,UE用的也是Mikkt演算法,保證能還原出烘NormalMap的當時的Tangent。

1.2.2.5 動畫

動畫最基本的就是旋轉了,有矩陣,四元數與歐拉角。矩陣,四元數是個標準旋轉量,應該都知道。那骨骼動畫曲線中一般存的是歐拉角(fbx),那麼問題來了,歐拉角(Euler Angle)有6種軸序,2種表示方法:內旋外旋,Maya默認的軸序,3ds max默認的軸序,自己引擎的軸序,弄不明白這個連旋轉都不對,就不要談動畫了,因為導進去就不動,動作肯定有問題。

1.2.2.6 Render

1.2.2.6.1 Rasteration

1.2.2.6.1.1 Forward Deffer Forward+ TilledDeffer 基礎知識

1.2.2.6.1.2 ProjectionMatrix

1.2.2.6.1.2.1 透視投影矯正,這個要知道吧

1.2.2.6.1.2.2 解決Z-bias,使用Reverse Z的投影矩陣要會算吧

1.2.2.6.1.3 Transparent. 半透明混合公式,一般都是從後向前渲,從前向後渲怎麼設。

1.2.2.6.1.4 Rasteration里的黑科技,為什麼要這樣子算,公式優化,等等,不展開。。源頭都是Raytrace.

1.2.2.6.1.5 只用DrawPix實現一個軟體光柵話,基本上Rasteration就沒問題了,剩下的就是去抄Shader,就是個體力活。

1.2.2.6.2 Raytrace

1.2.2.6.2.1 BVH,Octree,KD-Tree自己手擼一個,擼一遍就知道自己哪裡沒理解了。

1.2.2.6.2.2 RayTrace剩下的細節(我也沒看懂,就實現了個簡單的,不會就是不會);

二 怎麼做

按照下圖一步一個腳印的寫一遍,寫不了找UE抄一遍

Cite from GameEngineArchitechure

就會了,很簡單。

紙上學來終覺淺,絕知此事要躬行!!共勉


感覺LZ的經歷跟我有些類似吧,垃圾的二本院校計算機專業,大學遇到的教C++的老師是那種連effect C++都沒有聽說過的人。大學也是渾渾噩噩玩了4年遊戲吧,代碼估計1000行都沒寫過。

09年畢業後來深圳,靠著對遊戲的熱情,以及唯一的一點 C++ primer 的知識,艱難的找了份月薪1.5K的工作開始做起(你沒看錯,就是1500RMB,我居然存活了下來。。),在一家棋牌公司做客戶端程序開發,寫棋牌邏輯。

幾個月後,慢慢的了解遊戲客戶端需要哪些技術,慢慢知道遊戲引擎是什麼,圖形渲染引擎是什麼。那個時候坐在我旁邊的正好是公司內唯一一個懂DirectX的,負責公司的2D圖形引擎的工程師。而且無意中得知他的工資是8k一個月。從那時候起,我就告訴自己我以後也要學圖形學,也要賺錢。

(省略大量篇幅,期間經歷過各自艱難困苦,走了很多彎路,現在其實也並沒有從事圖形引擎的開發工作。)

從畢業到現在,不知不覺已經過去8年時間了。我也在14年的時候進到BAT了。

給LZ一些建議吧,首先你要弄清楚你到底想要做什麼?學圖形學的目的是什麼,是想挑戰自己的智力覺得別人能做的自己也能做?是覺得做圖形學的人NB,能賺錢?還是因為對圖形學技術發自內心的熱愛?

1、 如果是因為不服氣,覺得自己也能有朝一日能跟那些大牛平起平坐,如果是這種想法,我覺得沒有必要堅持了,有些人已經跟你有了很大的差距了,你在努力,別人也在努力,無論怎麼樣,你都不可能追上了。你要坦然接受自己已經掉隊出局這個事實。

2、如果是賺錢(我剛畢業時也是這種想法),其實也沒必要了,能不能賺錢是跟你所在的公司,所在的項目團隊相關的,而且國內這個現狀,有很多遊戲基本上都用不到很牛逼的圖形學技術,即使是很賺錢的項目。你看騰訊的很多cocos2d-x的手游,技術含量其實都比較一般,但仍然有很賺錢的。

3、如果是真的真的喜歡圖形學,那就不需要問什麼了,自己堅持下去就行了,能學成什麼樣就怎麼樣吧,保持平常心吧。

不過我還是建議樓主先把基礎打牢吧,《深入理解計算機系統》《C++ Primer》 《Effect C++》《深入探索C++對象模型》《Stl源碼剖析》把這些東西都弄懂弄透徹吧,如果這些東西都掌握好了,然後把基本的數據結構和經典演算法比如排序、遞歸之類的都搞清楚,隨手就能寫出來,然後最好也能了解一些基礎的網路知識,tcp/ip協議。基本上你把這些知識都掌握了,國內99%遊戲公司你都是可以無壓力進去的。現階段還是爭取能進一個正規一些的,技術氛圍好的公司吧,這樣提升的更快,比如很多小公司的程序員只知道最基本的程序斷點,連條件斷點和內存斷點都沒聽說過,調試能力是一個很重要的技能,我敢說大部分的程序員大部分的時間都是在解決各種bug,不會這樣技能,工作效率怎麼提升,加入一個好的團隊是非常關鍵的。

從你的書單上看,好像很少有軟體工程相關的書籍,可能你還沒有這方面的意識,這是很多野路子程序員的通病。軟體工程有很多好書,《代碼大全》《重構》《敏捷軟體開發》《設計模式》,尤其是《代碼大全》非常適合半路出家的程序員,一定要看的,不過最關鍵的還是要多寫代碼,多思考。

最後,既然是一個圖形渲染相關的帖子,我也說一下圖形學相關的東西吧。樓主看的那些書都是一些很前沿的圖形技術書籍,很多都是關於全局光照技術的,知乎秦春林目前在寫一本全局光照的書籍,《全局光照技術:從離線到實時渲染》眾籌推廣!,應該是你想要的書。其實圖形學這麼多年了,根本的東西變化的很少,就像你看的real time rendering,現在也只是第3版,而且也是很多年前出的,之所以過去這麼多年了,還沒有第4版出來,也是因為這個原因,實時圖形學領域並沒有什麼本質性的變化。只要你抓住其中的本質,根本性的內容,已經足夠讓你發揮了。

《Fundamentals of computer graphics 》(4th)是圖形學入門基礎盡量看一遍吧,《rtr》《pbrt》這兩本書必然是要反覆看的,其它的什麼GPU Gems我倒覺得暫時沒什麼必要去看了,但是更重要的是,自己也要多寫多練。寫一個光柵化的軟渲染器(可以參考知乎韋易笑大神的開源軟渲mini3d),寫一個光線追蹤的渲染器(可以參考miloyip大神的blog中javescript玩轉圖形學系列),這兩個東西你動手搞一遍了,基本上就對3D渲染入門了,再看什麼opengl、directx之類的東西有如神助。全局光照的技術我覺的是最複雜的,如果你不懂pbrt,你很難搞清楚實時渲染中,各種技術名詞和概念,很多實時技術其實都是hack,圖形學到後面,基本上就是數學物理的東西。

理論知識學的差不多了就可以開始看看一些開源引擎代碼了,或者自己寫引擎了。引擎方面的書籍就參考milo翻譯的《遊戲引擎架構》,這本書應該算是比較入門級的了,如果看不懂說明自己的水平還是比較初級吧,c++、軟體工程和圖形學的基礎還沒有打好。代碼方面,3d開源引擎比如OGRE,個人覺得是挺不錯的,可以從這個起手開始學。等你真正有一定水平了,klayge必然是不能錯過的。

最後推薦一個比較好的圖形學網站:http://www.scratchapixel.com/

保持平常心,不要心浮氣躁,沉下心來,每天進步一點點。總有一天,你會發現越過高山,眼前是一片新的風景。


PSO: 減少狀態切換,減少DRIVER CPU 開銷。比如 DX9 只能一個 RENDER STATE 一個 RENDER STATE 設置,DX11 把一些 RENDER STATE 綁在一起了比如 DepthStencilState,以提高CPU效率。DX12 你可以理解為捆綁的更多了,同時可以存在硬碟上。

ABuffer: PPLL 的OIT 吧。還是要排序的,在 shader 里排的。TressFX 就用這個,不過現在畫頭髮用 dithered transparency + TXAA 是效率最高的。

Tessellation: 現在其實很常用了,地形,物件(岩石,牆),NVIDIA 的毛。

Deferred shading:最主流了。但是現在主機上帶寬的增長不如 GPU ALU 增長的大,而且現在動不動 4K。所以帶寬壓力大的情況下很多遊戲都選擇 F+,尤其是標配 60 FPS 的遊戲。

GPU 上的內存、寄存器和 GPU 架構有關,AMD 的 GCN 架構現在是主流。你可以看看 Optimizing GPU occupancy and resource usage with large thread groups - GPUOpen。基於GCN優化的文章可以 GOOGLE 找一下。

離線渲染為什麼和彙編語言有關係?

主機新的一些特性以後會在 DX12,SM 6.0 里有。

PBR 你看到那些 sampling 去了。。。走學術派可以去折騰,走工程的你看看 EPIC 的那個 real shading in UE4 里關於重要性採樣的就可以了,以及Dithering in games – mini series。

procedural terrain 現在做工程基本都是授權第三方工具,自己造輪子的很少。自己引擎上要實現的是 mesh 怎麼渲染,材質如果有效渲染(virtual texture 是效率最高的)。

GPU ZEN 就是 GPU PRO 系列,現在改發行方式了所以便宜了。不過GPU PRO 系列裡面的文章魚龍混雜。比較實用的還是 GDC 尤其是 SIGGRAPH 里的一些 presentation。

伺服器不懂,不過好像 NVIDIA 就是提供大型計算機並行計算的供應商之一?

BINDLESS RESOURCE 如果普及開來會很好用,很多 GPU PIPELINE 的東西都會普及運用開來,比如結合 DrawIndexedIndirect 搞一些高效渲染。

3D 渲染程序員發展建議:

如果想跟進實時渲染髮展趨勢,並且想努力應用在產品中,那麼:1. 學英文;2. 出國留學(現在國內的經濟條件也不用洗盤子了吧);3. 留下來工作。在國內應用程度有限,同時周圍能交流的環境也少。

如果還是想實際點,解決近期經濟問題,更多關心項目流水,那麼不建議折騰圖形學。了解商業引擎架構,知道優化引擎執行效率,同時了解聯網技術,AI,工具製作等,在國內會更吃香。國內渲染主要靠商業引擎自帶特性和美術技巧,對渲染程序的需求很大程度上僅停留在 TA 階段。


利用這些知識,去找一份大廠的引擎開發的工作吧。


這些書你要是都看懂了,我覺得你不應該再覺得計算機圖形學那麼難,都看懂了的話,有這些基礎引擎你已經入門了。3d遊戲編程大師技巧和pbr你自己照著實現一遍,我覺得對於遊戲引擎,你應該有足夠多的感受了。

剩下的,你就需要遞一份簡歷,申請去公司的引擎組做開發,實戰永遠是最重要的。


作為一條圖形學采狗,我都沒錢買書的。

首先第一個問題,開發3d客戶端需要些什麼技術,基本上普通的api(中國網遊dx9)會用就行,基礎的演算法懂幾個就好。有需求再看對應的書本結合就行,另外開源引擎這麼多,隨便參考一下就行了。老實說,渲染這一塊在開發比例中佔得並不多,也許優化挺耗時間的。圖形學這個詞本身就概括了這個技術,圖和形。

看理論太多,就用unity多寫點代碼就好了。

至於成為大牛 不懂……

另外,作為一名自研遊戲引擎部門的菜狗,我已經很久沒開發過圖相關的東西了。


看到樓主看的書,彷彿看到了當年的自己。基礎理論知識應該差不多了,可以研究下unreal和cryengine的渲染流程,同時把實現一些基礎效果作為目標,試著實現一個renderer demo,你會發現坑非常多。

比如mesh,terrain,然後你發現物件多了以後,地形大了以後機器就跑不動了,這個時候基本的lod和場景剔除就是你要考慮了,物件多了以後如何合理高效的處理不通的材質也是你要考慮的,light多了以後你就要考慮是否把渲染流程改成deferred的了,但引入dferred以後你又會發現靈活處理各種材質又非常複雜了。當你費了牛勁把water,sky,植被這些放入場景以後,又費了牛勁使用多層shadow map加各種模糊演算法勉強搞定了狗牙以後,你會發現為啥畫面比cryengine還是差的那麼遠,這時候就需要考慮postprocess。這時候首先映入你眼帘的估計是hdr,可惜你又費了牛勁移植dx sdk hdr demo的演算法發現這玩意根本不能用,因為這裡面的tonemap 只是教學用的,根本不實用,然後你又各種找,這個時候你竟然發現了頑皮狗在 神秘海域2就已經實現了filmic tonemap,結果你如獲至寶把這一系列神奇的abcdef代入了自己的公式,哇,畫面突然變的神奇了。。。然後繼續體驗ssao,dof,color gradeing,god ray等等的各種坑。。

現在願意研究渲染本身的人已經不多了,遇到過許多連投影是怎麼回事,除w以後x y z取值範圍都搞不懂的所謂3d圖形程序員。

所以,加油吧,最後強烈推薦一個輕量級但是極其適合閱讀和學習的引擎unigine


同題主一樣是一個仰望圖形學聖杯的人,想說說自己的見解(僅僅是見解):

首先我覺得圖形學難以進階的直接原因是實踐機會的稀缺,而導致這一結果的又是因為市場以及圖形學動力之一的遊戲渲染引擎在工程上的龐雜因而難以被個人掌握。

要想解決這個問題無非兩種選擇,要麼找到實打實的工作機會,要麼自己倒騰。

自己倒騰的會遇到的問題是容易失控而且時間長了容易爛尾,原因還是因為工程上的龐雜,一個小細節可能導致阻塞,加上時間精力的分散很容易就爛尾了。

所以還是需要拆分任務,逐個擊破:我傾向於剝離工程問題和理論問題。所謂工程問題我指的是引擎架構,這個需要找成熟的引擎來拆解剖析,這是大方向的東西需要先做。架構理解之後在應用一些渲染理論,這時候應該聽從大V們的建議從寫渲染器開始。


題主你問的這些問題,在知乎上能回答你的我估計一隻手就數的過來。而且很多都是公司機密,我們簽了NDA的,不能亂說。

你需要的不是知乎,而是想辦法跳槽去一家做3A遊戲的公司。平台決定了你的高度。


看到題主說有點想放棄了,同為行外人,圖形初心者,野路子選手,同樣周圍沒什麼人可以聊這些,一樣掙扎著想要入坑的人來鼓勵一下題主,順便講一下我個人踩過的坑,如果能幫到題主就更好了。

其實就我個人所見,壁壘稍微高一些的東西,自學的話很容易陷入到這種「讀了很多書,依舊寫不來代碼」的情況的,這很正常的,不單是圖形,編譯、AI這些都一樣。所以題主大可不必過於苛求自己搞懂全部理論的東西再去上手擼碼,但基本認識還是要有的,我覺得題主在這點上是比不少人強的,所以請放寬心。

然後就是實踐的問題,圖形這塊不像編譯原理跟OS那樣,有眾多公開的比較詳盡的course projects作為引導,實時渲染方面的尤其缺。我目前只看到過Game Institute給過一個詳細的Game Engine的教程,圖形理論到實踐手把手,但年代比較久遠,使用的還是DX9的固定管線;再有就是Upenn的課程CIS 565,這個就比較前沿,但沒那麼工程化;然後就是各類業界的分享文章與文集了,這個可以作為自己實踐時候的文獻參考,如果涉及到simulation,那麼有很大可能還要讀論文。另外扒CNKI也是一個好方式,大部分CNKI上的碩士論文基本都是有很明確的應用目標的。因此如果實在不知道怎麼下刀,可以扒CNKI,而且論文的索引文獻也是不錯的參考資料。再有就是大廠的培訓內容了,知乎上多少都有一點,也可以作為初心者階段的參考的。

至於我個人踩過的坑么,rasterizer是一定要擼一遍的,不管是full-screen的還是tile-based的,這個東西在知乎有不少相關話題,擼完收益可觀;離線渲染的理論也是一定要看的,我個人以為某種程度上實時渲染就是離線渲染的一種trick,所以不能舍本,至少物理模型一定要搞明白;至於引擎方面,我看到有大佬推薦去讀UE4的源碼,但引擎涉及面太廣,而且有不少代碼生成的東西,沒有足夠的經驗直接上手難度頗大(不過話說回來,事在人為沒有暴力剛不過去的),因此我的辦法是先在Github上找一些結構比較清晰的,小一點的個人項目,然後抄、改、換種語言仿寫...反正怎麼著都行,把rendering path過一遍,看看那些個曾經出現在官方示例裡面的例子是怎麼集成到一起的(一般情況下,這些都會包含題主提到的deferred rendering,還有包含tiled deferred/forward+的),抄到不懂的就查資料。至於項目怎麼找,可以去油管上搜視頻點下面作者給出的鏈接,也可以去Git上自己搜。這一步以後么...應該是看情況,重複幾遍,反正最終是要自己弄一個包含主流特性、相對完整的渲染器出來,完了之後可以查一查代碼生成的相關資料,自己寫材質編輯器(其實這個可以單獨搞,懂點編譯相關的東西然後去做一個簡單的不會太難),最後再去看UE4的代碼。至於平台優化那一塊,我覺得只有到了實際的工作中才會真正接觸到,而且有些東西也確實是有技術壁壘的,但是還是一樣,概念得有。

以我當前弱雞的程度,也只能看到這裡了,上面的說那些我自己也在實踐中(正在「抄」代碼),至少目前它們對我個人而言是有效的。從題主的描述中能感覺到題主對圖形是出於真愛,所以還請對自己多自信一些,不必妄自菲薄。另外,國內做 3D 渲染和遊戲引擎的碼農們都在哪裡獲取技術信息 以及 像我這種情況,該如何繼續學習遊戲中實時渲染這方面知識? 下一眾大佬的回答應該也能解答題主的一些困惑。

嗯……其實就是一個字「搞」,當然最後想要搞點名堂出來還是得入行。坑自然是大坑,況且這個坑還很有可能是一見誤終生那種坑,不過作為一人吃飽的光桿,我的壓力比題主要小很多。終究還是生活第一,這個就請題主自己考慮了。

共勉。


哈哈,因為一個學弟的回答,打開了這個問答。

為了回答學弟的問題,把樓主的問題看完了。。說實話,真的是好幾次要看走神。

那麼多那麼多那麼多書,方向,專業。閉門看書,沒個3到5年,看不完吧。。而且八成看了就忘吧。等看完後忘了咋辦,又出新的了咋辦,看不懂就跳過么。。那還看個啥。。。

說實話,這些書上學的時候都看過,但是也說實話,大部分都忘完了。

我屬於看書看的慢的,平均半年以上才能看完一本。

畢業後進入手機GPU公司,前兩年就看了四本書。opengl es2.0 spec,glsl 1.0 spec,egl 1.4 spec,opengl es 3.0 spec。

但是這四本書我都可以背下來了,英文的全部翻譯成中文了,裡面每個api都被我寫成app了,各種用法快寫爛了。

畢業第三年用這些知識把cocos引擎源碼的核心模塊看完了。

畢業第四年開始我就進入遊戲公司了,然後看了一本unity shader的書(算是補充一下圖形學上層演算法,在手機GPU公司,鬼知道什麼是bloom。。)。遊戲引擎架構這本書我看了一半後停止了,以我當時的水平看,其實意義不大。目前看來最起碼還要1年後我才能重讀這本書。。

所以,找一個方向,認真認真認認真真看一個系列的書,別的書用到的時候翻翻就行了。


紙上得來終覺淺,絕知此事要躬行


我和題主很像,本職是個特效師,新人影視遊戲特效都做,一年多經驗吧,比較熟悉Houdini c4d和u3d ue4還有一些主流的合成軟體,現在辭職半年多學習編程和一些相關軟體的新技術,也做一些外包,圖形大坑暫時不敢入,主要還是致力於製作方面,很多原來不敢想像的效果shader 已經越來越多的實現在遊戲中,做特效也清楚影視和遊戲特效各自的製作途徑和優缺點,只能說遊戲特效和影視特效的差距正在快速縮小,影視特效的優勢只有精度一種了,現在影視能實現的遊戲中也能無縫對接,只區別於資源消耗上,而遊戲特效製作思路比影視靈活太多,且用戶終端至多是電腦屏幕非影院銀幕寬度,所以在電腦屏幕呈現影視級別精度的特效是可以實現的,這一兩年也有很多遊戲做到了。有別於國內的特效行業,國內遊戲特效製作大多以巧妙疊加素材呈現效果為主,這自然也是遊戲特效的終極教條,資源少效果爆炸,但我覺得國內遊戲特效早晚主動或被動的要發生根本轉變,現在國內絕大多遊戲特效,十年前怎麼實現,現在也是怎麼實現,中國遊戲特效很強,人多設計思路也多,做出來的東西真的非常有感覺,但也架不住別人的飛機大炮,現在很多遊戲中實景效果不是手巧就能做的。

題主攻圖形我相信在將來的幾年會有作為的,為中國cg添磚加瓦,題主加油。


3d渲染程序員都不普通


書看的真不少,看你怎麼走了。我目前的狀況比你還尷尬,小公司主程,其實就是啥都干。建議走獨開,弄兩個作品,然後專心策劃。純剛技術太累,框架引擎圖形底層年年更新,內容是稀缺資源。


@Milo Yip 這位大神應該能回答你


我剛畢業幾個月,也是大學浪了。其實還是喜歡鑽研理論知識的,現在也是國慶窩在房子里學函數式編程。只能對你抱以支持和鼓勵了。你應該是理論學習上遇到瓶頸了,但是就像你說的,你可能太執拗了,太鑽研了。我覺得你還是先跳出來,理論學習先放一放,搞搞其他的,比如其他答主說的找工作。以退為進嘛。給自己個期限做個選擇吧。


能把題主列的這些書看完的,估計都沒有多少人。題主缺少實踐,自己動手寫些代碼,或者看一些開源的遊戲引擎,例如ue等等


推薦閱讀:

Hyperion渲染器的優勢是什麼?超能陸戰隊 ?
X Window渲染是在client還是server端完成的?
如何將真人照片ps成3d遊戲風格?
Adobe Reader 和 Acrobat 的字體渲染出現鋸齒是怎麼回事?

TAG:遊戲開發 | 3D | 遊戲引擎 | 渲染 | 計算機圖形學 |