視頻系列:RTX實時射線追蹤(上)算法
Video Series: Practical Real-Time Ray Tracing With RTXide
RTX在遊戲和應用程序中引入了一個使人興奮的和根本性的轉變。在這個視頻系列中,NVIDIA工程師Martin Karl Lefrancois和Pascal Gautron幫助您開始實時光線跟蹤。您將瞭解如何管理數據和渲染、加速結構和着色器如何工做,以及管道須要哪些新組件。咱們還將包括本視頻系列所基於的演示文稿中的關鍵幻燈片。性能
這些視頻包含豐富的信息,但在您觀看時不要擔憂記下東西;咱們已經爲您作了筆記。你能夠從每個以子彈形式呈現的片斷中找到「關鍵的東西」。不過,咱們強烈建議你在挖掘子彈以前先看視頻,以確保你獲得了正確的上下文。測試
光線跟蹤是一個與光柵化根本不一樣的渲染過程,如圖1所示。ui
Figure 1. Instead of the triangle being projected on the screen, we take the position from the eye, send a ray through the pixel, and try to find the triangle underneath.this
能夠跟蹤更多光線來計算該像素的陰影。 spa
當你追蹤光線時,它會擊中最近的三角形並將其返回給你。 3d
你沒必要解決它。它只會返回沿射線最近的三角形。 orm
當場景中有不少三角形時會發生什麼?如何快速處理?您須要一個加速結構,如圖2所示。場景中的全部對象周圍都有一個大的邊界框,一種算法將拆分該框並重復執行此操做,直到該框僅包含幾個三角形。而後,你就能夠用這些三角形來測試了。視頻
Figure 2. The construction of this acceleration structure is provided by RTX API.
Martin Karl解釋了實時光線跟蹤中數據的組成,並說明了加速度結構、管道和綁定表是如何協同工做的。
圖形程序包括用戶界面和交互、引擎更新、數據和渲染。咱們對光線跟蹤的數據和渲染組件特別感興趣。
光柵包括頂點緩衝區和包含場景中全部三角形的索引,如圖3所示,以及頂點和片斷着色器。
Figure 3. Raster scene construction.
彙集一塊兒,他們將有助於繪製你的場景。在光線跟蹤中,必須將頂點和索引的緩衝區轉換爲加速度結構。一樣,頂點和片斷着色器必須轉換爲不一樣類型的着色系統。在光柵中,這些是分開的。在光線跟蹤器中,你必須把這些東西結合起來。
底層加速度結構(BLAS)和頂層加速度結構(TLAS)表明兩部分。爲何結構會這樣分裂?讓咱們考慮一個城市、汽車和卡車的例子,如圖4所示。
Figure 4. Splitting the acceleration structure into top and bottom halves improves performance.
一個加速結構支撐着城市。你把全部的建築都放在裏面。這都是靜態的;你想渲染和光線跟蹤那塊很是快。
另外一個加速結構支撐着汽車。在本例中,有兩個實例使用它,由於同一輛車在場景中能夠是不一樣的顏色。
最後,咱們使用一個實例添加一個truck。
您能夠輕鬆地重建頂層。汽車能夠在整個城市移動,你沒必要重建整個系統。
你能夠在底層重建。若是一個結構必須調整,好比說,一場車禍,你能夠在不改變其餘結構的狀況下作出改變。
出於性能緣由,您但願最小化底部結構的數量。追蹤光線穿過兩個重疊的BLA須要作兩倍的工做來找到最近的交點…這一點很重要。
讓咱們看看光線跟蹤管道,如圖5所示。
Figure 5. The Ray Tracing Pipeline
管道由一組着色器組成,如圖6所示。
首先是轉到光線生成着色器的像素。這就是你決定開始的地方和你拍攝光線的方向,一個叫作光線生成的過程,以每像素爲單位執行。這將爲您準備的每一個像素調用。
而後,它將轉到遍歷,並調用交叉點着色器。有一個內置的三角形(能夠重寫)。
Figure 6. Ray tracing shader architecture
還有一個任意命中材質球。這是內置在管道中的,但您能夠覆蓋它。例如,葉子形狀由alpha紋理定義的樹。你想讓這個系統經歷全部的困難,直到它真的碰到什麼東西。它測試alpha,只有當葉子的身體受到真正的觸碰,而不是僅僅觸碰葉子的外部時,纔會產生最接近的命中率。
您也能夠將此用於陰影光線。
最接近的命中材質球在實際接觸對象時起做用。最近的命中保存了陰影的代碼。你也能夠從那裏追蹤新的光線並追蹤到你的影子。
當你什麼都不碰的時候,你就會發現「小姐」的影子。你徹底忽略了場景中的全部對象。例如,這將是您的環境着色器。
圖7中的圖表顯示了徹底使用光線跟蹤着色器管道的可能性。
Figure 7. This diagram shows one possible data flow using ray tracing shaders.
你有一個TLAS(頂層加速結構)和一個BLAS(底層加速結構)。
管道是找到編譯的着色器和聲明全部着色器的位置。
着色綁定表將綁定着色器的元素。
它們共同維護一個複雜的關係,但不太複雜,如圖8中的組裝圖所示。
Figure 8. This assembly view shows the relationship between the ray tracing pipeline and the shader binding table. This is what you have to do in DX12.
在渲染方面,光線跟蹤只須要一個調用dispatchray。而後你能夠移動到無人機,並渲染目標。
Figure 9. The rendering side of ray tracing uses just a single call.
Pascal如今提供了一個更深刻的研究,當您嘗試使用基於光柵的應用程序並使其與光線跟蹤一塊兒工做時會發生什麼。
雖然本系列視頻的焦點是直接X12,但基本原理都轉移到Vulkan。閱讀咱們的博客文章關於Vulkan射線跟蹤如何與RTX工做的更多細節。
將場景分爲底層實例(BLAS)
爲每一個實例生成底層加速結構
少BLAS更好
將動態對象保存在它們本身的BLAS中
對動態對象使用從新裝配
生成頂層加速結構(TLAS)
從描述符開始,如圖10所示。
您將可以重用基於光柵的應用程序中使用的數據。一般,您能夠指向頂點和索引緩衝區,並訪問徹底相同的數據。在基於光柵的應用程序中,可使用與每一個對象對應的任何範圍來描述對象。
Figure 10. Setting up bottom-level acceleration structures
您能夠將不一樣的對象放在一個BLAS中,並使用轉換緩衝區來定位它們,該緩衝區會將它們烘焙到一個加速結構中。
三角形將被內部轉換並放置在加速結構的正確位置。
咱們構建了另外一個描述符,它將給咱們一些關於BLAS將是什麼的信息。咱們須要定義是否可以更新結構,如圖11所示。
Figure 11. More BLAS setup requirements
肯定產生的加速度結構的尺寸。
scratch數據大小描述了加速結構構建器在構建過程當中須要多少內存。你須要分配這個內存。
在DX12中沒有隱藏的分配;必須顯式地執行全部操做。
scratch空間僅在構建期間使用。以後,您能夠取消分配。
一旦分配了暫存空間,就能夠重用全部的描述符。您能夠建立另外一個帶有更新標誌的描述符,用於可選的從新安裝。最後,能夠構建BLAS,這在GPU上發生得很快。
就像處理場景圖同樣,只有兩個級別。
每一個實例都有一個ID,它描述了在哪裏找到與對象對應的着色器,如圖12所示。
Figure 12. Top level acceleration structure setup
再次,咱們有一個轉變,此次是在TLAS。若是咱們想在世界上移動一個完整的底部水平,咱們可使用這個,並有很是快速的從新擬合,而沒必要接觸實際的幾何。
您遵循與使用BLAS相同的原則,但咱們將獲取實例化信息,而不是幾何體。