视频系列: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. hdu1316 大数

    题意:      给你一个区间,问这个区间有多少个斐波那契数. 思路:      水的大数,可以直接模拟,要是懒可以用JAVA,我模拟的,打表打到1000个就足够用了... #include<s ...

  2. PAT 乙级 -- 1007 -- 素数对猜想

    题目简述 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数."素数对猜想"认为"存在无穷 ...

  3. UVA10970大块巧克力

    题意:       题意,给你一块n*m的巧克力,最终是要把他切成n*m快小蛋糕,问最小切多少刀?每一刀只能把一个整体切成两个整体,不可以把两个整体分成四个整体,就是说只能切一个地方. 思路:     ...

  4. The 2014 ACM-ICPC Asia Mudanjiang Regional First Round C

    题意:       这个是The 2014 ACM-ICPC Asia Mudanjiang Regional First Round 的C题,这个题目当时自己想的很复杂,想的是优先队列广搜,然后再在 ...

  5. PhotoShop 第一课 功能认识

    功能认识 1.基本界面 可以对各工具栏进行编辑,对工具/栏目进行勾选添加和整合并搭建自己的专属操作页面. 2.画布设置 拍照或者画画都需要一个东西来呈现这个东西叫做画布(可以通过导航栏-文件-新建画布 ...

  6. 渗透测试神器Cobalt Strike的使用

    目录 Cobalt Strike Cobalt Strike的安装 Cobalt Strike的使用 创建监听器:

  7. Cauchy-Binet 公式的应用

    Binet-Cauchy 公式 我们知道,方阵的行列式不是方阵的线性函数,即对 \(\forall \lambda\in F,A,B\in F^{n\times n}\),有 \(det(A+B)\n ...

  8. vscode 将本地项目上传到github、从github克隆项目以及删除github上的某个文件夹

    一.将本地项目上传到github 1.创建本地仓库(文件夹) mkdir study//创建文件夹studycd study //进入study文件夹 2.通过命令git init把这个文件夹变成Gi ...

  9. 基于texlive定制chemfig化学式转换Python服务镜像

    chemfig 据别人介绍,在绘制平面分子式,乃至化学反应式.机理图时,大家使用的基本都是ChemDraw.当然ChemDraw是一款强大的软件,无论是平面的还是立体的分子结构式都能毫不费力地绘制出来 ...

  10. 10.qml-组件、Loader、Component介绍

    1.组件介绍 一个组件通常由一个qml文件定义(单独文件定义组件), 实际也可以在qml里面通过Component对象来嵌入式定义组件 (4小节讲解). Component对象封装的内容默认不会显示, ...