视频系列:RTX实时射线追踪(下)

Key things from part 4

光线有效载荷是从一个着色器传递到另一个着色器的结构。

这一切都发生在RTX的引擎下。

更小的有效载荷要好得多!

新的DirectX编译器允许您为着色器提供语义。

您可以同时编译多个着色器,并且仍然知道哪些着色器对哪些用途有用(图13)。
视频系列:RTX实时射线追踪(下)
Figure 13. Example of a ray tracing shaders working in concert

dispatch ray索引类似于CUDA中的线程ID;它标识当前正在运行的线程和图像的维度。
您描述一条光线,它具有原点、方向以及我们寻找交点的最小和最大距离。

图14显示需要调用一个新的指令调用TraceRay,它需要几个参数。
视频系列:RTX实时射线追踪(下)
Figure 14. Now we finally trace the ray using the TraceRay call.

首先是TLAS。

Raymask允许您屏蔽某些对象。例如,如果确定对象不投射阴影,则可以将光线遮罩与实例遮罩结合使用,以防止光线与对象相交。

应用一些偏移。第一个偏移量标识要用于给定对象的着色器。第二个偏移量描述了我们应该从着色器列表的哪里开始。

我们可以有几位合伙人。一个人可以看环境,一个人可以回来说,“什么都看不见”,等等。

最后,我们通过射线和有效载荷(图15)。有效载荷将直接返回。一旦我们调用TraceRay,我们就可以假设整个光线跟踪已经发生,并且有效载荷已满。

您可以将着色结果直接写入输出缓冲区(图15)。
视频系列:RTX实时射线追踪(下)
Figure 15. Writing the output buffer

避免递归!让raygen做重担。将递归光线跟踪展平到光线生成中的循环中会导致更少的堆栈管理。

在光栅中,只需在屏幕上投影三角形,然后插值属性。RTX给出了相交三角形的索引。然后您需要自己获取所有属性并对其进行插值,如图16中的代码示例所示。请注意,无论您决定使用何种布局,都需要能够访问几何体的顶点和索引缓冲区。
视频系列:RTX实时射线追踪(下)
Figure 16. Closest hit code sample. The primitive index tells you which triangle has been hit.

最近命中的着色器也可以发射光线,例如阴影。

您可以访问原始索引,该索引将生成在渲染期间被击中的三角形;然后我们可以进行插值。

然后编写有效载荷,着色器就完成了。

为了避免递归,您可以让您的光线生成携带稍大的负载。命中将返回其命中信息(例如:我在该坐标处命中了这个三角形),然后光线生成可以从那里生成另一条光线,然后继续,对第二次反弹的贡献进行加权,依此类推。在这个过程中,我们最终会得到更少的堆栈管理和更少的内存流量。

最后一种类型的着色器是miss着色器。

miss着色器直接写入负载,通常返回一个固定值,可以是任何值(图17)。
视频系列:RTX实时射线追踪(下)
Figure 17. Miss shader code example

Part5: Ray Tracing Pipeline (8:04 Min)

Pascal深入研究了光线跟踪管道的结构,分解了关键组件。

Key things from part 5

既然已经定义了所有的着色器,让我们看看如何将其组装成可以渲染的对象。(您实际上正在创建光线跟踪过程的可执行文件)。

DX12中的光线跟踪管道由一系列子对象组成,如图18所示。例如,可以为不同的材质球创建子对象,为如何将材质球装配在一起创建子对象,等等。
视频系列:RTX实时射线追踪(下)
Figure 18. D3D12 ray tracing uses sub-objects which consist of various shaders in useful configurations

要查看的第一个子对象是库(图19)。

将代码提供给DirectX着色器编译器(DXC),后者输出DLXIL库。可以作为子对象运行的。
你会为我们所有的阴影处理。
视频系列:RTX实时射线追踪(下)
Figure 19. Libraries as a sub-object

Hitgroup描述一个给定类型的着色器在一个曲面上可能发生的所有事情。它包括交集着色器、任意命中和近程命中着色器,如图20所示。

这些结合起来给了我们所有需要的代码。

重要的是要注意交叉点和任何命中着色器。我们有一些内置的交叉三角形(并没有做任何事情的情况下,任何击中)。

在可能的情况下,将交叉点和任何命中都保留为空。
视频系列:RTX实时射线追踪(下)
Figure 20. Hit groups comprise shaders involved with intersection of objects

另一个子对象是着色器配置,它描述要使用的负载的大小。着色器配置定义用于相交的属性的大小。

保持尽可能小;内置的交集着色器返回2个浮点数。

DXR中的关联将着色器与负载和属性属性关联。你需要明确地做到这一点。图21说明了如何执行此操作。
视频系列:RTX实时射线追踪(下)
Figure 21. Configuring an association sub-object

DXR中的每个着色器都包含一个路径签名,该签名描述将要访问的所有资源,如图22所示。
使用的每个着色器都需要自己的根路径签名。

路径签名还通过一个关联对象。
视频系列:RTX实时射线追踪(下)
Figure 22. Root signature association

存在一个管道配置,它决定您可以进行多少次反弹(图23)。

通过在raygen中展开成一个循环来避免递归。
视频系列:RTX实时射线追踪(下)
Figure 23. The pipeline configuration enables you to specify maximum ray bounces

现在让我们检查shader绑定表,它将几何体与我们将要执行的shader关联起来,如图24所示。

着色器绑定表有许多条目、着色器的描述符以及指向外部资源的所有指针。

它需要遵循您提供的路径签名的确切布局。

每种材质球类型都需要一个固定大小的项。
视频系列:RTX实时射线追踪(下)
Figure 24. The shader binding table points to external resources, among other things

描述符设置决定了如何解释着色绑定表,如图25所示。

您需要指明在哪里可以找到光线生成遮挡阴影。

必须在光线生成、着色器、命中组和未命中着色器中定义一个项的大小

还必须提供要渲染的图像的尺寸。
视频系列:RTX实时射线追踪(下)
Figure 25. Descriptor setup code example

现在我们已经渲染了第一个图像,让我们考虑阴影。

下面是阴影光线的一些简单着色器示例,如图25所示。

如果我们击中了什么东西,那就是“真的”。

如果我们不这样做,那就是“错误的”。
视频系列:RTX实时射线追踪(下)
Figure 26. Simple shader code examples ofr adding shadow rays

在我们最初的最近命中着色器中,我们需要添加另一个跟踪光线,如图26所示。
这一次我们将抵消我们的命中组说,“我想要第二个命中组的对象,我要打,第二个错过”。
视频系列:RTX实时射线追踪(下)
Figure 27. Closest hit shadow ray example

在我们最初的最近命中着色器中,我们需要添加另一个跟踪光线。

这一次我们将抵消我们的命中组说,“我想要第二个命中组的对象,我要打,第二个错过。”

Part 6: Additional help with ray tracing (3:47 min)

Martin和Pascal提供了下一步的指导,并详细介绍了一系列支持材料,这些材料将帮助您在应用程序中采用实时

光线跟踪。

NVIDIA将继续为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:

相关文章: