关于光线追踪的科普

2019-06-08  本文已影响0人  fengyinPro

距英伟达发布RTX系列显卡已经过了快一年了,一直想做一期关于光线追踪技术的科普,但拖延症晚期加上一直也没能抽出时间,也就再拖,好在最近和小伙伴的游戏开发告一段落,正值端午也闲的很,就着手写了这篇科普,以下是正文。


首先我们先来了解一下全局光照的概念。

全局光照(Global Illumination,简称 GI),是指既考虑场景中来自光源的直接光照,又考虑经过场景中其他物体反射后的间接光照的一种渲染技术。而光线追踪(Ray tracing)只是全局光照的一个实现方向,当然还有辐射度、环境光遮蔽(ambient occlusion)、光子贴图、Light Probe等方向。

光线追踪原理图

真实的世界光线是从光源直接照射到我们的眼镜或者经过多次反弹再到达我们的眼镜,当我们试图用计算机模拟的时候我们就会发现这是非常困难的尤其是在大的场景下,一个光源就要经过无数次反射会有无数条光线到达我们的摄像机,计算量极大,理所当然的我们会想到,我们可以减少光线的数量以及反弹的次数啊,确实,但如果我们反过来想,光线不从光源发出而是从摄像机发出,经过多次反弹最终到达光源,我们只需要计算目前我们所看到的画面的光照,而不用考虑不会反射到我们当前的画面的光线,这样我们就极大的减少了计算量。最终光线得到颜色信息,映射在屏幕上成为像素,无数的像素组成一起就渲染成了一张图片了。

但即便是这样,计算量依旧巨大,要想达到每秒渲染60图片在普通的计算机上是不可能的,那么我们目前玩的游戏又是如何做到栩栩如生的画面的呢,这里又要提到光栅化渲染了,这也当今游戏画面最主流的渲染方式。这里引用英伟达官方的解释:

长期以来,实时计算机图形一直使用一种称为“光栅化”的技术在二维屏幕上显示三维物体。该技术速度快,且效果足够好,尽管它仍然无法达到光线追踪所能达到的水平。

借助光栅化技术,可通过虚拟三角形或多边形网格来创建物体 3D 模型。在这种虚拟网格中,每个三角形的顶点与大小及形状不同的其他三角形的顶点相交。每个顶点关联着大量信息,包括其在空间中的位置以及有关颜色、纹理及其“法线”(normal)信息,这些信息可用于确定物体表面的朝向。

计算机随后将 3D 模型中的三角形转换为 2D 屏幕上的像素或点。根据存储在三角形顶点中的数据,能为每个像素分配一个初始颜色值。

进一步的像素处理或“阴影处理”包括根据场景中光照与像素的碰撞来改变像素颜色,以及将一个或多个纹理应用于像素,进而生成应用于像素的最终颜色。

光栅化技术的计算量异常大。一个场景中的所有物体模型可使用多达数百万个多边形,4K 显示器中有近 800 万个像素。而且,屏幕上显示的每个帧或图像通常会在显示器上每秒刷新 30 到 90 次。

此外,还要使用内存缓冲区(为加快运行速度预留出来的一点临时空间)在屏幕上显示之前,预先渲染这些帧。还需使用景深或“z 缓存” 存储像素深度信息,以确保在屏幕上特定的像素位置会显示最上层的物体,并隐藏其背后的物体。

这正是为什么拥有丰富图形功能的现代计算机游戏会依赖于性能强悍的 GPU。

好吧其实不太好理解,我再解释一下吧。

方块是摄像机,网格是屏幕,每一个小格代表一个像素,三角形是我们要渲染的物体,我们三角形的三个顶点分别与摄像机相连,与屏幕相交与三个点,根据这三个点我们就可以画出摄像机看到三角形

这种投影到像素格子的方法就是是计算机图形学中的光栅化渲染方法。之后再在我们画出的图像上绘制高光阴影等效果,以产生真实的感觉,但他的缺点非常明显,无法判断远近遮挡关系(最后通过z缓冲技术才得以解决),无法模拟真正的阴影,反射和折射。

光栅化渲染和光线追踪渲染的比较可以看这个视频

https://www.bilibili.com/video/av29458366?from=search&seid=12441170262462105242

在之后的很多年里图形学的专家们想出了各种奇淫技巧去使光栅化更加真实,这里我简要的介绍几种方法。

1.最重要的光照烘焙

解释起来非常简单,就是使用光线追踪技术计算出真实的光影然后储存在贴图中,就像下图这样,这里我用的是unreal引擎的模板场景,可以看到在烘焙之后真实了很多,如果使用高精度的烘焙,在不涉及折射和反射材质的情况下真实度是不输于光线追踪技术的,而且速度快了很多。

2.环境光遮蔽(Ambient Occlusion)

通过计算光线在物体上的折射和吸收,在受影响的位置上渲染出适当的阴影,添加渲染深度,从而进一步丰富标准光照渲染器的效果。光遮蔽并不是真实的现象,而是3D应用程序用来进行光线追踪,创建阴影错觉的一种光照技术。

在游戏中使用的实际是SSAO(屏幕空间环境光遮蔽),这种效果在弯曲处和凹陷处可见,但在平面和凸面上不可见,因为它们不会阻挡彼此的光线。这种效果非常重要,因为没有它的存在将会令场景缺乏层次感。

看下图就非常容易理解了,在模型相近的位置绘制阴影,以模拟全局光照

3.屏幕空间反射

反射一向是光栅化渲染的难题,而目前主流的解决方法就是屏幕空间反射,但效果差强人意,只能反射屏幕看到的模型,屏幕外的反射不到,而使用光线追踪可以很好的解决这个问题。还有一个非常神奇的解决方法,在墙的后面建一个摄像机,把看到的渲染出来贴在墙壁表面上,虽然麻烦了点,但效果倒是挺不错,崩崩崩用的就是这种方法。

注意看黑色的墙壁,可以看到方块的发射 但当摄像机拉近屏幕看不到方块的时候,反射就消失了 屏幕空间反射 光线追踪反射

最后来讲一讲NVIDIA的实时光线追踪技术又有哪些神奇之处吧

首先这是一个阉割版的光线追踪,既是是用到了RT core核心专门处理光线追踪,比传统cuda处理快上十倍,还是难以做到每秒60帧的渲染,而且是在低采样的情况下,不过这可以理解,毕竟如果是传统渲染器相同场景,默认渲染参数,估计要几十分钟一帧,提升可以说是巨大的。

具体我们来看这个视频https://www.bilibili.com/video/av21086717

基于机器学习的ai降噪技术和dlss抗锯齿技术,机器学习的现在可以说是非常火了,在各个领域都有应用,ai降噪以及dlss就是机器学习和图形学碰撞出的火花。至于为什么要降噪和抗锯齿,这是采样和屏幕分辨率过低的原因。

以下是dlss技术的解释,ai降噪同理

在训练阶段,需要使用大量的“显卡原始输出图像”(1080P分辨率或2K分辨率)和“对应的超级计算机抗锯齿处理过后的图像”(8K分辨率)这样的图像组对这个模型进行训练,使用深度学习技术优化这个模型,使得这个模型能够从低分辨率图像生成高分辨率图像,这个过程需要庞大的计算资源,由英伟达计算,将模型训练好后将该模型推送给用户。

降噪前 降噪后

目前在游戏领域应用(有的游戏只是部分应用了光线追踪技术)

逆水寒:实时光线追踪和深度学习超级采样

仙剑奇侠传七:实时光线追踪反射

战地5:实时光线追踪反射

古墓丽影:暗影:实时光线追踪阴影

星球大战DEMO:实时光线追踪反射、阴影、环境光遮蔽和 NVIDIA DLSS

还有地铁:离去等少数几个

视频可以看https://www.nvidia.cn/geforce/20-series/rtx/

最后

计算机图形学发展了这么多年相关的技术几十本书也讲不完,我这里也只是相关技术的科普,如果想深入了解的化可以看一些图形相关的书和网站,当然前提条件是数学要好,反正我是不会(逃)

写了这么多如果有疏漏欢迎指正,下一篇我会从程序和美术两个角度讲解pbr在游戏中的应用

上一篇下一篇

猜你喜欢

热点阅读