射线追踪,那是什么?

随着Microsoft最近发布的DirectX Raytracing公告,收到了不同程度的热情和很多“呵呵!”的消息。 这是什么,为什么这么重要?”。 在这里,我想从一个很高的层次快速概述射线追踪及其在计算机图形学中的重要性,而又不会太深入技术层面。

光线追踪是一种通过对光线建模并在整个场景中追踪光线,记录光线与物体和材料的交互作用从而以过程方式生成逼真的计算机图形的技术。

环顾您现在所处的环境,并注意照明的细节。 是阳光从窗户射进来,还是从百叶窗中射出的一小束光?闪烁的蜡烛或天花板上的聚光灯? 注意所有的颜色,反射,阴影。 阴影是硬的还是软的,宽还是窄的? 什么颜色,甚至更好,光是什么温度? 它足够明亮使您斜视或黑暗足以使眼睛疲劳吗? 那材料呢,有光泽的塑料和哑光织物呢? 光线如何与它们相互作用? 现在想象一下如何在代码中重新创建它。 似乎有点棘手吧? 幸运的是,我们可以使用一些基本规则和高中数学,使这项艰巨的任务相对简单,但计算量大。

最简单的形式是,光线将从光源传播,在环境中反弹并击中发生复杂处理的眼睛。 尝试跟踪场景中的每条光线都是愚蠢的,因为这就像试图计数到无穷远,这不是那么容易,请尝试一下。 我们可以做相反的事情,而不是跟踪从光源到眼睛(或照相机)的所有光线。 可以将相机视为带镜头的传感器。 该传感器被分成称为像素的离散块(像素的奇特作品)。 我们可以通过取消镜头(现在)并将其替换为划分为像素的网格(这基本上只是一个图像)来进一步简化此操作! 这绝对是我们可以轻松建模的东西。 现在我们需要找出每个像素的颜色……

如果要增加透明度,我们可以相对容易地做到这一点,但是我们需要开始对材料进行建模。 如果是玻璃物体,则很可能还会发生一些衍射,因此我们需要考虑到这一点。 这些阴影怎么样? 我们要根据光源进行调整。 点光源(例如您可能在天花板上的花式聚光灯)会产生更锐利的阴影(半影变小,本影上的边缘更硬),而办公室中讨厌的日光灯照明会产生更柔和的阴影(半影变宽,过渡到柔和的阴影)本影)。 我们可以通过生成一束阴影光线来计算这一点,这些阴影光线的角度都略有不同,并查看每个光源照射了多少阴影光线。 对于场景中的每个光源都会发生这种情况。

对于反射,每次射线与反射材料碰撞时,我们都会计算反射角度并生成新的射线,从而开始其自身的寿命。 它也可能继续撞击反射表面,在该点将创建另一条新射线以及阴影射线,而不会产生其他射线。 自然,您会希望在此处限制级别数,否则场景将永远无法完成渲染!

无需太过深入,我们已经为每个场景创建了大量的光线,每个光线都经过了碰撞检测,并通过大量数学运算来处理反射,衍射和光照模型的计算。 我们拥有的物体和光源越多,计算像素颜色所需的时间就越多。

而且,我们甚至都没有接触过抗锯齿功能以平滑所有这些边缘或粒子系统以模拟烟雾或灰尘。 现在想象一下,您必须为所有这些动画。 如果幸运的话,您将有0.033秒(每秒30帧)的时间来完成上述所有操作,而对于更高的帧速率则需要更少的时间,而如今,您正在以60fps或120fps的速度观看更多视频。 如果您以4K UHD运行,则大约需要发射800万条射线,然后再考虑次级或三级偶发射线! 哦,与此同时,还更新了场景的物理模型,以处理运动,碰撞和布娃娃物理。

获得在GPU上处理此类计算的一流支持,意味着我们将能够开始在普通游戏中添加更多的光线追踪元素,为目前仅在最先进的引擎中发现的游戏再添一层真实感和沉浸感背后有数百万美元。 在Atom Games,我们很高兴看到这种可能性,尽管还有很长的路要走,但我们仍朝着正确的方向迈出了一步!