视频系列: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: