當前位置: 華文星空 > 知識

零基礎如何學習電腦圖形學?

2016-03-17知識

就像其他答主說的一樣,我不建議上來就逮著一本Direct3D或OpenGL的書看到死。這些API只是圖形學的一部份。上來就看這種東西,把握不住輕重細節。這些API中的設計,有些東西是工業上的取舍,有些是歷史遺留問題,沒有重點的看,就是浪費時間。

大多數關註這個問題的程式設計師,其實主要是關註渲染方向(做遊戲)。(真去做simulation的研究生也不需要問這個問題。)

但還是要提一嘴,圖形學一般包含這幾個領域:幾何(Geometry),渲染(Rendering),仿真或模擬(Simulation)等等。

不要自我設限。

以下講的內容以渲染為主。

渲染按需求可以粗略分成即時渲染和離線渲染。即時渲染主要服務於遊戲等即時互動套用,離線渲染服務於影視特效,3D動畫。

即時渲染使用光柵化(Rasterization)方法,離線渲染使用光線追蹤(Raytracing)和光子對映(Photon Mapping)方法。不過這兩年在nVidia的努力下,即時渲染也開始用光線追蹤了。

——————

入門

我建議剛開始不要關註圖形API和GPU,只專註原理,只考慮用CPU渲染 ,GPU和API能幹的事情,CPU都能幹,只是速度慢。

1. @閆令琪 教授的圖形學入門課程GAMES101。

錄像在b站能搜到。

這個教程非常友好,中文,講解清晰。包含8次小作業和1次大作業。

大作業有十幾個選題,都有一定挑戰性,如果有時間,建議全部完成。

2. Fundamentals of Computer Graphics, Fourth Edition

圖形學名著,虎書,可以作為作為GAMES101的補充。

在這兩個教程的學習過程中,可以抱著兩個目標來學習:

  • 寫一個軟件光柵化渲染器 ,能正確渲染obj模型,Phong光照模型,有紋理,材質等功能,規模幾百到幾千行不等,具體取決於你想實作多少效果,能實作體渲染,環境光遮蔽等比較時髦的效果就更好了。
  • 寫一個軟件光線追蹤渲染器 ,能正確渲染obj模型,有紋理,材質等功能,有加速結構,能並列化。規模幾百到幾千行不等。
  • 建議用C/C++,因為軟件渲染本來就很慢了,你用其他更慢的語言是能渲染,但會很痛苦。

    而且,圖形學目前是離不開C++的。

    雖然說『不要隨意造輪子』,但我實在是想不到比造輪子更快更透徹去學習一個學科的方法了,更何況,圖形學的輪子,難度曲線較為平緩,可以先寫個幾百行的功能簡陋的渲染器看看效果,再慢慢追加其他功能。

    圍繞上面兩個目標,你就可以找資料了。

    軟件光柵化渲染器——tinyrenderer:

    國外一個大佬寫的幾百行的軟件光柵化渲染器,API模擬了OpenGL,主要目的在於理解OpenGL在後台幹了什麽。

    看看渲染效果:

    軟件光柵化渲染器——mini3d:

    @韋易笑 大佬寫的軟件渲染,程式碼整潔,中文註釋,適合自己拆著玩。

    軟件光線追蹤渲染器:

    這個系列非常棒,幾十頁PDF,幾百行C++就可以讓你寫一個光線追蹤渲染器,用最快最直觀的方式讓你感受『基於物理』(Physically-based)帶來的威力。

    即時渲染

    1. Real-Time Rendering, Fourth Edition

    圖形學名著,即時渲染第四版,18年出版,包含這幾年的即時光線追蹤章節。

    很多人說這本書只是圖形學一個目錄,因為這本一千頁厚的書,參照了2000多文獻。

    這個說法沒錯,但是這個說法容易給新手造成誤導,以為這本書很蜻蜓點水。

    其實,作為基礎和拓展視野來講,這本書非常完備,剛開始看這本書,不要管那些參照文獻,專註去看就完事了。

    2. @閆令琪 教授的高質素即時渲染課程GAMES202

    2021年3月13日開課。當然也可以看錄播。

    這門課結合上文rtr4一起學習是極好的。

    這個階段,如果有心想學習遊戲引擎,或具體的渲染管線。可以自己結合一種API,或者引擎。

    手工造一套渲染管線,並實作各種效果,各種陰影,PBR,SSAO,TAA,全域光照等等等等。

    這裏我依然不會推薦圖形API的教程,因為這是可以自己搜尋解決的。

    離線渲染

    1. PBR3,也就是【基於物理的渲染(第三版)】

    圖形學名著,作者詳細的講解了pbr材質,pbr相機模型,光線追蹤,雙向路徑追蹤,光子對映方法等等,可以說是面面俱到,而且,本書配套一個C++編寫的程式碼結構清晰的準工業級渲染器:

    規模大概在3萬行,結構清晰,在對整個專案的結構梳理清晰後,就可以選擇性的看了。

    展示一下pbrt-v3的渲染圖片:

    pbrt4今年要出版了,作者整合了對輝達OptiX的支持,可以用 GPU 加速了。

    pbrt-v4程式碼:

    如果想走學術道路的話,pbrt是一個很好的起點。圖形學的研究,不像AI有那麽多成熟的框架。一篇圖形學論文可能需要自己搭建大量的腳手架,寫上幾萬行C++不算離奇的。pbrt可以作為一個基礎渲染器,在其上實作自己需要的效果。

    2. mitsuba2渲染器

    非常強悍的開源渲染器,學術界常用。閆老師說它的正確性是可以放心的。我沒用過,只提一下。

    3. 全域光照演算法技術

    圖形學名著,Advanced Global Illumination的中文轉譯版。原書有點老,但是以數學方法為主,適合梳理原理。

    物理與模擬

    不是我了解的方向,但是最近有幾個非常不錯的課程/書籍。我覺得應該推薦一下。

    1. GAMES103: 基於物理的電腦動畫入門

    即將開始的物理模擬課程,主要是剛體物理,難度較低,適合用此課入門遊戲物理。

    2. @胡淵鳴 大佬的物理引擎課程:

    胡淵鳴是太極(taichi)程式語言的作者,這課也是以taichi講解的

    這個課有編程作業,幸運的同學可以獲得紀念品。

    課上完成作業拿到的紀念品
    taichi寫的raytracer

    這門課難度曲線比較陡峭,所以今年推出了太極圖形課。

    感興趣的可以了解下。

    3. 基於物理的建模與動畫

    譯者就是質素保證。

    想了解遊戲物理引擎原理的同學,這本書非常友好。

    4. box2d-lite

    box2d是一個非常流行的物理引擎,憤怒的小鳥,蠟筆物理學,地獄邊境等知名遊戲都是box2d實作的,box2d-lite是作者寫的一個簡易版本,幾百行C++,適合教學用。

    準確的說,box2d-lite是作者與GDC 2006展示的版本,是box2d早期版本。

    對了,關於遊戲用到的圖形學,有一系列文章,叫精粹(gems)。

    從上個世紀末開始,平均每年都會出一本。內容就是各個業界大牛寫的文章,按主題編纂的到一起,內容比較強調實踐,需要一定基礎。

    按時間順序大概有:

  • Graphic Gems 1-5
  • ShaderX 1-7
  • GPU Gems 1-3
  • GPU Pro 1-7
  • GPU Zen
  • Raytracing Gems
  • 建議按時間倒序看,最近的Raytracing Gems就很不錯,詳細講了DXR的實踐。

    太早的Graphic gems都是上個世紀的了,參考價值下降了很多。

    ——————

    數學

    有些人喜歡把圖形學妖魔化,動不動就說得好像不學個幾年數學根本不能去碰圖形學。

    其實以大部份人學圖形學的目的——以渲染為主,做工程做遊戲做套用,這樣數學的要求並不艱深。

    即使是大多數做圖形學研究的同學,在遇到數學短板時,也是隨用隨學。

    基礎的數學包含這四個:

  • 微積分。
  • 線性代數。
  • 概率論與統計。
  • 數值分析。
  • 另外,學習渲染還需要結合很多其他領域的知識,僅僅拘泥於圖形學本身,那就是自我設限。

    比如閆令琪老師有一篇論文就是模擬毛發髓質對光線透過時產生的影響。這項成果被用於【猩球崛起3】的毛發渲染。這意味著需要了解生物毛發的生理結構,才能搞清楚毛發對光產生的散射。

    在渲染中,常用到以下幾方面的其他領域知識。還是那句話,什麽都會涉及一點,可能不深,但不要自我設限。

  • 一點幾何光學。
  • 一點輻射度量學(Radiometry)。光照在場景中的傳輸以次為基礎計算。物理量是客觀,線性的。
  • 一點光度學(Photometry)。光輻射使人眼產生的總的目視刺激的度量,研究客觀的光輻射與主管視覺感受和心理感受的關系。(你可能看到過「Gamma校正「之類的名詞,它屬於這個領域)
  • 一點色度學(Colorimetry)。研究人的顏色規律、顏色測量理論與技術的科學。顏色是一種外界刺激產生的主觀反應。色彩空間,色彩模型,都是這個領域的概念。
  • 相關回答: