视频系列:RTX实时射线追踪(上)
视频系列: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实时射线追踪(上)的更多相关文章
- 视频系列:RTX实时射线追踪(下)
视频系列:RTX实时射线追踪(下) Key things from part 4 光线有效载荷是从一个着色器传递到另一个着色器的结构. 这一切都发生在RTX的引擎下. 更小的有效载荷要好得多! 新的D ...
- Spring Cloud 系列之 Sleuth 链路追踪(三)
本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Sleuth 链路追踪(一) Spring Cloud 系列之 Sleuth 链路追踪(二) 本篇文章讲解 Sleu ...
- Spring Cloud 系列之 Sleuth 链路追踪(一)
随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发.可能使用不同的编程语言来实现.有可能布在了 ...
- 将HLSL射线追踪到Vulkan
将HLSL射线追踪到Vulkan Bringing HLSL Ray Tracing to Vulkan Vulkan标志 DirectX光线跟踪(DXR)允许您使用光线跟踪而不是传统的光栅化方法渲染 ...
- Spring Cloud 系列之 Sleuth 链路追踪(二)
本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Sleuth 链路追踪(一) 本篇文章讲解 Sleuth 基于 Zipkin 存储链路追踪数据至 MySQL,Elas ...
- iOS 通过 JSPatch 实时修复线上 bug!
JSPatch 是一个开源项目(Github链接),只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C ...
- 韩顺平细说Servlet视频系列之tom相关内容
韩顺平细说Servlet视频系列之tom相关内容 tomcat部署项目操作(注意:6.0版本以后的支持该操作,5.x版本需要另外配置?待验证!) 项目发布到tomcat的webapps文件下,然后启动 ...
- Hadoop系列004-Hadoop运行模式(上)
title: Hadoop系列004-Hadoop运行模式(上) date: 2018-11-20 14:27:00 updated: 2018-11-20 14:27:00 categories: ...
- wordpress如何利用插件添加优酷土豆等视频到自己的博客上
wordpress有时候需要添加优酷.土豆等网站的视频到自己的博客上,传统的分享方法不能符合电脑端和手机端屏幕大小的需求,又比较繁琐,怎样利用插件的方法进行添加呢,本视频向你介绍一款这样的插件——Sm ...
随机推荐
- ARM详细指令集
算术和逻辑指令 ADC : 带进位的加法 (Addition with Carry) ADC{条件}{S} <dest>, <op 1>, <op 2> dest ...
- 基于C++简单Windows API的socket编程(阻塞模式)
1. 概述:简单的基于Windows API的socket点对点聊天程序,为了方便初学者,本文代码均采用阻塞原理编写. 2. 代码样例 Server.cpp(服务端) #include <cst ...
- 段间跳转之TSS段
TR寄存器,TSS描述符,TSS段 TR寄存器与普通的段寄存器一样都有可见部分和不可见部分.TR的可见部分为16位为其段选择子,不可见部分是32位的TSS基地址和16位的大小. TSS描述符存在GDT ...
- 面试遇到的坑CSS篇 1
------------恢复内容开始------------ 1.display: none和 visibility: hidden 代码 <style type="text/css& ...
- 通过LinkedHashMap实现LRU算法
一.基于LinkedHashMap源码分析 方法调用流程(这里只是以put方法位例) put() -> putVal() -> afterNodeInsertion() -> rem ...
- java基础——简易计算器的实现
计算器: import java.util.Scanner;public class CalculateDemo { public static void main(String[] args ...
- Powershell阻止确认
要阻止弹出确认提示,需要设置-Confirm为false, new-VM -Name $hostname -Template $template -VMHost 10.11.31.5 -OSCusto ...
- [bug] Maven项目缺少Maven Dependencies
参考 https://blog.csdn.net/whitemiao/article/details/90177135
- Python 送你一棵圣诞树
Python 送你一棵圣诞树 2019-01-02阅读 8800 今天是圣诞节,先祝大家圣诞快乐!??? 有人要说了,圣诞节是耶稣诞生的日子,我又不信基督教,有啥好庆祝的.这你就有所不知了,Pyt ...
- shell基础之变量及表达式
本节内容 1. shell变量简介 2. 定义变量 3. 使用变量 4. 修改变量的值 5. 单引号和双引号的区别 6. 将命令的结果赋值给变量 7. 删除变量 8. 变量类型 9. 特殊变量列表 1 ...