像我這種情況,該如何繼續學習遊戲中實時渲染這方面知識?

普通大二狗一枚,這是上學期提的一個問題:

輪子哥的重複造輪子是什麼意思?想從事遊戲引擎開發和圖形學研究該如何重複造輪子? - 編程

後來感覺光線追蹤挺有意思的。。。就看了《光線追蹤演算法技術》,寫了一個簡陋的光線追蹤器,生成了幾張圖片。。:

然後看Frank lua的Dx11龍書,寫了一遍例子,對Dx11有了略微的了解。

然後想學一些實時渲染的演算法,就開始看GPU GEM3s,很慚愧。上面的很多內容看不懂。。。勉強看了幾章關於陰影的內容,但似懂非懂,寫了簡單的PSSM,VSM的小DEMO,但依然有很多問題。。

RTR3吧。。都推薦是圖形學聖經。。。但是更慚愧了。。攢了一個月生活費買下來。。。基本上看不懂orz....

本來在看Shadow Volume的一些知識。。GPU GEM3上講得不是很明白。。就找些別的資料看。。。但有些細節不明白。。就問了這個問題:

DirectX11中,TRIANGLRLIST_ADJ中index buffer設置問題? - 編程

龔大最後回答說:2015年。。為什麼還要浪費時間在Shadow Volume上面。

我也覺得我是不是走偏了。。現在大二下學期了,,依然很LowB,更可怕的是不知道該怎麼改善這種情況?怎麼進行下一步學習。。

希望各位大大。。能針對我的情況給些看法或者建議。感激不盡,在此拜謝。


看到題主的帖子不禁想到自己本科的時候。我倒覺得題主的狀態還不錯,有主動性,而且你也算入門實時渲染和光線追蹤了,剩下一兩年的時間可以進步的空間還是很大的。

學習任何東西最重要的是興趣。有興趣之後自然而然的會在上面花更多時間, 記得我大二的時候學校數據結構課期末大作業叫「池塘夜雨」。其實作業的要點就是要維護一個線性表可以動態的增加雨點,雨點掉到水面的時候則要在另一個線性表裡加一個波紋,然後雨點和波紋的生命周期結束後都要從線性表刪除這麼一個東西。當時的同學們做出來的效果都大概是這樣的:

畢竟是數據結構作業。因為我對圖形特別有興趣,就想搞個3D版的。最後的弄出的效果是這樣:

一開始當然沒想弄那麼複雜的,但一旦勁頭起來了就停不住。所以從一開始純用固定管線搞一個簡單的有光照的高度場,到後來做成有文理,折射反射,波紋高度用GPGPU高效計算的程序,都是被自己的興趣驅使,一次一次的take extra step。倒不是說寫這程序用到或學到了多少實時渲染的知識(也就用了render to texture, displacement mapping, clipping plane這一類東西),但是在被興趣驅使且高度集中做一件事情的時候進步就會非常快而且不知不覺。所以我覺得你要是一直堅持這種自己學習的狀態,慢慢量變就會積累成質變的。

扯了點雞湯。。關於學習圖形學我之前寫了不少回答:

現階段應該怎麼學習計算機圖形學呢? - 文刀秋二的回答

想從事計算機圖形學的研究,博士出來想要就業的話可以去哪裡? - 文刀秋二的回答

實時渲染方面的知識,從演算法本身來說東西不算多。可以嘗試好好的實現一套deferred lighting。就是一開始對每個光源都渲shadow map(PCF,VSM,Cascaded等),然後Fill G Buffer(可以去參考UE4等引擎的GBuffer layout是怎樣的,但自己沒必要一下子弄的那麼複雜), 再做光照(可以用pixel shader,現代的遊戲大多用compute shader做tiled based lighting),再用GBuffer的信息弄個SSAO類型的陰影(或者HBAO,SSDO),最後再做Post Processing(Tone mapping, Bloom,motion blur等)。我本科時候就寫了一個包括以上所有階段的簡單的渲染引擎。如果對graphics pipeline本身熟悉的話這些演算法真的更像是Photoshop的技巧。任何一個渲染業界的人要實現這些演算法都是很簡單的,引擎難的地方全是工程,系統方面的問題。這些東西也只有自己把輪子造一遍才真能知道怎麼回事。

和以上Orthogonal的一個問題就是Physically based shading。你在做lighting的時候到底怎麼計算每種材質的顏色。像我這種敏感的一看就知道你第一個圖片里的材質是瞎寫的。怎麼鏡面反射和漫反射疊加在一起,然後鏡面反射的強度居然也乘以了NDotL。不過這些東西也不難,尤其是在實時渲染不在乎全局光照的情況下,物理模型現成的。好好學習下Microfacet模型吧。還有你第二幅圖片對那個圓盤光源的採樣也明顯有問題,為什麼一個圓形的光源照亮的區域是狹長的,看看你採樣那部分的code吧。要寫對一個physically correct的integrator比你想像的難多了。我自己實現Bidirectional Path Tracing with MIS的時候,一開始是讀paper推理論到頭暈,好不容易搞懂了實現起來更是真的花了三年多才覺得bug free(當然不是連續寫,而是每次回頭看總能發現之前沒有注意的地方有bug,例如如果從光源追蹤ray的話,遇到shading normal這種東西還要乘以一個係數什麼的)。

還可以看一看更有趣圖形的演算法。例如球諧光照(Spherical Harmonics Lighting)。通過信號壓縮的方式來預計算場景中某位置的光照信息(可以是visibility,可以是indirect lighting),然後實現靜態場景的軟陰影或者簡介光照。本科時候我也寫了一個球諧的程序用ray tracing預計算全局光照,非常開我的腦洞。

還有一些其他有趣的問題例如大氣光的渲染,海洋模擬渲染等。以及更多的模擬問題可以看我上面的回答鏈接。


謝邀。

科技樹應該是一層一層點過去的,直接點葉子搞不定。

從你給的信息來看,主要有兩個問題。

第一就是樹的結構。如果你實現了有問題的PSSM和VSM,在那之前請問有沒有一個完全正確的standard SM(SSM)?如果SSM完全正確了,PSSM和VSM又怎麼會出問題?要實現GS的shadow volume之前,有沒有實現過普通的shadow volume?

第二就是缺乏原因分析。遇到一個東西掛了,不是還做另一個東西。而是把原因分析出來。比如,為什麼看不懂RTR3,卡在哪裡了。否則結果就是做了很多,一個work的都沒有。

另外,圖形的東西都需要巨量編程經驗的支持,這和其他很多領域不同。代碼積累什麼的都非常重要,並且要有架構能力和一定的工程經驗。一個項目代碼量一大就到處出毛病可不行。


嗯,我覺得 @龔敏敏 已經把話說全了。你的問題是專註度不夠。你寫了光線追蹤,為什麼現在就不寫了,你是不是覺得光線追蹤這樣就算寫完了?

我的學習過程一直都是好奇心驅使的,在我認為完全搞清楚一個東西之前,是不會停下來的。高中的時候廢了很大的力氣才把骨骼動畫調對,那時候其實並不怎麼懂矩陣,於是就手動把矩陣操作展開來看才搞明白真諦,最後又花了很多時間才調試通過。

所以說做一樣就要成一樣。如果你做了光線追蹤,請繼續做下去,你的光線追蹤不支持紋理,不支持折射反射,不支持任何全局光照,可能也沒有BVH,為什麼就停了下來。就算實現出來有沒有花心思優化?我覺得可能是你的好奇心不夠,也可能你操之過急,這種事請急是沒有用的。

很多東西,只有你做透徹了,才有可能融會貫通。祝成功。


雖然這種級別的光線跟蹤幾百行就能寫好,

但是起碼反映了你在這方面興趣很濃厚嘛。

我給你的建議是:

1. 紮實基礎

從題主提過的問題來看感覺題主涉獵範圍很廣,相比一般本科生來說很超前,但是基礎比較薄弱。

問你幾個圖形上的問題:

1) 投影矩陣你能不能自己手動推出來?

2) 你能不能從一個變換矩陣中分解出它的平移、旋轉、縮放、錯切變換?

3) 在屏幕空間偽深度的線性插值為什麼是正確的?

4) 在屏幕空間紋理坐標如何插值才是正確的?

上述問題只要有一個回答不出來,那麼你應該先看《計算機圖形學》。

2. 學會查第一手技術文檔

要學 DX,應該直接看微軟的 DX 文檔和例子,

例子里也有比較簡單的實時圖形演算法。

先能夠熟練運用 DX,再來實現更加高級的實時圖形演算法吧。

要學C++,上 MSDN 搜 C/C++ Language and Standard Libraries,微軟的文檔寫得還是很良心的。

另外 http://cplusplus.com 和 http://cppreference.com 上也有 C++ 的 reference。

3. 遇到問題盡量自己解決,實在沒辦法了再提問

經常能看到題主提的問題,發現題主似乎碰到什麼小問題都喜歡提問,比如:

C++11 移動構造函數問題? - 編程語言

DirectX11中,TRIANGLRLIST_ADJ中index buffer設置問題? - 編程

HLSL 中 row_major 矩陣為什麼不用右乘? - 編程

QueryPerformanceFrequency()得出的結果為什麼差了三個數量級? - 編程

說實話,這些問題都很簡單,有些甚至很小白,基本都是補補基礎,或者查查技術文檔就能解決的。

從這些問題的回答數上你也能發現,基本沒有人願意給你掃盲。

碰到問題不要總是依賴其它人,而是應該趁機訓練自己解決問題的能力,比起一些具體的技術來說,解決問題的能力要重要得多。

ps.

為什麼一向抖機靈的我突然寫了這麼多字呢,因為我在題主身上看到了曾經的我啊。

現在我由於種種原因我沒法繼續在圖形上走下去,但是題主還有大把時間,題主的未來還充滿了未知,著實令人羨慕。

pps.

我正好做過 VSM,自認為效果還不錯,題主不如曬出自己的 VSM 效果圖來看看,

讓我看看究竟是有什麼問題。

尤其是展現一下兩物體的陰影交界處,以及說一下你的每像素採樣深度圖的次數。


大學畢業才打算轉行學習CGI的我是不是沒救了?


卧槽 ,數字媒體快畢業,看了題主做的東西感覺我可以回到大二重修了...


我覺得樓主很牛逼了,才大二就玩這個了。

大學剩下的時間要是研究光線跟蹤感覺能把pbrt 啃下來,要是啃realtime 的,你先啃一本你買的那本吧,然後就可以學點dx 自己yy 遊戲引擎了,反正ue 4源碼都能找到,記得所有的書看原版!


題主,看你做的這些已經很不錯了,我也大二,現在也就會個STL,能用qt MFC不會用,,所以支持題主,加油繼續努力!!!


推薦閱讀:

MacBook Pro適合深度學習嗎?
如何讓cout不自動識別數據類型輸出,而去按照指定的數據類型輸出?
程序函數條件與返回的區別?
Python 使用 list 作為函數參數時,參數是否會初始化?
怎麼去實現一個簡單文本編輯器?

TAG:遊戲開發 | 編程 | 計算機圖形學 | DirectX |