現階段應該怎麼學習計算機圖形學呢?
目前本人看完了《3D數學基礎》這本書,正在看《OpenGL 4.0 Shading Language CookBook》。
圖形學涉及的方方面面在後續都希望能夠學習一下。為了做 3D 動畫,希望從代碼的角度來學習圖形學。希望可以指導從入門到深入的學習方式,以及相關參考書籍。知乎關於本問題的答案是很久以前的了,之前就是參照那些答案來學習的。不知道現在的參考價值如何?
CG攻城獅一枚。隨便談談。
看了知乎上不少這一類問題的答案都是推薦去看OpenGL紅寶書,然後各種實時渲染演算法例如shadow map等,再就看是去看遊戲引擎相關的書籍了。其實我覺得這種方式有很大的問題。
理由1:大多數人學習圖形都最直觀的從渲染開始(畢竟OpenGL也是個渲染的API)。然而絕大多數實時渲染的演算法,都是一些trick,hack和cheat。所有遊戲都會針對自己遊戲的場景發明對自己效果好的hack,甚至乎一些常用的演算法例如SSAO,shadow map, cube map等,都是在GPU上實現這些效果的高效的方法,也可以說是hack。在沒有了解真正如何用數學和物理去表示和計算陰影和環境遮擋就去學習這些hack,顛倒了主次,也限制了你的思維。因為如果不是為了在GPU硬體上做快速的這些事情,會有更接近自然,更簡單,也更基於物理的辦法。
理由2:通過學習OpenGL / DirectX這些圖形API來學習圖形學,就好像是通過學習PhotoShop的使用來學習圖像處理一樣。比方說你學會了如何調整一個圖片的對比度,亮度等,但你卻不知道這些參數除了視覺反饋以外在圖像處理中具體的意義是什麼。一個三角形變成一個有顏色像素是經過一系列複雜的過程的,硬體幫你實現了這個過程,直接看API就只是學會了如何設置這個過程中某些步驟的參數,還是沒有明白這個過程到底是怎麼回事。再就是引擎相關的東西,絕對有必要學,但渲染佔一個引擎的分量並不大。所以就不再這說了。
所以我認為就應該先真正從渲染本身的數學和物理學起。學這些的途徑的一個好方法就是去實現一個光線追蹤渲染器,如果能實現一個基於Path tracing的全局光照,差不多你對用計算機繪製真實感圖片這個事情也就入門了。而這個演算法又異常簡單,基本就是純粹用代碼直觀的照抄Rendering equation, 演算法本身寫下來20-30行。這裡再轉一個99行代碼的基於Path tracing的光線追蹤程序smallpt: Global Illumination in 99 lines of C++。總之,實現簡單,能學到渲染背後的物理,而不用拘泥於其他人制定的和渲染本身沒關係的API,何樂而不為。
等你了解了如何去正確的非hack的計算光的傳遞(包括了所有陰影,AO,反射等),世界就開闊了。首先你可以繼續在光線追蹤的不歸路上走下去,有無數的坑可以去跳。演算法層面的,更加深入的學習全局光照,各種高效的採樣渲染方程的演算法,Bidirectional path tracing,Photon mapping,Markov chain Monte Carlo等許多。性能層面的:如何快速的實現光線和三角形的求交,還有各種加速結構,轉個cpu上的求交引擎Embree。再就是系統層面的,實現一套紋理系統,各種filter,實現可交互的progressive的渲染,場景的編輯,管理,還有材質系統。。無窮無盡的樂趣啊。題主說要搞動畫,應該是要走這個方向了,我推薦兩本書:Physically Based Rendering: From Theory to Implementation。要是能啃下來,你會學到很多,而且基本可以到開始做和rendering相關的research的能力。這一本要是一開始看的吃力,就先看:Realistic Ray Tracing, Second Edition。
當然除了光線追蹤,現在你在回來研究那些實時渲染的演算法也會更容易看清它們hack的本質。例如shadow map就只是shadow ray的逆向過程,精度還收到shadow map紋理解析度的限制。SSAO這種東西,就tmd是純hack- -。所以現在再學習使用API和寫shader就會更輕鬆。不過要真正了解這些API和圖形管線的本質,還是強烈建議自己實現完整的光柵化渲染器。寫一遍一個三角形如何變到屏幕上的像素這個過程會真正讓你了解這些API到底在幹什麼。關於這方面可以參照 如何開始用 C++ 寫一個光柵化渲染器? - Yong He 的回答 還有就是強烈推薦這個博客http://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/的文章。對我自己實現光珊化渲染器的時候起了不少幫助。學API的話其實DirectX的那些Sample是不錯的材料,也可以看看。
其實圖形學的另一個對動畫很重要的分支是simulation。這個方向大家討論的少一些,最常見的例子就是基於SPH的流體模擬,同樣的因為適合GPU並行,可以用在遊戲里,而且DirectX里有sample code。因為似乎很多人喜歡拿這個演算法入門,這裡想特地說一下,這個演算法就像所有之前的real time hack一樣,這個演算法本身也是hack,就算你實現了它你也不會明白流體是怎麼回事,因為所有的公式都沒有任何物理意義,連最最基本的Navie-Stokes方程 都沒有學到(真佩服作者怎麼試出來的)。所以不推薦拿它來學習。如果對流體有興趣,我推薦一個最基本的流體模擬程序和它的文檔,用有限差分求解NS方程的最簡單實現,Jos Stam: publications(點那個Real-Time Fluid Dynamics for Games)。如果有興趣深究,則可以去讀Fluid Simulation for Computer Graphics。 而去也不要一開始就一味的在gpu上實現,gpu上的編程比直接用軟體多了很多不必要的障礙,不適合學習物理這種基礎理論。而去gpu上要直接寫出比cpu快的精確模擬相當難。不要跟我提physx,那也有許多hack,不適合學習。當然,還有很多其他的物理模擬,就不再這說了。
希望對大家有幫助。
其實我不太想答這種問題,因為問題太個人,範圍太廣提供信息又太少。
我基本上同意 @Edward Liu和 @Yong He的一些觀點,但是兩人提及的「計算機圖形」還是比較窄一點,我稍作補充。
計算機圖形是用計算機合成(synthesize)圖形的一門學問,有時候也會包括圖像處理。
計算機圖形可細分成不同的範疇,包括數據採集、建模、渲染、動畫、輸出技術等。在每個範疇也涉及工具的使用設計問題。
不同人對計算機圖形的著重點不一樣,例如遊戲程序員可能偏重三維實時渲染、動畫;動畫及電影特效的圖形程序員可能偏動於離線的渲染及動畫;建築設計人員可能特別注重光照的真實性;圖形硬體工程師可能偏重於硬體架構、基於光柵化的管道。
現時計算機圖形比較流行的部分是基於物理的渲染、動畫模擬。但這並不是圖形學的一切,除了追求物理正確,也有非真實感渲染的方向。除了基於物理及生物力學的動畫模擬,也需要表情/動作捕足及動畫混合的動畫製作方式。在建模上,除了三角形網格和曲面細分的方式,也有體素、隱含曲面、點雲等建模方式。
對於這個學科,涉及這麼多不同的部分,我建議最好從本科的教科書/課程入門,首先對各個部分有初步的理解,然後才看更專門的書籍。在這個過程中,如果有心有力,可以嘗試按計算機圖形的發展來做各種實驗,例如如果對光柵化方向的渲染感興趣,可以考慮一下 如何開始用 C++ 寫一個光柵化渲染器? - Milo Yip 的回答。
我覺得初學者完全用基於物理的方法去學習是比較困難的,裡面也涉及一些物理以外的必要知識,例如怎樣從光譜映射至色彩,就是一個涉及色度學、認知心理學的問題。許多時候程序員的工作也不是要滿足物理上的正確性,而是要滿足美術人員在藝術上的要求。
我的 Milo的圖書豆列 收集分類了一些計算機圖形相關的書籍,但沒有全部評價(許多我沒有讀過)。可以在裡面找一些入門的,或者配合一些公開課去學習。然後再找合符自己感興趣的方向。
如果有再具體的問題再問吧,知乎這個版塊有不少行內人士。感謝如此多人邀請,我其實更想看看其他大牛們(如@空明流轉)的答案。
圖形學包含渲染、動畫和模擬三大主題(還有其他小主題)。
題主提到想做3D動畫,但這可以牽扯到所有主題。所以還是想知道題主的興趣點是在人物/角色動畫本身,還是在畫面渲染?題主對物理模擬(流體、剛體、布料)是否感興趣?
由於本人對動畫和物理模擬了解並不是很深,所以可能沒有什麼權威來回答如何學習這方面的知識。所以我從渲染開始講起。
渲染對數學的要求幾乎只有十分具體的微積分和線性代數。因此大部分人接觸圖形學從渲染開始學起是較為容易上手的(如果你不知道怎麼渲染圖像那就算你會物理模擬或者生成角色動畫也看不到對吧)。如何學習渲染技術呢?渲染又包括離線渲染和實時渲染。離線渲染就是從物理原理出發一步一步推導並且通過採樣來逼近積分,最終得到渲染結果。實時渲染則是對離線渲染中的方法進行各種不合理的近似和一堆hack,目的是為了讓GPU可以快速的生成圖像。
既然題主提到的是動畫,那麼我默認為題主指的應該是PIXAR做的那種動畫而不是遊戲裡面的動畫吧。所以這裡我就說說如何學習離線渲染。
學習離線渲染最好的方法就是寫光線追蹤渲染器了。光線追蹤的整一套理論基本沒有過時,5年前10年前提出的理論方法仍然是現在的主流。學習光線追蹤,一本Physically Based Rendering: From Theory to Implementation足矣。可以對著這本書,自己實現一個光線追蹤渲染器。這樣你就可以了解圖形學的很多基本概念,例如幾何構造、BVH、紋理過濾、光照的物理原理、路徑追蹤等。這樣一下就基本掃盲了。
然後題主提到了動畫。會寫光線追蹤你就可以渲染任何圖像了(只是性能問題而已),但要讓場景的物體和人物動起來又是一套知識體系。題主可以先寫一寫基本的頂點動畫和骨骼動畫。骨骼動畫有大量的博客文章可以參考。當你知道如何計算骨骼動畫之後,下一步就是了解如何產生逼真的骨骼動畫序列了。這裡會需要了解IK、Motion Capture和各種Controller的技術。
最後如果題主對物理模擬感興趣,不妨看一看ODE的論文http://image.diku.dk/kenny/download/erleben.05.thesis.pdf, 此文講解了所有你需要知道的關於剛體模擬的知識,並且你也可以參考Open Dynamics Engine的源代碼,以了解一個物理引擎的組成。當你學習了剛體模擬之後,就可以繼續學習流體模擬、布料模擬甚至看一看各種其他可形變非光滑物體模擬的paper了。
以上是我能想到的一些要點,歡迎各位批評指正。
第一次被師兄 @空明流轉 邀請來回答這個問題,誠惶誠恐。
再來說一下碰到的問題和走過的彎路。上面第一個童鞋說的不錯,從一套API開始學其實不是什麼好事,上來其實就學用API,找兩個範例開始改,其實這個算是劍宗套路。但是如今對於一個需要快速解決方案的時代,尤其是如今越來越多人投身如手游開發,需要在工期內給老闆看到東西,這個時候就不得不走捷徑迅速搞定。至於背後的原理,不知道,或者說知道個大概,往往也都能過得去,按時完工即可。再加上如今資料這麼發達,教程特別多,照葫蘆畫瓢也能搞定,而且還有東西給人看。這種劍宗的套路如今越來越顯著,而且也比較重要,畢竟現在人不需要學陰影圖的推導,沒幾個地方需要學光柵化的原理和實現,直接拿來用即可。遊戲等多媒體軟體應用的開發人員一般走這一條路,
如果樓主說的是「3D動畫」,就是離線渲染方面,倘若真心愛,還是分兩個套路,藝術和技術。目前看來在全球的CG離線行業,技術家懂技術的很少,搞技術懂藝術的很多,這也是為什麼在知乎上我之前的帖子,關於討論渲染器的,我直接放棄跟那些無聊的人較勁, 什麼GPU渲染,什麼支持VDB,說這些就跟討論上廁所便後用紙還是用水一樣的可笑。如果做這一行,真心還是建議從藝術視覺上入手,這個其實是非常簡單和直觀的,皮克斯的人寫的那本《Digital Lighting Composition》就是個很好的例子,以藝術家的眼光看技術手段如何搭配實現想要的結果。還有一個很重要的問題,技術出生的人往往眼光和視界非常狹隘,以為沒有外星科技許多東西就是搞不定,技術一定是先決條件。你再看去看看老的電影比如《星河戰隊》(Starship Troopers 1997),《星球大戰:幻影威脅》(Star Wars Episode I: The Phantom Menace 1999),那個年代渲染器連光線跟蹤都用不起,人家還不照樣能把片子做出來,即使放到今天,對比如今那麼多特效渣片,視覺上就是沒有缺陷和錯誤。再說個動畫系統,Weta Digital是全肌肉,僱傭好多藝術家刷肌肉,聽起來彷彿很屌很科幻,但是這個帶來的流程複雜和培訓難度直線上升,也就這些地方用得起。與之對比的是純粹從藝術眼光,就用Deformer來做,傳統手法,在有經驗的藝術家手裡效率比肌肉解算的能提高一倍效率不止,這不是吹牛逼,《火星公主》(John Carter 2012)就是這麼搞的,Rigging Supervisor是我朋友,閑聊的時候說到過這個問題。
至於說學圖形學想去電影工作室的,我只能說呵呵,一是學歷要求,想混個好職位沒Ph.d不可能,而且真心要有兩把刷子,最起碼發論文自己做東西吧,這一條路,非去美帝留學不可,整個星球上沒有第二個地方有這種機會和可能了,無論歐洲日本,CG的學術界和工業界的隔閡都是非常巨大的,一句話說,任憑你多屌,絲毫無用武之地,除非去做軟體,或者還是蹲學校做研究。其實在學校做研究反而比較好,生活穩妥,可以做自己喜歡的事情,如果是工作,這都是按照項目來的,要加班就得玩命,受罪。二來,很重要的原因,行業不景氣,整個特效行業都是每況愈下。當年Alias的第一份Maya教程視頻,人家賺了一百萬美元,如今呢,滿大街都是。別提皮克斯迪士尼,這些都是特例,人家自己就是托斯拉,控制從立項到發售,特供本土市場。你看迪士尼這幾年的片子多二逼,什麼《長發公主》(Tangle 2011),什麼《冰雪奇緣》(The Frozen 2013)但是人家就是能賺錢。一般的特效工作室只能做做電影的邊角,混口飯吃還是可以的,就是這樣,RH、DNG這些工作室也還是勉強維持。之前那個啥,德國的PIXMONDO,不就是直接倒閉么,北京辦公室就在國貿我會說嘛。
離線的技術已經基本上發展到頭,如今已經不是10年前了,如今的工具鏈極度的完備,建模、雕塑、貼圖、動畫、模擬。等你進了流程你就知道學術界這麼多年出了多少垃圾,Physical-based Rendering,到了今天有了多核心大內存的機器才真正的成為可能,以前是想都不敢想。但是已經解決了么?GPU渲染可用了么?如果我告訴你《霍比人》(Hobby)的原始場景,都還沒做過Subdivision,光多邊形數量已經爆了GPU顯存么,你還會覺得那是個可行的方案么。Physical-based Animation等等東西還是比較遙遠,最多用一個FEM Deformer做肌肉皮膚的形變,原因上面已經說了。做片子是藝術創作,不是工程模擬,你能模擬一個兩條腿的人,還能直接套用四條腿的蛤蟆嘛,或者是八條腿的異形嘛,當然不可能了,有且只有人肉。一個牛逼的動畫師,對於工作室來說可比你一個苦學10年的Ph.d有價值多了,為什麼?這個我就不回答了,說多了傷自尊,但是的確是這個行業的現實。流體模擬,這軟體都爛大街了,Houdini、Bifrost等等,當年都得自己折騰的,如今都有解決方案了。但是Ph.d的出路要比動畫師又廣多了,之前RH的幾個人,不都跳槽到Google和NVIDIA了么,混口飯吃還是沒問題的,不都是當碼農的命。
圖形學中的屌絲都是碼農屌絲中的戰鬥絲。為什麼這麼說,因為為了完成工作,所需要掌握的東西太多了,特別雜,編程語言什麼的就不提了,數學物理等等,都得掌握。但是同時短板也非常明顯,業務領域極度專業,比上不足比下有餘,不夠高層不夠底層,轉行極度困難。而且如今由於CG是CS學科中幾乎最開放資料最容易獲取的行業,門檻也是最低的。如今不是智障的,隨便找個Course都能搗鼓一些東西出來。這如今實現個PT、BDPT,除了自己學習,只能說還有個卵子用,這都2014年了,又不是1984年,你還想做渲染器賣錢?干擼吧。你寫個SPH,連Paging都么有,就一個水杯子裝一點點妹汁,你還欣欣然以為會了?知道DARPA和日本政府給福島核電站做的統一粒子動力模擬系統嘛,論架構論技術比現在的圖形學用的不知道牛逼到哪裡去了。對後來的人我只能說,學習基礎的,數學建模和思維,物理,編碼能力,架構能力,藝術鑒賞能力,比專業的學習某一種領域的知識要有意義的多。書籍就不提了,把SIGGRAPH所有論文都看一遍,基本上就行了。
民科出生,閑來亂噴。另外把你參考的知乎的答案列出來。
首先有一本老少咸宜的書:
Introduction to 3D Game Programming with DirectX 11: Frank Luna: 9781936420223: Amazon.com: Books
另外你說3D動畫應該是離線渲染有關的?如果是的話,你還要看一看
http://www.pbrt.org/
邀請了更適合回答此問題的 Miki樓主是要學動畫,我認為是想學習離線渲染演算法吧?Open GL屬於光柵演算法,是實時渲染的。離線演算法應該從ray tracer起步,推薦樓主本入門書:Ray Tracing From the Ground Up,當時我就用的這本入門。Animation範圍比較廣,基礎先要學線代,剛體物理,高數,character animation包括Forward kinematics,inverse kinematics(motion capture要是沒條件怎麼學?吐槽下),其他各種physical based animation也有各自的演算法,jello cube,布料,液體氣體等等,有的不局限在離線演算法,建議直接看Siggraph相關的course,對已發表的論文經典方法有很好的總結,也比直接讀論文快速簡單。學學GPU並行編程也很有必要,嘗試用CUDA寫個path tracer,rasterizer之類的。不過話說回來,圖形學本來出路就比較狹窄,一般也跑去遊戲公司了,電影公司很少找software engineer,一般要phd,小本和master頂多當個TD。如果樓主想問的是怎麼學遊戲引擎技術那是另一個話題了。。。
建議不要太早陷入各種演算法或是硬體層面的細節,因為圖形學設計方面即深又廣。先從基礎的物理表達開始,一些早期的圖形學書籍比較合適,之後再針對你要做的事情
我覺得先從圖形學底層學習太耗時間,而且不容易看到效果,不妨先搞實時渲染那一套,然後再深入圖形學底層,畢竟hack和trik和其他是分的清的
圖形學很龐大,不如先從ray traced rendering 和 simulation入手。寫一個基本的ray tracer, 如果有時間再搞一點raymaching volume rendering。然後,寫一些基礎的particle, rigid body, 流體之類的小程序,我認為就能入門了。再下一步,最好能進入一個實際的工作環境,實際干點活,找一個有興趣的領域作下去。根據,我的經驗,一定要自己寫代碼,光看書不行。
我在M做的工作就是找找SOC上的gpu bug。我們用的是Vivante的gpu,可能大家都不太清楚這竟然是做gpu的,它是一款比較小眾的gpu,用的人不多,主要是在嵌入式設備上。由於我們和vivante的關係較好,能看到一些code,於是我們就幫他們修修bug,主要就是看看spec,找到哪個函數實現的有問題。所以,計算機圖形學這東西,我也沒系統的學過,剛好借這個機會學學上面各位大牛的經驗,整理一下零散的知識。汗。
為了做3d動畫,居然從最底層的圖形學開始學起。你究竟是想做3d動畫,還是開發做3d動畫的引擎? 做最頂層的事卻打算從最底層開始,需要這樣赤裸裸的鄙視前人的智慧和成果嗎? 聽上去就像是為了造大樓卻從磚頭的分子結構開始學起。 然後終於搞懂了磚頭的分子結構跑到知乎問下一步做什麼,結果一群大牛說下一步是研究水泥的分子結構。 你難道沒考慮過用現成的工具和軟體嗎?
推薦閱讀:
※計算機圖形學是否已經進入瓶頸期?
※為什麼高解析度屏幕在使用低解析度時無法做到點對點映射?
※紋理坐標三角形內插值問題,我搞不定了。?
※為什麼一些採用 Source 引擎的遊戲,會有「看畫風知引擎」的感覺?
※Google開發的RAISR演算法利用機器學習壓縮圖片,提高解析度,實際應用怎麼樣?
TAG:計算機圖形學 |