volumeFiltering演示了使用 3D 纹理和 3D 表面写入进行 3D 体积过滤。它从磁盘加载一个 3D 体积,并使用光线步进和 3D 纹理进行显示。
以下是该示例的主要内容和功能:
主要功能
-
3D 体积加载:
- 从磁盘加载 3D 体积数据,通常为医学成像数据或体积渲染数据。
-
3D 纹理:
- 使用 CUDA 的 3D 纹理功能来存储体积数据,以便高效地进行过滤和采样。
-
光线步进 (Ray Marching):
- 通过光线步进算法遍历体积数据,计算每个光线与体积的交点,从而渲染出体积效果。
-
体积过滤:
- 在光线步进过程中使用三线性插值等技术对体积数据进行过滤,以获得平滑的视觉效果。
应用场景
- 医学成像(如 CT、MRI 数据可视化)
- 科学计算和模拟
- 游戏和视觉特效中的体积效果
这个示例展示了如何利用 CUDA 的强大并行计算能力和 3D 纹理功能,来实现高效的体积数据处理和渲染。通过光线步进和体积过滤技术,可以创建出逼真的 3D 视觉效果。
光线追踪
光线追踪是一种渲染技术,可以通过渲染物理上准确的反射、折射、阴影和间接光照,真实地模拟场景及其物体的光照效果。光线追踪通过追踪光线从视图相机(决定你在场景中的视角)开始,穿过 2D 视平面(像素平面),进入 3D 场景,然后返回到光源,生成计算机图形图像。在穿越场景的过程中,光可能会从一个物体反射到另一个物体(产生反射),被物体遮挡(产生阴影),或者穿过透明或半透明的物体(产生折射)。所有这些相互作用结合在一起,产生最终像素的颜色和光照效果,然后在屏幕上显示。选择这种从眼睛/相机到光源的逆向追踪过程,因为它比从光源向多个方向追踪所有光线要高效得多。
另一种理解光线追踪的方法是,看看你周围的环境。你看到的物体是通过光束照亮的。现在反过来,追踪这些光束从你的眼睛到光与物体互动的路径。这就是光线追踪。
光线追踪的主要应用在计算机图形学中,包括非实时(电影和电视)和实时(视频游戏)应用。其他应用还包括建筑、工程和照明设计等领域。
接下来的部分将介绍渲染和光线追踪的基础知识,以及常用的术语。
光线追踪基础
- 光线投射是光线追踪算法中的一个过程,它通过从相机(眼睛位置)向图像平面中的每个像素发射一条或多条光线,然后测试这些光线是否与场景中的几何体(如三角形)相交。如果一条穿过像素并进入 3D 场景的光线与某个几何体相交,则确定从光线起点(相机或眼睛位置)到该几何体的距离,并且该几何体的颜色数据会贡献到最终像素的颜色上。这条光线还可能反弹并与其他物体相交,从中获取颜色和光照信息。
- 路径追踪是一种更为密集的光线追踪形式,它通过每个像素追踪数百或数千条光线,并在光线与物体反弹或穿透的过程中收集颜色和光照信息,直到到达光源。
- 包围体层次结构(BVH)是一种流行的光线追踪加速技术,使用基于树的“加速结构”,其中包含多个层次排列的包围盒(包围体),这些包围盒包围或环绕着场景几何体或几何体的不同部分。对每条光线进行场景中每个几何体的相交测试是低效且计算成本高的,而 BVH 是众多可以用来加速这一过程的技术和优化之一。BVH 可以以不同类型的树结构组织,每条光线只需使用深度优先树遍历过程测试 BVH,而不是与场景中的每个几何体进行测试。在第一次渲染场景之前,必须从源几何体创建 BVH 结构(称为 BVH 构建)。下一帧将需要基于场景变化进行新的 BVH 构建操作或 BVH 重新调整。
- 去噪滤波是一种先进的滤波技术,可以在不需要额外发射光线的情况下提高性能和图像质量。去噪可以显著改善由稀疏数据构建的、可能存在随机伪影、可见量化噪声或其他类型噪声的图像的视觉质量。去噪滤波尤其有效于减少光线追踪图像的渲染时间,并且可以从光线追踪器生成视觉上无噪声的高保真图像。去噪的应用包括实时光线追踪和交互式渲染。交互式渲染允许用户动态交互场景属性,并立即看到其更改在渲染图像中的更新结果。
渲染基础
光栅化是一种用于在二维屏幕上显示三维物体的技术。通过光栅化,屏幕上的物体由不同形状和大小的虚拟三角形或多边形网格构成。三角形的角点称为顶点,顶点包含许多信息,包括其在空间中的位置,以及关于颜色、纹理和“法线”的信息,法线用于确定物体表面的朝向。计算机将 3D 模型的三角形转换为 2D 屏幕上的像素或点。每个像素可以从三角形顶点中存储的数据中分配一个初始颜色值。进一步的像素处理或“着色”,包括根据场景中光源的照射改变颜色,以及应用一个或多个纹理,最终生成应用于像素的颜色。光栅化用于实时计算机图形中,尽管它仍然计算密集,但相比光线追踪要少得多。
混合光栅化与光线追踪
混合光栅化与光线追踪是一种同时使用光栅化和光线追踪来渲染游戏或其他应用场景的技术。光栅化可以确定可见物体,并以高性能良好渲染场景的许多区域。光线追踪最适合用于渲染物理上准确的反射、折射和阴影。两者结合使用,可以在保持高质量的同时实现良好的帧率。
利用 GPU 加速光线追踪
光线追踪是一种计算密集型技术。电影制作人传统上依赖于大量基于 CPU 的渲染农场,渲染复杂的特效仍然可能需要多天时间。GPU 可以比 CPU 更快速地渲染逼真的电影质量光线追踪场景,但受限于板载内存的容量,这决定了场景的复杂程度。Turing 架构增加了用于人工智能加速的张量核心,提供实时去噪功能,显著减少需要发射的光线数量,同时 RT 核心加速 BVH 遍历,这是光线追踪计算中最耗时的部分。这些硬件进步与构成 NVIDIA RTX 平台的强大软件 API 相结合,使得实时光线追踪在游戏引擎和数字内容创作应用中成为可能。
代码解读:
-
从磁盘load raw file
-
初始化和设置渲染参数:在主函数中初始化 CUDA 设备,设置图像和体积数据的尺寸。配置光线步进所需的参数,如光线步长、视角、光源位置等。
-
加载体积数据:使用辅助函数将 3D 体积数据加载到 GPU 内存中,并创建相应的 3D 纹理对象。
5-7执行 CUDA 内核:启动光线步进内核,该内核会针对每个像素发射光线,计算光线在体积中的路径。
8.使用光线追踪,找到与盒子的交点,然后沿光线从前到后推进,通过读取 3D 纹理作为位置,从 2D 层纹理中获取颜色,最后将颜色写入 PBO。
10.使用 OpenGL 绘制 2D 正方形,并将 2D 纹理应用于该正方形。将计算得到的颜色值写入输出图像缓冲区,并在屏幕上显示最终结果。