每日最新頭條.有趣資訊

科普向:RTX顯卡支持的實時光線追蹤是什麽?

今年電腦圖形學上什麽最火爆?那莫過於實時光線追蹤了。GDC 2018上,微軟率先為DirectX 12 API增加了光線追蹤模塊,命名為DirectX Raytracing (DXR);NVIDIA則是發布了基於實時光線追蹤的RTX技術;AMD也宣布是自家的ProRender渲染引擎將支持實時光線追蹤。此外諸如EA 寒霜引擎、EA Seed、Unreal 引擎、3DMark、Unity 引擎已經宣布將會引入光線追蹤。但這些似乎距離我們還有些遙遠,直到前兩天NVIDIA發布了RTX 2080 Ti、RTX 2080、RTX 2070遊戲顯卡,明確表示從硬體級別支持光線追蹤!那麽到底什麽是光線追蹤?

光線追蹤能達到什麽樣的效果?其實這個我們每一個人都體驗過,絕大部分科幻、動作電影裡面或多或少都會用上光線追蹤這一技術。比如令人血脈賁張的《極品飛車》、《權力遊戲》中的火焰、煙霧和爆炸效果仿佛身臨其境,可以說光線追蹤生成的影像與攝影機拍攝的影像難以區分,這就是光線追蹤能達到的極致效果。但具體如何做到的,請聽我娓娓道來。

其實剛聽說要詳細講一下什麽是光線追蹤我是拒絕的,因為,你不能讓我寫,我就馬上去寫,第一裡面涉及到算法、數學原理實在是太多了,因為我不願意寫的時候涉及過多公式,“Duang”一下,顯得很高大上,這樣觀眾出來一定會罵我,根本看不懂你在講什麽,那就等於白講了。後來想了想,希望以最通俗易懂方式來講解光線追蹤是怎麽回事,盡可能地少涉及到數學公式以及算法原理,因為我要讓觀眾看到,我能理解的是這樣子,你們看完之後也會是這個樣子!

光柵化

想要了解什麽是光線追蹤,這裡我們不得不提及耳熟能詳的專業名詞“光柵化”,因為它是光線追蹤的基礎,也是高效替代方案。為什麽會出現這樣看似矛盾的定義?

因為光柵化是一個非常巨集大的概念,它有可能是指代某一個框架,也可能是具體到某一個技術上。就目前現階段來說,我們並不願意將光柵化放到與光線追蹤的對立面上,因為光線追蹤還是需要光柵化作為基礎,同時起到錦上添花作用,因此現階段實現的依然是混合渲染,兩者相輔相成,缺一不可,並不是部分自媒體吹噓的那樣,光線追蹤可以完全替代光柵化。

光柵化的簡單原理:

按照字面意思就是把影像柵格化、像素化,將電腦生成的矢量圖轉換成螢幕像素點的過程。比方說,遊戲中物體建模的時候都是三維,由點線面構成,但要顯示在二維的顯示器上,就需要一個“降維打擊”——光柵化,成為能夠被顯示的像素點,其實就是三維向二維的轉化過程,這是目前渲染的基石。

NVIDIA親自解釋光柵化過程:(不看也不影響閱讀系列)

每個三角形的頂角與大小和形狀不同的其他三角形的頂點相交,每個頂點關聯著大量資訊,包括其在太空中的位置以及有關顏色、紋理及其“正常形式”的資訊,這些資訊用於確定物體所朝向表面的形式。 電腦隨後將3D模型的三角形轉換為2D螢幕上的像素或點,可以根據存儲在三角形頂點中的數據為每個像素分配一個初始顏色值。

進一步像素處理或“陰影處理”,包括基於場景中的光線如何碰撞像素改變像素顏色,以及將一個或多個紋理應用於像素,從而結合生成應用於像素的最終顏色。

這種技術的計算量異常大。一個場景中的所有物體模型可以使用多達數百萬個多邊形,4K顯示器中有近800萬個像素。而且螢幕上顯示的每個幀或影像通常會在顯示器上每秒刷新30-90次。

此外,還要使用記憶體緩衝區(為加快運行速度預留出來的一點臨時太空)在即將到來的幀於螢幕上顯示之前預先渲染這些幀。還需使用深度或“Z緩存” 存儲像素深度資訊,以確保在螢幕上顯示像素的X-Y螢幕位置上的頂層物體,並且頂層物體背後的物體保持隱藏狀態。

光柵化過後的平面影像其實並不真實,這是原理所決定的,因此後期圖形學中出現了增強真實感的各種渲染技術,包括“全局照明”、“環境光遮蔽”、“漫反射”以及“軟陰影”,他們都是意圖用更低開銷實現更真實的光照效果。

由於都是通過算法來實現,並沒有統一標準,遊戲開發商可以自行選擇並使用,因此我們看到一些遊戲裡面有各種光影特效,而另一些遊戲中就沒有。如此之多、五花八門的技術就是為了創造以假亂真的光照效果,其實說到底就是我們的顯卡算力太弱了,隻配用這種近似解的方案。

圖片來自artofvfx

光線追蹤

而在電影行業中,早就用上了我們提及的光線追蹤,他們已經有相當成熟的解決方案,完全可以達到以假亂真的效果,你看看漫威的科幻大片,是不是給你一種異常真實的錯覺?沒錯,這就是光線追蹤的魅力。

至於為什麽電影行業能這樣做,原因不外乎有兩個:一是有時間,他們採用的離線光線追蹤,是要慢慢一幀幀渲染出來;二是有錢,通常特效工作室會使用到NVIDIA所說的渲染農場,不是一台電腦在算,而是一個個渲染集群伺服器在工作,算力是你機箱裡的GTX 1080 Ti成千上萬倍,因此它們可以這樣玩。

圖片來源

光線追蹤的歷史

其實光線追蹤並不是近幾年才有的概念,它的歷史甚至可以追溯到上世紀70年代。

1968年,Arthur Appel在其論文《 Some techniques for shading machine rendering of solids》提出Ray Casting(光線投射)的新概念,這也是後來光線追蹤的基石。

圖片來源見水印

其具體思路是從每一個像素發出一條光線,然後找出會擋住傳播路徑的物體,那麽只要計算被擋住之前的傳播路徑(直接光照部分),而視平面上每個像素的顏色取決於從可見光表面產生的亮度。

1969年就任於IBM的Arthur Appel在《Some Techniques for Shading Machine Renderings of Solids》論文中首次提出Ray Tracing(光線追蹤)。此技術可追蹤通過2D視平面上每個像素發射的光線路徑,並應用到場景的3D模型中。

但一直等到10年後的1979年,Turner Whitted才繼續在論文《An Improved Illumination Model for Shaded Display》中,具體解析如何捕捉反射、陰影和反射。在光線投射的基礎上,加入光與物體表面的互動。

圖片來源見水印

光線追蹤主要思想是從視點向成像平面上的像素發射光線,找到阻擋光線傳播的最近物體,如果交點表面為散射面,則計算光源直接照射該點產生的顏色;如果該交點表面為鏡面或折射面,則繼續向反射或折射方向跟蹤另一條光線,如此往複循環,直到光線射出場景或者達到規定計算次數(還是為了節省資源)。這個方法被稱之為經典光線跟蹤方法或者遞歸式光線追蹤方法。

圖片來源見水印

順帶提醒一下大家,Turner Whitted作為光線追蹤的創始人,目前就任於NVIDIA 研究事業部,所以你能理解NVIDIA為什麽那麽熱衷於光線追蹤追蹤了嗎?

光線追蹤目前的瓶頸——計算量龐大、小樣本計算噪點 

光線追蹤是三維電腦圖形學中的特殊渲染算法,它與之前計算光源光線傳播路徑不一樣,利用光的可逆性質,反向計算,跟蹤從眼睛發出的光線,通過技術生成編排好的數學模型展現出來,這樣的得到畫面效果更佳,對於反射與折射有更準確的模擬效果,並且效率非常高,因此在電影製作過程往往會採用這種高品質的渲染方式。

圖片來源NVIDIA

但很遺憾,光線追蹤最大缺陷在於對算力要求極高,計算量非常龐大,目前的單一硬體很難滿足實時光線追蹤的需求。光柵圖形學中的算法,利用了數據的一致性從而在像素之間共享計算,而光線跟蹤通常是將每條光線當作獨立的光線,每次都要重新計算。所以儘管電影特效工作室有龐大的計算集群,但他們也會“偷懶”,只有在關鍵幀、關鍵元素上採用光線追蹤來處理,其余部分依然使用光柵化進行渲染,依然能夠提供非常出色的畫面效果。由此可想而知計算量之大。

按道理來說,每一條光線都有自己的計算,可以正確地處理出光線反射、折射等光學現象,但實際出來的效果有可能與真實情況不一樣。這因為最終的畫面是求解通過渲染方程得到,但有時候方程式解不出來,只能利用蒙特卡洛積分做近似解,需要用到大量的樣本進行求解,在電影使用的離線渲染中,由於沒有計算時間限制,他們通常會採用幾百到幾千以內大樣本進行計算,出來的光線追蹤效果會更好。

一旦用到遊戲上就不同了,要達到60fps,也就是一幀只有16ms時間給你進行光線追蹤運算,那麽樣本只能盡可能小,這樣就會導致出來解不夠準確,畫面會有大量噪點。

NVIDIA開創了實時光線追蹤新時代

NVIDIA已經預料這一點,針對極低樣本數量的光線追蹤結果進行實時降噪的研究,並且取得了不錯的結果,最後成為GameWorks SDK 中一個光線追蹤降噪模塊,也就是Denoising算法。最終可以用比較低樣本的光線追蹤應用到實時渲染中,最終渲染品質可以媲美大樣本下的光線追蹤收斂影像。

另一方面,隨著顯卡計算性能日益提升,NVIDIA認為顯卡加入硬體級光線追蹤支持的時機已經成熟,光線追蹤也會成為未來3A級遊戲競相使用的技術,以達到玩家們夢寐以求的畫面效果。因此NVIDIA在經歷Volta遊戲顯卡跳票後,帶來了擁有專門處理光線追蹤的RT Core的Turing遊戲顯卡,不僅僅可以讓遊戲開發者進行實時光線追蹤計算,所見即所得,而玩家也能從遊戲中感受到前所未有、電影級的畫質。

就像NVIDIA所說的那樣,圖靈架構顯卡凝聚了過去10年裡在電腦圖形算法和 GPU 架構領域所取得的成果。

獲得更多的PTT最新消息
按讚加入粉絲團