视频系列: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相同的原则,但我们将获取实例化信息,而不是几何体。