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

视频系列:RTX实时射线追踪(下)的更多相关文章

  1. 视频系列:RTX实时射线追踪(上)

    视频系列:RTX实时射线追踪(上) Video Series: Practical Real-Time Ray Tracing With RTX RTX在游戏和应用程序中引入了一个令人兴奋的和根本性的 ...

  2. Spring Cloud 系列之 Sleuth 链路追踪(一)

    随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发.可能使用不同的编程语言来实现.有可能布在了 ...

  3. Spring Cloud 系列之 Sleuth 链路追踪(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Sleuth 链路追踪(一) 本篇文章讲解 Sleuth 基于 Zipkin 存储链路追踪数据至 MySQL,Elas ...

  4. Spring Cloud 系列之 Sleuth 链路追踪(三)

    本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Sleuth 链路追踪(一) Spring Cloud 系列之 Sleuth 链路追踪(二) 本篇文章讲解 Sleu ...

  5. 将HLSL射线追踪到Vulkan

    将HLSL射线追踪到Vulkan Bringing HLSL Ray Tracing to Vulkan Vulkan标志 DirectX光线跟踪(DXR)允许您使用光线跟踪而不是传统的光栅化方法渲染 ...

  6. 韩顺平细说Servlet视频系列之tom相关内容

    韩顺平细说Servlet视频系列之tom相关内容 tomcat部署项目操作(注意:6.0版本以后的支持该操作,5.x版本需要另外配置?待验证!) 项目发布到tomcat的webapps文件下,然后启动 ...

  7. OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现

    # OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-环 ...

  8. OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建

    # OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-hom ...

  9. RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理

    上一篇已经讲了Rabbitmq如何在Windows平台安装 不懂请移步: RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 一.理论 .net环境下,C#代码订阅 ...

随机推荐

  1. POJ1151基本的扫描线求面积

    题意:      给定n个矩形的对角坐标,分别是左下和右上,浮点型,求矩形覆盖的面积. 思路:       基本的线段树扫描线求面积,没有坑点,不解释了,提示一点,有的题尤其是线段树扫描线的题需要离散 ...

  2. UVA11375火柴(递推+大数)

    题意:       给你n根火柴,问你能组成多少种数字,比如3根可以组成1或者7,组成的数字中不能有前导0, 思路:       我们开一个数组,d[i]记录用i跟火柴可以组成多少种数字,则更新状态是 ...

  3. 内核模式下的线程同步的分析(Windows核心编程)

    内核模式下的线程同步 内核模式下的线程同步是用户模式下的线程同步的扩展,因为用户模式下的线程同步有一定的局限性.但用户模式下线程同步的好处是速度快,不需要切换到内核模式(需要额外的 CPU 时间).通 ...

  4. JWT(Json Web Token)认证

    目录 JWT(Json Web Token) JWT的数据结构 JWT的用法 JWT验证流程

  5. CVE-2018-0802:Microsoft office 公式编辑器 font name 字段二次溢出漏洞调试分析

    \x01 前言 CVE-2018-0802 是继 CVE-2017-11882 发现的又一个关于 font name 字段的溢出漏洞,又称之为 "第二代噩梦公式",巧合的是两个漏洞 ...

  6. Docker用Dockerfile定制镜像

    用Dockerfile定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那之前提示的无法重复的问题 ...

  7. 2.逆向分析Hello World!程序-上

    先写一个HelloWorld程序(vs2015 / C++) 编译链接生成可执行文件XX.exe,然后用OD[OllyDbg]打开调试: 代码窗口:默认用于显示反汇编代码,还用于各种注释.标签,分析代 ...

  8. [LeetCode每日一题]88. 合并两个有序数组

    [LeetCode每日一题]88. 合并两个有序数组 问题 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 初始化 n ...

  9. Mac下配置Git 的全局忽略文件

    $ git config --global core.excludesfile ~/.gitignore_global $ vim ~/.gitignore_global #配置文件参考如下 # fo ...

  10. PHP基础—PHP的数据类型与常量使用