视频系列:RTX实时射线追踪(下)
視頻系列:RTX實時射線追蹤(下)
Key things from part 4
光線有效載荷是從一個著色器傳遞到另一個著色器的結構。
這一切都發(fā)生在RTX的引擎下。
更小的有效載荷要好得多!
新的DirectX編譯器允許您為著色器提供語義。
您可以同時編譯多個著色器,并且仍然知道哪些著色器對哪些用途有用(圖13)。
Figure 13. Example of a ray tracing shaders working in concert
dispatch ray索引類似于CUDA中的線程ID;它標識當前正在運行的線程和圖像的維度。
您描述一條光線,它具有原點、方向以及我們尋找交點的最小和最大距離。
圖14顯示需要調用一個新的指令調用TraceRay,它需要幾個參數(shù)。
Figure 14. Now we finally trace the ray using the TraceRay call.
首先是TLAS。
Raymask允許您屏蔽某些對象。例如,如果確定對象不投射陰影,則可以將光線遮罩與實例遮罩結合使用,以防止光線與對象相交。
應用一些偏移。第一個偏移量標識要用于給定對象的著色器。第二個偏移量描述了我們應該從著色器列表的哪里開始。
我們可以有幾位合伙人。一個人可以看環(huán)境,一個人可以回來說,“什么都看不見”,等等。
最后,我們通過射線和有效載荷(圖15)。有效載荷將直接返回。一旦我們調用TraceRay,我們就可以假設整個光線跟蹤已經(jīng)發(fā)生,并且有效載荷已滿。
您可以將著色結果直接寫入輸出緩沖區(qū)(圖15)。
Figure 15. Writing the output buffer
避免遞歸!讓raygen做重擔。將遞歸光線跟蹤展平到光線生成中的循環(huán)中會導致更少的堆棧管理。
在光柵中,只需在屏幕上投影三角形,然后插值屬性。RTX給出了相交三角形的索引。然后您需要自己獲取所有屬性并對其進行插值,如圖16中的代碼示例所示。請注意,無論您決定使用何種布局,都需要能夠訪問幾何體的頂點和索引緩沖區(qū)。
Figure 16. Closest hit code sample. The primitive index tells you which triangle has been hit.
最近命中的著色器也可以發(fā)射光線,例如陰影。
您可以訪問原始索引,該索引將生成在渲染期間被擊中的三角形;然后我們可以進行插值。
然后編寫有效載荷,著色器就完成了。
為了避免遞歸,您可以讓您的光線生成攜帶稍大的負載。命中將返回其命中信息(例如:我在該坐標處命中了這個三角形),然后光線生成可以從那里生成另一條光線,然后繼續(xù),對第二次反彈的貢獻進行加權,依此類推。在這個過程中,我們最終會得到更少的堆棧管理和更少的內存流量。
最后一種類型的著色器是miss著色器。
miss著色器直接寫入負載,通常返回一個固定值,可以是任何值(圖17)。
Figure 17. Miss shader code example
Part5: Ray Tracing Pipeline (8:04 Min)
Pascal深入研究了光線跟蹤管道的結構,分解了關鍵組件。
Key things from part 5
既然已經(jīng)定義了所有的著色器,讓我們看看如何將其組裝成可以渲染的對象。(您實際上正在創(chuàng)建光線跟蹤過程的可執(zhí)行文件)。
DX12中的光線跟蹤管道由一系列子對象組成,如圖18所示。例如,可以為不同的材質球創(chuàng)建子對象,為如何將材質球裝配在一起創(chuàng)建子對象,等等。
Figure 18. D3D12 ray tracing uses sub-objects which consist of various shaders in useful configurations
要查看的第一個子對象是庫(圖19)。
將代碼提供給DirectX著色器編譯器(DXC),后者輸出DLXIL庫。可以作為子對象運行的。
你會為我們所有的陰影處理。
Figure 19. Libraries as a sub-object
Hitgroup描述一個給定類型的著色器在一個曲面上可能發(fā)生的所有事情。它包括交集著色器、任意命中和近程命中著色器,如圖20所示。
這些結合起來給了我們所有需要的代碼。
重要的是要注意交叉點和任何命中著色器。我們有一些內置的交叉三角形(并沒有做任何事情的情況下,任何擊中)。
在可能的情況下,將交叉點和任何命中都保留為空。
Figure 20. Hit groups comprise shaders involved with intersection of objects
另一個子對象是著色器配置,它描述要使用的負載的大小。著色器配置定義用于相交的屬性的大小。
保持盡可能小;內置的交集著色器返回2個浮點數(shù)。
DXR中的關聯(lián)將著色器與負載和屬性屬性關聯(lián)。你需要明確地做到這一點。圖21說明了如何執(zhí)行此操作。
Figure 21. Configuring an association sub-object
DXR中的每個著色器都包含一個路徑簽名,該簽名描述將要訪問的所有資源,如圖22所示。
使用的每個著色器都需要自己的根路徑簽名。
路徑簽名還通過一個關聯(lián)對象。
Figure 22. Root signature association
存在一個管道配置,它決定您可以進行多少次反彈(圖23)。
通過在raygen中展開成一個循環(huán)來避免遞歸。
Figure 23. The pipeline configuration enables you to specify maximum ray bounces
現(xiàn)在讓我們檢查shader綁定表,它將幾何體與我們將要執(zhí)行的shader關聯(lián)起來,如圖24所示。
著色器綁定表有許多條目、著色器的描述符以及指向外部資源的所有指針。
它需要遵循您提供的路徑簽名的確切布局。
每種材質球類型都需要一個固定大小的項。
Figure 24. The shader binding table points to external resources, among other things
描述符設置決定了如何解釋著色綁定表,如圖25所示。
您需要指明在哪里可以找到光線生成遮擋陰影。
必須在光線生成、著色器、命中組和未命中著色器中定義一個項的大小
還必須提供要渲染的圖像的尺寸。
Figure 25. Descriptor setup code example
現(xiàn)在我們已經(jīng)渲染了第一個圖像,讓我們考慮陰影。
下面是陰影光線的一些簡單著色器示例,如圖25所示。
如果我們擊中了什么東西,那就是“真的”。
如果我們不這樣做,那就是“錯誤的”。
Figure 26. Simple shader code examples ofr adding shadow rays
在我們最初的最近命中著色器中,我們需要添加另一個跟蹤光線,如圖26所示。
這一次我們將抵消我們的命中組說,“我想要第二個命中組的對象,我要打,第二個錯過”。
Figure 27. Closest hit shadow ray example
在我們最初的最近命中著色器中,我們需要添加另一個跟蹤光線。
這一次我們將抵消我們的命中組說,“我想要第二個命中組的對象,我要打,第二個錯過。”
Part 6: Additional help with ray tracing (3:47 min)
Martin和Pascal提供了下一步的指導,并詳細介紹了一系列支持材料,這些材料將幫助您在應用程序中采用實時
光線跟蹤。
NVIDIA將繼續(xù)為RTX構建一個“助手工具箱”。其他資源包括:
·
DXR Blog
·
Raytracing links:
o More on NVIDIA RTX
o Getting started ray tracing tutorial
o GameWorks ray tracing overview
· Resources:
o DXR Introduction blog post
o More on NVIDIA Optix
o Introduction to ray tracing with Vulkan
·
DevTech:
總結
以上是生活随笔為你收集整理的视频系列:RTX实时射线追踪(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视频系列:RTX实时射线追踪(上)
- 下一篇: 基于TensorRT车辆实时推理优化