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

Video Series: Practical Real-Time Ray Tracing With RTX

RTX在游戏和应用程序中引入了一个令人兴奋的和根本性的转变。在这个视频系列中,NVIDIA工程师Martin Karl Lefrancois和Pascal Gautron帮助您开始实时光线跟踪。您将了解如何管理数据和渲染、加速结构和着色器如何工作,以及管道需要哪些新组件。我们还将包括本视频系列所基于的演示文稿中的关键幻灯片。

这些视频包含丰富的信息,但在您观看时不要担心记下东西;我们已经为您做了笔记。你可以从每一个以子弹形式呈现的片段中找到“关键的东西”。不过,我们强烈建议你在挖掘子弹之前先看视频,以确保你得到了正确的上下文。

Part 1: Ray Tracing: An Overview (3:15 min)

Key things from part 1

光线跟踪是一个与光栅化根本不同的渲染过程,如图1所示。

Figure 1. Instead of the triangle being projected on the screen, we take the position from the eye, send a ray through the pixel, and try to find the triangle underneath.

可以跟踪更多光线来计算该像素的阴影。

当你追踪光线时,它会击中最近的三角形并将其返回给你。

你不必解决它。它只会返回沿射线最近的三角形。

当场景中有很多三角形时会发生什么?如何快速处理?您需要一个加速结构,如图2所示。场景中的所有对象周围都有一个大的边界框,一种算法将拆分该框并重复执行此操作,直到该框仅包含几个三角形。然后,你就可以用这些三角形来测试了。

Figure 2. The construction of this acceleration structure is provided by RTX API.

Part 2: Data and Rendering (11:14 min)

Martin Karl解释了实时光线跟踪中数据的组成,并说明了加速度结构、管道和绑定表是如何协同工作的。

Key things from part 2

图形程序包括用户界面和交互、引擎更新、数据和渲染。我们对光线跟踪的数据和渲染组件特别感兴趣。

光栅包括顶点缓冲区和包含场景中所有三角形的索引,如图3所示,以及顶点和片段着色器。

Figure 3. Raster scene construction.

聚集一起,他们将有助于绘制你的场景。在光线跟踪中,必须将顶点和索引的缓冲区转换为加速度结构。同样,顶点和片段着色器必须转换为不同类型的着色系统。在光栅中,这些是分开的。在光线跟踪器中,你必须把这些东西结合起来。

底层加速度结构(BLAS)和顶层加速度结构(TLAS)代表两部分。为什么结构会这样分裂?让我们考虑一个城市、汽车和卡车的例子,如图4所示。

Figure 4. Splitting the acceleration structure into top and bottom halves improves performance.

一个加速结构支撑着城市。你把所有的建筑都放在里面。这都是静态的;你想渲染和光线跟踪那块非常快。

另一个加速结构支撑着汽车。在本例中,有两个实例使用它,因为同一辆车在场景中可以是不同的颜色。

最后,我们使用一个实例添加一个truck。

您可以轻松地重建顶层。汽车可以在整个城市移动,你不必重建整个系统。

你可以在底层重建。如果一个结构必须调整,比如说,一场车祸,你可以在不改变其他结构的情况下做出改变。

出于性能原因,您希望最小化底部结构的数量。追踪光线穿过两个重叠的BLA需要做两倍的工作来找到最近的交点…这一点很重要。

让我们看看光线跟踪管道,如图5所示。

Figure 5. The Ray Tracing Pipeline

管道由一组着色器组成,如图6所示。

首先是转到光线生成着色器的像素。这就是你决定开始的地方和你拍摄光线的方向,一个叫做光线生成的过程,以每像素为单位执行。这将为您准备的每个像素调用。

然后,它将转到遍历,并调用交叉点着色器。有一个内置的三角形(可以重写)。

Figure 6. Ray tracing shader architecture

还有一个任意命中材质球。这是内置在管道中的,但您可以覆盖它。例如,叶子形状由alpha纹理定义的树。你想让这个系统经历所有的困难,直到它真的碰到什么东西。它测试alpha,只有当叶子的身体受到真正的触碰,而不是仅仅触碰叶子的外部时,才会产生最接近的命中率。

您也可以将此用于阴影光线。

最接近的命中材质球在实际接触对象时起作用。最近的命中保存了阴影的代码。你也可以从那里追踪新的光线并追踪到你的影子。

当你什么都不碰的时候,你就会发现“小姐”的影子。你完全忽略了场景中的所有对象。例如,这将是您的环境着色器。

All together now

图7中的图表显示了完全使用光线跟踪着色器管道的可能性。

Figure 7. This diagram shows one possible data flow using ray tracing shaders.

你有一个TLAS(顶层加速结构)和一个BLAS(底层加速结构)。

管道是找到编译的着色器和声明所有着色器的位置。

着色绑定表将绑定着色器的元素。

它们共同维护一个复杂的关系,但不太复杂,如图8中的组装图所示。

Figure 8. This assembly view shows the relationship between the ray tracing pipeline and the shader binding table. This is what you have to do in DX12.

在渲染方面,光线跟踪只需要一个调用dispatchray。然后你可以移动到无人机,并渲染目标。

Figure 9. The rendering side of ray tracing uses just a single call.

Part 3: RTX Acceleration Structures (8:04 min)

Pascal现在提供了一个更深入的研究,当您尝试使用基于光栅的应用程序并使其与光线跟踪一起工作时会发生什么。

Key Things from Part 3

虽然本系列视频的焦点是直接X12,但基本原理都转移到Vulkan。阅读我们的博客文章关于Vulkan射线跟踪如何与RTX工作的更多细节。

Regarding acceleration structures

将场景分为底层实例(BLAS)

为每个实例生成底层加速结构

少BLAS更好

将动态对象保存在它们自己的BLAS中

对动态对象使用重新装配

生成顶层加速结构(TLAS)

How do we build the BLAS?

从描述符开始,如图10所示。

您将能够重用基于光栅的应用程序中使用的数据。通常,您可以指向顶点和索引缓冲区,并访问完全相同的数据。在基于光栅的应用程序中,可以使用与每个对象对应的任何范围来描述对象。

Figure 10. Setting up bottom-level acceleration structures

您可以将不同的对象放在一个BLAS中,并使用转换缓冲区来定位它们,该缓冲区会将它们烘焙到一个加速结构中。

三角形将被内部转换并放置在加速结构的正确位置。

我们构建了另一个描述符,它将给我们一些关于BLAS将是什么的信息。我们需要定义是否能够更新结构,如图11所示。

Figure 11. More BLAS setup requirements

Obtain pre-build information

确定产生的加速度结构的尺寸。

scratch数据大小描述了加速结构构建器在构建过程中需要多少内存。你需要分配这个内存。

在DX12中没有隐藏的分配;必须显式地执行所有操作。

scratch空间仅在构建期间使用。之后,您可以取消分配。

一旦分配了暂存空间,就可以重用所有的描述符。您可以创建另一个带有更新标志的描述符,用于可选的重新安装。最后,可以构建BLAS,这在GPU上发生得很快。

Build the TLAS

就像处理场景图一样,只有两个级别。

每个实例都有一个ID,它描述了在哪里找到与对象对应的着色器,如图12所示。

Figure 12. Top level acceleration structure setup

再次,我们有一个转变,这次是在TLAS。如果我们想在世界上移动一个完整的底部水平,我们可以使用这个,并有非常快速的重新拟合,而不必接触实际的几何。

您遵循与使用BLAS相同的原则,但我们将获取实例化信息,而不是几何体。

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

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

    视频系列:RTX实时射线追踪(下) Key things from part 4 光线有效载荷是从一个着色器传递到另一个着色器的结构. 这一切都发生在RTX的引擎下. 更小的有效载荷要好得多! 新的D ...

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

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

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

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

  4. 将HLSL射线追踪到Vulkan

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

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

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

  6. iOS 通过 JSPatch 实时修复线上 bug!

    JSPatch 是一个开源项目(Github链接),只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C ...

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

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

  8. Hadoop系列004-Hadoop运行模式(上)

    title: Hadoop系列004-Hadoop运行模式(上) date: 2018-11-20 14:27:00 updated: 2018-11-20 14:27:00 categories: ...

  9. wordpress如何利用插件添加优酷土豆等视频到自己的博客上

    wordpress有时候需要添加优酷.土豆等网站的视频到自己的博客上,传统的分享方法不能符合电脑端和手机端屏幕大小的需求,又比较繁琐,怎样利用插件的方法进行添加呢,本视频向你介绍一款这样的插件——Sm ...

随机推荐

  1. Thinkphp5之laypage分页插件的实现

    //一下是laypage所用到的 js <script type="text/javascript" src="__STATIC__/lib/laypage/1.2 ...

  2. android 代码中使用textAppearance

    一开始在代码中我以为使用tvAge.setTextAppearance(context, resid);这样的的方式就能行, 运行之后发现这个设置并未生效,于是到处搜索在代码中设置系统样式的的解决方法 ...

  3. (Py练习)数组元素调换

    # 输入数组,最大的元素与第一个元素调换,最小的与最后一个元素调换,输出数组 # 数组的输入输出.元素交换使用不同的函数来实现 import math p = 0 def inp(numbers): ...

  4. [CSP-J2019 江西] 道路拆除 题解

    发现大家都是将路径拆成三条链来做,这里提供一种暴力的乱搞方法. 思路 看到这一道题的第一想法就是跑最短路.可是仔细想想就发现,由于重合的路径只算一遍,所以导致两条最短路不一定是最优解. 接着,看到数据 ...

  5. burp-suite(Web安全测试工具)教程

    Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTTP 消息,持久性,认证,代 ...

  6. Python自动扫描出微信不是好友名单

    前言 最近找几个老友准备聊天发现几个已经被删除好友名单,做为潜水党多年的我已经不知道成为多少人的黑名单,但是好友列表却依然有不是好友的名单,面对庞大的好友数量想要清除谈何容易.虽然可以发消息给所有人, ...

  7. OO_Unit3_JML规格模式

    ---恢复内容开始--- [CSDN博客链接](https://blog.csdn.net/weixin_43387647/article/details/90451173) @[toc] ## 一. ...

  8. JVM内存溢出后服务还能运行吗

    文章开篇问一个问题吧,一个java程序,如果其中一个线程发生了OOM,那进程中的其他线程还能运行吗? 接下来做实验,看看JVM的六种OOM之后程序还能不能访问. 在这里我用的是一个springboot ...

  9. 21.File和IO流

    IO就可以对文件进行读写 File表示要读写的文件在哪,也可以对文件进行创建,删除等操作 小结: IO流是什么? 1.可以将数据从本地文件中读取出来 2.可以将数据从内存保存到本地文件 File类时什 ...

  10. ArrayList方法源码分析

    本文将从ArrayList类的存储结构.初始化.增删数据.扩容处理以及元素迭代等几个方面,分析该类常用方法的源码. 数据存储设计 该类用一个Object类型的数组存储容器的元素.对于容量为空的情况,提 ...