视频系列: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 Getting started ray tracing tutorial
o GameWorks ray tracing overview
· Resources:
o Introduction to ray tracing with Vulkan
· DevTech:
视频系列:RTX实时射线追踪(下)的更多相关文章
- 视频系列:RTX实时射线追踪(上)
视频系列:RTX实时射线追踪(上) Video Series: Practical Real-Time Ray Tracing With RTX RTX在游戏和应用程序中引入了一个令人兴奋的和根本性的 ...
- Spring Cloud 系列之 Sleuth 链路追踪(一)
随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发.可能使用不同的编程语言来实现.有可能布在了 ...
- Spring Cloud 系列之 Sleuth 链路追踪(二)
本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Sleuth 链路追踪(一) 本篇文章讲解 Sleuth 基于 Zipkin 存储链路追踪数据至 MySQL,Elas ...
- Spring Cloud 系列之 Sleuth 链路追踪(三)
本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Sleuth 链路追踪(一) Spring Cloud 系列之 Sleuth 链路追踪(二) 本篇文章讲解 Sleu ...
- 将HLSL射线追踪到Vulkan
将HLSL射线追踪到Vulkan Bringing HLSL Ray Tracing to Vulkan Vulkan标志 DirectX光线跟踪(DXR)允许您使用光线跟踪而不是传统的光栅化方法渲染 ...
- 韩顺平细说Servlet视频系列之tom相关内容
韩顺平细说Servlet视频系列之tom相关内容 tomcat部署项目操作(注意:6.0版本以后的支持该操作,5.x版本需要另外配置?待验证!) 项目发布到tomcat的webapps文件下,然后启动 ...
- OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现
# OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-环 ...
- OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建
# OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-hom ...
- RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理
上一篇已经讲了Rabbitmq如何在Windows平台安装 不懂请移步: RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 一.理论 .net环境下,C#代码订阅 ...
随机推荐
- Linux-鸟菜-7-Linux文件系统-EXT
Linux-鸟菜-7-Linux文件系统-EXT Linux最传统的磁盘文件系统(filesystem)使用的是EXT2,所以先从EXT2开始了解. /dev/sd[a-p][1-128] 为实体磁 ...
- TortoiseGit:拉代码密码错误remote: Coding 提示: Authentication failed! 认证失败,请确认您输入了正确的账号密码
问题 在控制面板里找到凭据管理器 修改密码之后拉取密码
- valgrind 内存泄漏分析
概述 valgrind 官网 https://www.valgrind.org/ valgrind 是 Linux 业界主流且非常强大的内存泄漏检查工具.在其官网介绍中,内存检查(memcheck)只 ...
- NABCD-name not found
项目 内容 课程 2020春季计算机学院软件工程(罗杰 任健) 作业要求 团队项目选择 项目名称 FOTT 项目内容 在OCR-Form-Tools开源项目的基础上,扩展功能,支持演示更多的API,例 ...
- Java中对象池的本质是什么?(实战分析版)
简介 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提 ...
- rabbitmq介绍以及初步使用
什么是MQ? MQ(Message Queue):翻译为消息队列,通过典型的生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断地从队列中获取消息.因为消息的生产和消费都是异步的,而且只 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格
多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...
- .NET程序崩溃了怎么抓 Dump ? 我总结了三种方案
一:背景 1. 讲故事 最近几天接到了几个crash的求助,可能这几个朋友没玩过怎么去生成dump,只能手把手教,感觉也不是一个办法,所以有必要总结一下,后续再有朋友咨询的话,我就可以把这篇文章丢过去 ...
- JAVA基础——变量、常量
变量 java中,变量时最基本的存储单元,其要素包括变量名,变量类型和作用域. 注意事项: 每个变量都有类型,类型可以是基本类型,也可以是引用类型. 变量名必须是合法的标识符 变量声明时一条完整的语句 ...
- 查看linux系统是多少位,使用 getconf LONG_BIT
查看linux系统是多少位,使用 getconf LONG_BIT echo $HOSTTYPE