zoukankan      html  css  js  c++  java
  • 视频系列:RTX实时射线追踪(下)

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

    Key things from part 4

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

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

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

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

    您可以同时编译多个着色器,并且仍然知道哪些着色器对哪些用途有用(图13)。

    Figure 13. Example of a ray tracing shaders working in concert

    dispatch ray索引类似于CUDA中的线程ID;它标识当前正在运行的线程和图像的维度。             

    您描述一条光线,它具有原点、方向以及我们寻找交点的最小和最大距离。             

    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

    Part 5: Ray Tracing Pipeline (8:04 Min)

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

    Key things from part 5

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

    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

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

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

    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:

  • 相关阅读:
    Hadoop生态圈-Hive快速入门篇之HQL的基础语法
    Hadoop生态圈-Hive快速入门篇之Hive环境搭建
    Hadoop生态圈-zookeeper的API用法详解
    Hadoop生态圈-zookeeper完全分布式部署
    Hadoop基础-MapReduce的工作原理第一弹
    Hadoop基础-HDFS的读取与写入过程
    java基础-回调函数(callback)
    Hadoop基础-网络拓扑机架感知及其实现
    Hadoop基础-HDFS数据清理过程之校验过程代码分析
    Hadoop基础-Protocol Buffers串行化与反串行化
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/13173271.html
Copyright © 2011-2022 走看看