本文翻譯自Scratchapixel 3.0[1],是一個關(guān)于計算機(jī)圖形學(xué)的系統(tǒng)性的學(xué)習(xí)教程。如果有誤,歡迎在評論區(qū)討論。
我們已經(jīng)涵蓋了所有需要說的內(nèi)容!我們現(xiàn)在準(zhǔn)備寫我們的第一個光線追蹤器。你現(xiàn)在應(yīng)該能夠猜到光線追蹤算法是如何工作的了。
首先,注意到自然界中光的傳播只是從光源發(fā)出無數(shù)條射線,反彈直到它們撞到我們眼睛的表面。因此,光線追蹤是優(yōu)雅的,因為它直接基于我們周圍發(fā)生的事情。除了它按照相反的順序跟隨光線的路徑外,它是一個完美的自然模擬器。光線追蹤算法使用由像素組成的圖像。對于圖片中的每個像素,它向場景中發(fā)射一個主射線。該主射線的方向是通過從眼睛到該像素中心的線追蹤得到的。一旦我們設(shè)置了該主射線的方向,我們檢查場景中的每個對象,看它們是否與任何對象相交。在某些情況下,主射線將與多個對象相交。當(dāng)這種情況發(fā)生時,我們選擇離眼睛最近的交點所在的對象。然后,我們從交點向光源發(fā)射一個陰影射線(圖 1)。

圖1:我們通過像素中心發(fā)射一個主射線來檢查可能的對象相交。當(dāng)我們找到一個對象時,我們發(fā)射一個陰影射線來確定該點是否被照亮或在陰影中。
如果這條射線在到達(dá)光源的路上沒有與其他對象相交,那么擊中點就被照亮了。如果它與另一個對象相交,那個對象就會對它產(chǎn)生陰影(圖 2)。

圖2:小球在大球上投下了陰影。陰影射線在到達(dá)光源之前與小球相交。
如果我們對每個像素重復(fù)這個操作,我們就可以得到我們?nèi)S場景的二維表示(圖 3)。

圖3:為了渲染一個幀,我們?yōu)槊總€幀緩沖區(qū)的像素發(fā)射一個主射線。
以下是算法的偽代碼實現(xiàn):
for (int j = 0; j < imageHeight; ++j) { for (int i = 0; i < imageWidth; ++i) { // compute primary ray direction Ray primRay; computePrimRay(i, j, &primRay); // shoot prim ray in the scene and search for the intersection Point pHit; Normal nHit; float minDist = INFINITY; Object object = NULL; for (int k = 0; k < objects.size(); ++k) { if (Intersect(objects[k], primRay, &pHit, &nHit)) { float distance = Distance(eyePosition, pHit); if (distance < minDistance) { object = objects[k]; minDistance = distance; //update min distance } } } if (object != NULL) { // compute illumination Ray shadowRay; shadowRay.direction = lightPosition - pHit; bool isShadow = false; for (int k = 0; k < objects.size(); ++k) { if (Intersect(objects[k], shadowRay)) { isInShadow = true; break; } } } if (!isInShadow) pixels[i][j] = object->color * light.brightness; else pixels[i][j] = 0; }}
正如我們所看到的,光線追蹤的美妙之處在于它只需要幾行代碼;一個基本的光線追蹤器只需要 200 行代碼。與其他算法(如掃描線渲染器)不同,光線追蹤的實現(xiàn)需要很少的努力。Arthur Appel 在 1969 年的一篇名為“一些用于給固體著色的機(jī)器渲染技術(shù)”的論文中首次描述了這種技術(shù)。那么,如果這個算法如此出色,為什么它沒有取代所有其他渲染算法呢?主要原因在于速度,當(dāng)時(甚至今天在某種程度上)是這樣的。正如 Appel 在他的論文中所提到的:
“這種方法非常耗時,通常需要比線框圖繪制多幾千倍的計算時間才能獲得有益的結(jié)果。其中約有一半時間用于確定投影和場景之間的點對點對應(yīng)關(guān)系。”
換句話說,它很慢(正如 Kajiya 所說的,他是所有計算機(jī)圖形學(xué)歷史上最有影響力的研究人員之一:“光線追蹤不慢,計算機(jī)慢”)。查找光線和幾何圖形之間的交點非常耗時。幾十年來,算法的速度一直是光線追蹤的主要缺點。然而,隨著計算機(jī)變得更快,它越來越不是問題。盡管仍有一件事必須說:與其他技術(shù)(如 z 緩沖算法)相比,光線追蹤仍然要慢得多。然而,隨著今天的快速計算機(jī),我們可以在幾分鐘內(nèi)計算出以前需要一個小時才能完成的幀。實時和交互式光線追蹤器是一個熱門話題。
總之,重要的是要記住,渲染例程可以被認(rèn)為是兩個單獨的過程。一步確定一個物體表面上的點是否從特定的像素可見(可見性部分),第二步著色該點(著色部分)。不幸的是,這兩個步驟都需要昂貴和耗時的光線-幾何交點測試。這個算法是優(yōu)雅而強(qiáng)大的,但是它迫使我們在渲染時間和精度之間進(jìn)行權(quán)衡。自 Appel 發(fā)表論文以來,已經(jīng)進(jìn)行了大量研究來加速光線-物體交點例程。隨著計算機(jī)變得更加強(qiáng)大并結(jié)合這些加速技術(shù),光線追蹤成為了日常生產(chǎn)環(huán)境中可用的方法,并且是大多數(shù)渲染離線軟件所使用的事實標(biāo)準(zhǔn)。視頻游戲引擎仍在使用光柵化算法。然而,隨著 GPU 加速光線追蹤技術(shù)(2017-2018)和 RTX 技術(shù)的最近出現(xiàn),實時光線追蹤也在可及范圍內(nèi)。雖然一些視頻游戲已經(jīng)提供了可以打開光線追蹤的模式,但僅限于簡單的效果,如清晰的反射和陰影。
-
光源
+關(guān)注
關(guān)注
3文章
731瀏覽量
68431 -
追蹤器
+關(guān)注
關(guān)注
0文章
172瀏覽量
26003 -
光線追蹤
+關(guān)注
關(guān)注
0文章
185瀏覽量
21728
發(fā)布評論請先 登錄
CPU渲染、GPU渲染、XPU渲染詳細(xì)對比:哪個渲染最快,哪個效果最好?

2D圖形渲染緩慢怎么加快?
光線追蹤及降噪技術(shù)綜述

PID控制算法的C語言實現(xiàn):PID算法原理
GPU渲染才是大勢所趨?CPU渲染與GPU渲染的現(xiàn)狀與未來

【「從算法到電路—數(shù)字芯片算法的電路實現(xiàn)」閱讀體驗】+內(nèi)容簡介
【「從算法到電路—數(shù)字芯片算法的電路實現(xiàn)」閱讀體驗】+介紹基礎(chǔ)硬件算法模塊
【「從算法到電路—數(shù)字芯片算法的電路實現(xiàn)」閱讀體驗】+一本介紹基礎(chǔ)硬件算法模塊實現(xiàn)的好書
GPU在虛擬現(xiàn)實中的表現(xiàn) 低功耗GPU的優(yōu)缺點
基于光線追蹤實現(xiàn)反射折射效果

光線追蹤算法概覽

光線追蹤的工作原理

評論