如何閱讀PBRT3?
以下是我半年前PBRT3的學習路線。雖然每個人的基礎都不一樣,針對我個人的學習規劃很難對別人形成量身定做的效果,但是因為我已經看過一部分內容,所以
好歹也具備一些總結性,可以有效的幫讀者跳過一部分和全域性理解無關的內容,讓學習策略更具備目的性和全域性性
。
綜上,應該還是有一點參考價值的。所以厚顏無恥的po出來了 XD。
下面講重點。接下來,範圍將會主要圍繞在第9章之前來做。中期包括一點12章的內容,後期包括很少的14章內容。
核心目的是實現基於最基礎的Whitted光線追蹤的離線渲染器。
首先,跳過1-4章。除非你很想了解光線追蹤史,基礎數學知識,或者PBRT的形狀介面,還有求交演算法。後面需要的時候會返回來看這裡的部分內容,但總的來說,它們對理解實現光線追蹤知識沒有太大幫助。
第5章:顏色和輻射度學,可以跳過前面rgb-xyz相關的內容,
直接從輻射度學開始看起。把光線對映的數學模型先建立起來。
第6章:酌情跳過,畢竟攝像機的實現dx和OpenGL基本算是自帶,除非你想實現6。4的全景攝像機。
第7章:酌情跳過,因為主要就是教你如何進行取樣可以避免鋸齒和摩爾紋之類的只知識,和最終目的——實現一個最簡單的光線追蹤,關係並不密切。
第8章:
反射模型,這個是要點,需要花時間看一下。提前消化整個反射模型有助於我們更好的理解光線追蹤流程。但是,只需要看到8.3
,也就是Lambert模型及其之前的部分,就可以形成概念了,後面的內容都是錦上添花的,對我們從全域性理解而言用處不大。
PS:這裡最大的爭議應該就是我跳過微表面相關的內容了。畢竟跳過微表面就意味著放棄第10章的紋理,丟失了很大一塊學習內容。但這和我當時的學習原則有關:微表面和紋理的知識可以回頭再補,一切以形成全域性概念為先。因此是否必須學習第8章和第10章的微表面和紋理,我不提供意見,請自行斟酌。
第9章,
看到9.2.1的Matte材質就可以了
,後面全部跳過。因為現階段的主要目標是把材質在pbrt中的一套運作流程搞清楚。但如果想要渲染一張圖片看看,肯定需要學一個最容易理解的材質,而最簡單的毫無疑問是隻有漫反射的Matte。
(至於玻璃、鏡子、金屬什麼的,可以在程式框架成型以後,再回來補充。)
第10章:紋理。沒有學微表面知識,所以跳過。
第11章:體積光,PBRT自己都加可選了……跳過。
第12章,跳過12。1,
看12.2燈光介面,
然後跳過可見性測試的內容(即跳過陰影。將來寫程式碼時如果需要判斷可見性測試,邏輯永遠設為true就可以了),最
後再看一下12.3的點光源就可以了。
我們只需要一種光源(點光源最簡單),所以不用看12。3。1以後的內容。
PS:要實現陰影,外層邏輯的確並不難,沒有跳過的必要,但內層就麻煩了——必然會涉及第4章的求交加速。但由於這裡第4章我們是沒有看的,所以這裡也先跳過陰影。
好的,到這一步基本上離線渲染的思路算是通了,但這還沒完。因為接下來就要寫程式碼了,而現在只是看了理論,至於如何付諸實踐大機率還是一臉懵逼…
所以
做到這一步,需要放緩閱讀進度,自己先花一到兩個星期,總結一下已經學過的知識。
現在開啟onenote或者別的什麼,草稿本都行,將上面學到的全部知識畫一個離線渲染流程。把每一個過程都抽象出來,多自己思考。
注意,這時候第1章的1.3.4和1.3.5,即光線追蹤中的主渲染迴圈+Whitted積分器必須跑回去看,會派上很大用場。
因為這兩小節主要講主渲染+whitted積分器的執行流程,對你構建自己的渲染框架非常有幫助。
(PS,題主一開始先看第一章,我現在是不太認同啦……容易有鬼知道他這一坨講的什麼玩意的感覺——沒錯,一開始我也是這麼幹的。)
下面是我當時畫的渲染流程草圖,圖沒什麼參考價值。重點是要自己能搞出一套完整的思路和行動方案。
我當時畫的渲染流程草圖,加強自己理解用的,對其他人來說沒什麼參考價值。
然後可以開始碼程式碼了,照著你的圖去做,做到碰撞檢測的時候,可能需要看射線和三角形相交的內容,在3。6 triangle mesh裡有相關資料。至於射線和aabb相交就簡單的多,網上到處都是,可以自己查。
依照到現在已學的知識和架構思路,基本上可以用自己寫的程式碼,生成第一張Hello GI圖了。
沒錯不是很好看……但主要的原因是我們現在的材質、形狀和光源都太少了,導致它雖然是實打實用PBRT的方式渲染出來的。但看起來根本就和離線渲染的沒差別……
因此,接下來開始折騰反射+折射。
做反射和折射的時候,不能只學習書,還需要學習原始碼。
主要的原因就是原始碼裡面直接給出了玻璃和鏡面材質的實現方式。這兩種材質最能體現出反射且實現簡單,但在PBRT中似乎被略過了(我沒找到)。然後依照實現Matte材質的方法照葫蘆畫瓢,做出玻璃和鏡面材質即可。
這裡有一點麻煩:當時做Matte材質的時候,不需要實現反射機制相關的方法,所以這部分方法我們也完全沒看。因此這時候需要回到書本,看一下14。1章節的取樣反射方法的相關程式碼——諸如BxDF::Sampler_f()的相關內容,為自己提供構建反射部分程式碼的思路。我印象裡只看14。1,取樣反射函式的部分內容就可以了。
另外,由於我們常參考的pbrt原始碼中混入了一部分取樣內容,此時還沒有Sampler概念,因此很難把這些內容剝離出來,所以在碼程式碼的時候,如果看不懂Sampler相關的內容,可以在這個時候暫停自己的程式碼進度,掉頭看一下第七章的7。2。2-7。2。4,即基本取樣介面、取樣器實現和畫素取樣器(最基本的取樣器)。然後把畫素取樣器實現到自己的渲染框架。
然後就可以做出帶反射的PBRT圖了,下面這張是我按照上面的思路自己做的,包括了Matte、鏡面、玻璃材質的概念(找這個破圖花了我好長時間……瑕疵很多,不過越簡單越方便理解參考)。
第二張PBRT渲染圖,引入了反射和折射的概念。由於當時還沒有求交加速,渲染花了很長的時間,並且導致圖片的右下角出現了繪製順序的瑕疵。不過重點是圖中玻璃球的反射和折射表現良好。
至此應該已經初步入門並有了自己的學習策略,不會再出現一頭霧水,不知道怎麼學的情況。
當然後面還需要做的事情有很多,BVH求交加速、陰影、新的材質、燈光和形狀、甚至匯入fbx模型檔案……當然最核心的還是要進一步學會並實現雙向追蹤、光子對映之類的。但那些都是後話了。
目前也在閱讀中,路徑:加速結構,反射模型,path tracing, 反射模型(重構程式碼),BDPT&MLT以及相關的一坨東西,反射模型,無限修Bug中。
第一章我直接跳了。
最初學了 Peter Shirley 的
Ray Tracing in One Weekend
。
Ubpa/ToyRTX
緊接著看 PBRT,但看的雲裡霧裡的。
因為工作原因,就先放棄 PBRT 了,反正也看得難受。這時去學了 OpenGL,跟的教程是
LearnOpenGL CN
。
Ubpa/LearnOpenGL
再接著跟了 2018 的
CMU 15462
課程,學到了簡單的 Path Tracing。
Ubpa/CMU_15_462
然後為了寫畢設,就結合了之前學的 OpenGL 和 Path Tracing,寫了個渲染引擎。
Ubpa/RenderLab
有了這些基礎後,再看 PBRT 的時候就舒適了,能挑
重要的 / 想知道的
看,知道哪些可以跳過。
因為有自己的引擎,所以也不需要太關注 pbrt 的程式碼,只需作為參考。
正在看,做著筆記
(我想在看完後再來斟酌下怎樣的順序比較合理)
Ubpa/Note/PBRT
一直在忙,沒時間做最後的整理工作。。。。
就我自學經驗來說(鄙人小白,摸著石頭過河),
coding
學習效果 >
上課
>
看書
> 閉門造車。要看書的話,還是有配套課程一起看比較好,Assignment 的質量都很高。
學習 PBRT 這本書鄙人推薦兩條路線:
路線 1:跟作者 Matt Pharr 的課——
CS 348 b
,每年春季開課。
Image Synthesis Techniques (CS 348B)
假定你有 C/C++ 和圖形學基礎,比如看過下面這兩本書
[1]
[2]
:
或者先修課程 CS 348 a / CS 248 任選一門,前者最近一次公開課更新是 winter 17,比較慢。
推薦
CS 248(Winter)
,每年都有公開課。
Interactive Computer Graphics :: Winter 2019
路線 2:
CMU 15-462(Spring / Fall)
,每年開兩次課,從圖形學基礎開始講起。
Computer Graphics : Fall 2019
有 PathTracer 的 Assignment。
這個問題我覺得自己很有發言權,因為我曾經跟題主遇到的情況很類似,區別是我堅持讀完了前七章,然後我發現有些不對勁,因為讀完之後對很多知識的印象都比較模糊,尤其是對於貫穿全文的光線微分,非常影響閱讀體驗。
後來我就想,一定是我開啟的方式不對。沒錯,既然開啟的方式不對,我們就要重新開啟。
首先先要閱讀完光追三部曲,自己先實現一個小巧的光線追蹤引擎:
Shirley P。 Ray Tracing in One Weekend[J]。 2016。
Shirley P。 Ray Tracing The Next Week[J]。 2016。
Shirley P。 Ray Tracing The Rest Of Your Life[J]。 2016。
然後弄明白PBRT中的場景檔案的載入和構建流程:
(唉,本來以為寫書很容易的,結果校訂什麼的都很麻煩。寫錯了也怕耽誤讀者,系列書也得保證內容一致。雖然目前寫完了八本了,但是因為需要校訂和檢驗,估計6月左右才能釋出的網站上)
場景檔案怎麼讀入到PBRT系統,並初始化各個基類,然後開始渲染的呢?這個流程弄明白了,學會PBRT就已經
成功了一半了
。
推薦第一本我自己寫的小書《PBRT系列1-檔案載入和設定》(該書會免費釋出到網上,正在搭建網站:
https://
dezeming。top/
,我特別喜歡《光追三部曲》的風格,從零開始一步一步教大家構建程式碼,很有成就感):
對照著原始碼讀完這本小書也就一兩天時間,之後我敢說,你已經知道怎麼繼續研究PBRT了。
之後,理解並實現一個朗伯和完美鏡面物體康奈爾盒場景的Whitted光線追蹤器:
其實PBRT的Whitted光追實現非常簡單,但是涵蓋了整個渲染的流程,因此我們最好先把PBRT中的渲染流程搞清楚,然後再自己實現一遍,之所以是朗伯和完美鏡面物體,因為它們足夠簡單。
我寫的第二本小書就是如此:《PBRT系列2-程式碼實戰-Whitted光線追蹤引擎》該書已寫完。只需要一兩天,你就能弄明白PBRT中的Whitted光追流程和演算法,並在自己的光線追蹤引擎上實現。
然後研究一些基本的模組的細節,並動手實現:
比如什麼是光線微分,取樣器的作用(產生隨機數),濾波器的作用(影象後處理,紋理過濾)。以及PBRT的最重要的結構:材料和紋理。
如果等得起的話,我正在籌措寫一系列的關於如何從簡單光追引擎(光追三部曲)過渡實現PBRT引擎的小書。目前我構建的PBRT系列書流程大致如下:
首先是介紹
場景解析
的書(已完成)
然後是
弄懂PBRT中Whitted光追的書並自己寫程式碼實現
(已完成)
之後我們就
全部拋棄
《光追三部曲》構建的系統,開始動手製作一個PBRT光追器:
學習和研究PBRT的
基本組成,矩形向量變換工具、Shape和加速結構
(已完成):
然後實現
顏色與光譜類
的學習和移植(該書已完成)。
然後實現PBRT的
相機系統
(該書已完成):
相機與離焦模糊
之後學習
取樣器
,並
將PBRT的渲染積分器實現到自己的系統中
。(該書已完成)
之後我們再去研究
材料和紋理
,然後實現
相機和光線微分以及取樣器
,之後實現
直接光照和路徑追蹤器
,之後介紹
體散射和體渲染
,還有些內容等前面這些都完成了再規劃。
PBRT系列小書
學習完PBRT系列8以後能實現的效果
PBRT材質比較多(雖然與專業成熟的渲染器相比也不是很多),因此我會在系列10詳細介紹每一種材質。
移植PBRT實現的面光源軟陰影
系列0到系列14都已經寫完併發布在個人網站上了:
https://
dezeming。top/
。
關於答主:
目前主要做醫學影像體渲染實時光照演算法,國內外的體渲染全域性光照基本上都研究過一遍了,最近正在研究的是全域性動態光照技術。