視頻系列:RTX實時射線追蹤(下)工具
光線有效載荷是從一個着色器傳遞到另外一個着色器的結構。 佈局
這一切都發生在RTX的引擎下。 post
更小的有效載荷要好得多! spa
新的DirectX編譯器容許您爲着色器提供語義。 線程
您能夠同時編譯多個着色器,而且仍然知道哪些着色器對哪些用途有用(圖13)。3d
Figure 13. Example of a ray tracing shaders working in concert指針
dispatch ray索引相似於CUDA中的線程ID;它標識當前正在運行的線程和圖像的維度。 code
您描述一條光線,它具備原點、方向以及咱們尋找交點的最小和最大距離。 視頻
圖14顯示須要調用一個新的指令調用TraceRay,它須要幾個參數。對象
Figure 14. Now we finally trace the ray using the TraceRay
call.
首先是TLAS。
Raymask容許您屏蔽某些對象。例如,若是肯定對象不投射陰影,則能夠將光線遮罩與實例遮罩結合使用,以防止光線與對象相交。
應用一些偏移。第一個偏移量標識要用於給定對象的着色器。第二個偏移量描述了咱們應該從着色器列表的哪裏開始。
咱們能夠有幾位合夥人。一我的能夠看環境,一我的能夠回來講,「什麼都看不見」,等等。
最後,咱們經過射線和有效載荷(圖15)。有效載荷將直接返回。一旦咱們調用TraceRay,咱們就能夠假設整個光線跟蹤已經發生,而且有效載荷已滿。
您能夠將着色結果直接寫入輸出緩衝區(圖15)。
Figure 15. Writing the output buffer
避免遞歸!讓raygen作重擔。將遞歸光線跟蹤展平到光線生成中的循環中會致使更少的堆棧管理。
在光柵中,只需在屏幕上投影三角形,而後插值屬性。RTX給出了相交三角形的索引。而後您須要本身獲取全部屬性並對其進行插值,如圖16中的代碼示例所示。請注意,不管您決定使用何種佈局,都須要可以訪問幾何體的頂點和索引緩衝區。
Figure 16. Closest hit code sample. The primitive index tells you which triangle has been hit.
最近命中的着色器也能夠發射光線,例如陰影。
您能夠訪問原始索引,該索引將生成在渲染期間被擊中的三角形;而後咱們能夠進行插值。
而後編寫有效載荷,着色器就完成了。
爲了不遞歸,您可讓您的光線生成攜帶稍大的負載。命中將返回其命中信息(例如:我在該座標處命中了這個三角形),而後光線生成能夠從那裏生成另外一條光線,而後繼續,對第二次反彈的貢獻進行加權,依此類推。在這個過程當中,咱們最終會獲得更少的堆棧管理和更少的內存流量。
最後一種類型的着色器是miss着色器。
miss着色器直接寫入負載,一般返回一個固定值,能夠是任何值(圖17)。
Figure 17. Miss shader code example
Pascal深刻研究了光線跟蹤管道的結構,分解了關鍵組件。
既然已經定義了全部的着色器,讓咱們看看如何將其組裝成能夠渲染的對象。(您實際上正在建立光線跟蹤過程的可執行文件)。
DX12中的光線跟蹤管道由一系列子對象組成,如圖18所示。例如,能夠爲不一樣的材質球建立子對象,爲如何將材質球裝配在一塊兒建立子對象,等等。
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描述一個給定類型的着色器在一個曲面上可能發生的全部事情。它包括交集着色器、任意命中和近程命中着色器,如圖20所示。
這些結合起來給了咱們全部須要的代碼。
重要的是要注意交叉點和任何命中着色器。咱們有一些內置的交叉三角形(並無作任何事情的狀況下,任何擊中)。
在可能的狀況下,將交叉點和任何命中都保留爲空。
Figure 20. Hit groups comprise shaders involved with intersection of objects
另外一個子對象是着色器配置,它描述要使用的負載的大小。着色器配置定義用於相交的屬性的大小。
保持儘量小;內置的交集着色器返回2個浮點數。
DXR中的關聯將着色器與負載和屬性屬性關聯。你須要明確地作到這一點。圖21說明了如何執行此操做。
Figure 21. Configuring an association sub-object
DXR中的每一個着色器都包含一個路徑簽名,該簽名描述將要訪問的全部資源,如圖22所示。
使用的每一個着色器都須要本身的根路徑簽名。
路徑簽名還經過一個關聯對象。
Figure 22. Root signature association
存在一個管道配置,它決定您能夠進行多少次反彈(圖23)。
經過在raygen中展開成一個循環來避免遞歸。
Figure 23. The pipeline configuration enables you to specify maximum ray bounces
如今讓咱們檢查shader綁定表,它將幾何體與咱們將要執行的shader關聯起來,如圖24所示。
着色器綁定表有許多條目、着色器的描述符以及指向外部資源的全部指針。
它須要遵循您提供的路徑簽名的確切佈局。
每種材質球類型都須要一個固定大小的項。
Figure 24. The shader binding table points to external resources, among other things
描述符設置決定了如何解釋着色綁定表,如圖25所示。
您須要指明在哪裏能夠找到光線生成遮擋陰影。
必須在光線生成、着色器、命中組和未命中着色器中定義一個項的大小
還必須提供要渲染的圖像的尺寸。
Figure 25. Descriptor setup code example
如今咱們已經渲染了第一個圖像,讓咱們考慮陰影。
下面是陰影光線的一些簡單着色器示例,如圖25所示。
若是咱們擊中了什麼東西,那就是「真的」。
若是咱們不這樣作,那就是「錯誤的」。
Figure 26. Simple shader code examples ofr adding shadow rays
在咱們最初的最近命中着色器中,咱們須要添加另外一個跟蹤光線,如圖26所示。
這一次咱們將抵消咱們的命中組說,「我想要第二個命中組的對象,我要打,第二個錯過」。
Figure 27. Closest hit shadow ray example
在咱們最初的最近命中着色器中,咱們須要添加另外一個跟蹤光線。
這一次咱們將抵消咱們的命中組說,「我想要第二個命中組的對象,我要打,第二個錯過。」
Martin和Pascal提供了下一步的指導,並詳細介紹了一系列支持材料,這些材料將幫助您在應用程序中採用實時
光線跟蹤。
NVIDIA將繼續爲RTX構建一個「助手工具箱」。其餘資源包括:
· DXR Blog
· Raytracing links:
o Getting started ray tracing tutorial
o GameWorks ray tracing overview
· Resources:
o Introduction to ray tracing with Vulkan
· DevTech: