GAMES202 笔记-实时光线追踪
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GAMES202 笔记-实时光线追踪相关的知识,希望对你有一定的参考价值。
参考技术A RTX是一种硬件架构,能够更方便的追踪光线。 每秒能处理10G的光线(指一个像素的样本,sample per pixel),但并不是全程算力都在处理光线,还会做降噪等工作。 所以在RTRT中,我们只能做到1SPP的光追精度。
RTRT在做什么:阴影、反射和镜面反射、环境光遮蔽、全局光照(光线追踪适合做的事)
RTX处理的反射情况非常多,因为glossy的表面更容易做RTRT,diffuse倒更复杂
路径追踪是基于蒙特卡洛积分的方法,本身会产生噪声,采样的样本越多噪声越小,RTRT使用了1SPP的方法,会产生非常大的噪声。所以 RTRT的核心技术是降噪 ,如何从噪声图生成清晰的图。
降噪目的是:在1SPP的前提下,进行降噪,达到画面质量要求(没有过模糊,没有artifacts,保留了所有细节),并高效处理。
使用切边滤波系列(SF,AAF,FSF,MAAF)、离线滤波方法(IPP,BM3D,APR)、深度学习,等降噪方法对RTRT降噪不可能。
G-buffer
G-buffer:几何缓冲区:在渲染的过程中获得的免费的 屏幕空间 信息,比如逐像素深度、法线、世界坐标、直接光照结果、反照率kd等等。是屏幕空间的信息。也可以都各自保存进gbuffer中,方便后续使用。
是工业界常用的解决方法。关键思路: 假设前一帧被降噪完毕,并假设帧与帧间的连续性 。使用 motion vector 寻找前一帧的位置,将前一帧的结果复用。相当于增加了SPP。
motion vector:描述了屏幕空间中的物体在帧与帧之间运动的相对位置(上一帧像素对应的片元,与下一帧该片元对应的像素位置的相对移动)
Back Projection
要找到当前帧某一像素的内容,对应上一帧哪个像素,Back Projection就是求解motion vector的方法。
时域滤波的问题:
解决方法:主要是clamping和detection。
上文介绍了如何实现时域滤波,在时域滤波前我们会对1SPP的图像进行一次空间域的滤波,这次空间与的滤波可以有效地把原图降噪。
空间域滤波最常用的方法是使用 基于距离的高斯滤波核 进行滤波。这种滤波考虑的部分大概是 范围内对中心像素有贡献。
我们在对原图进行滤波时,要首先明确: 不是所有的高频信息就全是噪声 ,当然 也不是低频信息中就没有噪声 。于是我们需要保留有用的高频信息。
双边滤波基于一个观察: 当此处颜色变化非常剧烈,我们认为是边界 。
所以双边滤波的思路是: 找到一个保留边界的方法 ——如果像素 与像素 的颜色差异非常大,就让像素 贡献少一些;仅仅向滤波核添加一些控制的方法就可得到。
我们可以看到:高斯滤波提出了一个滤波标准,即两像素之间的距离;双边滤波提出了两个滤波标准,即像素位置距离和颜色距离;那么我们也可以使用更多的特征来帮助滤波。由此而提出的联合双边滤波是非常适用于RTRT下的滤波。
使用G-buffer,作为新的标准帮助滤波 。因为G-buffer是 完全没有噪声 的,G-buffer在光栅化过程中生成,和光线多次弹射无关。联合双边滤波还可以考虑其他的标准,每一个标准的σ和μ都可以单独考虑,滤波的阈值(多大距离算大)也可以主观设置
例如下图中:AB之间深度差距过大,BC间法线差距过大,DE间颜色差距过大
还有一个问题:我们滤波过程中所用的滤波核是NxN大小的,对于每个着色点的滤波都要遍历它NxN范围内的邻居,开销很大。对于小滤波核来说可以接受,但是对于大滤波核,开销巨大。
对于大滤波核有两种 加速滤波的办法 :
由于outlier的亮度会非常大,导致滤波后它的亮度会贡献到周围点,形成块状亮斑,所以要在滤波前将outlier检测并剔除。但是由于outlier的结果也是合理的, 剔除outlier导致能量不守恒 ,但是RTRT领域为了效率只能这样做。
在讲述高斯滤波和双边滤波时提到,我们需要判断高频信息属于噪声还是图像信息,保留有用的高频信息。
SVGF与在时空上降噪的方法差不多,SVGF增加了偏差分析和其他的技巧。
主要思想: SVGF是一种联合双边滤波
它通过三个因素指导滤波:
通过循环神经网络在时域上,基于Gbuffer和1SPP的渲染图,从而计算降噪的渲染图。
如何在现代 OpenGL 中进行光线追踪?
【中文标题】如何在现代 OpenGL 中进行光线追踪?【英文标题】:How to do ray tracing in modern OpenGL? 【发布时间】:2011-04-09 16:40:20 【问题描述】:所以我现在应该开始为我的单色模型照明。测试应用程序是仅用于实现最新方法的测试用例,因此我意识到理想情况下它应该实现光线追踪(因为理论上,它可能在几年内成为实时图形的理想选择)。
但是我从哪里开始呢?
假设我从未在旧的 OpenGL 中做过光照,所以我会直接使用非弃用的方法。
应用程序当前已正确设置顶点缓冲区对象、顶点、法线和颜色输入,并且它可以正确地在空间中以纯色绘制和转换模型。
是否有一个信息来源可以从平面彩色顶点到通过 GLSL 获得正确最终结果所需的所有信息?理想情况下,可以使用任何其他可能需要的其他照明方法来补充它。
【问题讨论】:
【参考方案1】:我不建议在 OpenGL 中尝试实际的光线追踪,因为你需要很多技巧和窍门,如果你问我,这样做根本没有意义。 如果您想在 GPU 上进行光线追踪,您应该使用任何 GPGPU 语言,例如 CUDA 或 OpenCL,因为它使事情变得容易得多(但仍然远非微不足道)。
为了进一步说明问题: 对于光线追踪,您需要追踪辅助光线并测试与几何体的相交。因此,您需要在着色器中以某种巧妙的方式访问几何体,但是在片段着色器中,如果您不将几何体“编码”存储到某个纹理中,则无法访问该几何体。顶点着色器本身也不为您提供此几何信息,并且几何着色器只知道邻居,所以这里的麻烦已经开始了。 接下来,您需要加速数据结构来获得任何合理的帧速率。但是,遍历例如着色器中的 Kd-Tree 非常困难,如果我没记错的话,有几篇论文专门讨论这个问题。 不过,如果你真的想走这条路,关于这个主题的论文很多,应该不难找到。
光线追踪器需要精心设计的访问模式和缓存才能达到良好的性能。但是,您在 GLSL 中对这些功能几乎没有控制权,因此优化性能非常困难。
另一点需要注意的是,至少据我所知,GPU 上的实时光线追踪主要限于静态场景,因为例如kd-trees 仅适用于静态场景(很好)。如果您想拥有动态场景,则需要其他数据结构(例如 BVH、iirc?),但您需要不断地维护这些数据结构。如果我没有遗漏任何内容,那么目前还有很多关于这个问题的研究。
【讨论】:
顺便说一句:谷歌学者是你在这类事情上的朋友。 scholar.google.de/scholar?q=glsl+ray+tracing 怎么样 “加速数据结构”是什么意思? 在这种情况下,加速数据结构加速查询世界是否被特定 3D 位置的对象占据。它比 O(n) 加速,遍历对象列表。 您可以使用 OpenGL 计算着色器来编写光线追踪器。由于已经熟悉编写 GLSL 代码,因此上手可能会更容易。这可能很有帮助:ci.i.u-tokyo.ac.jp/~hachisuka/tdf2015.pdf 虽然我建议使用 SSBO 来存储数据而不是纹理。【参考方案2】:你可能会混淆一些事情。
OpenGL 是一个光栅化器。强制它进行光线追踪是可能的,但很困难。这就是为什么光线追踪不是“几年内实时图形的理想选择”。几年后,只有混合系统才是可行的。
所以,你有三种可能性。
纯光线追踪。仅渲染一个全屏四边形,然后在片段着色器中读取打包在缓冲区(如纹理)中的场景描述,遍历层次结构,并计算光线-三角形的交点。 混合光线追踪。以正常方式栅格化您的场景,并在您的着色器中对场景中确实需要它的某些部分使用光线追踪(折射,......但它可以在栅格化中进行模拟) 纯光栅化。片段着色器完成其正常工作。你到底想达到什么目标?我可以根据您的需要改进答案。
无论如何,this SO question 是高度相关的。即使这个特定的实现有一个错误,它也绝对是要走的路。另一种可能是openCL,但概念是一样的。
【讨论】:
从最新的虚幻引擎公告来看,微软(针对 DirectX)和 NVIDIA 似乎刚刚发布了实时光线追踪 API【参考方案3】:至于 2019 年,光线追踪是实时渲染的一个选项,但需要大多数用户没有的高端 GPU。 其中一些 GPU 专为光线追踪而设计。 OpenGL 目前不支持硬件增强的光线追踪。 Windows 上的 DirectX 12 确实支持它。建议再等几年再创建仅光线追踪的渲染器,尽管可以将 DirectX 12 与当前的台式机和笔记本电脑硬件一起使用。来自移动设备的支持可能需要几十年的时间。我没有看到 openGL 支持光线追踪,但 vulkan 将来会支持它。
【讨论】:
【参考方案4】:我发现其他一些答案冗长而冗长。对于可以使用 OpenGL API 构建功能性光线追踪器的视觉示例,我强烈建议查看人们在 https://www.shadertoy.com/ 上制作的一些项目(警告:滞后)
【讨论】:
【参考方案5】:如果你真的很擅长,Opengl 和 glsl 可以同时用于光线和路径追踪。但是,几乎没有其他更好的选择,例如带有 Cuda 工具包的 Nvidia optix、directx 12、vulkan 光线追踪、metal、falcor。请注意,所有这些都是低级 API,可以在 Nvidia 最近的 rtx 技术中获得良好的性能并支持多 GPU
【讨论】:
以上是关于GAMES202 笔记-实时光线追踪的主要内容,如果未能解决你的问题,请参考以下文章