NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模
伊本·海瑟姆描述的现象解释了我们为什么会看到物体。 根据他的观察,可以得出两个有趣的结论:首先,没有光,我们就看不到任何东西;其次,如果环境中没有物体,我们就看不到光。 如果我们要在星际空间旅行,这通常会发生。 如果我们周围没有物质,我们除了黑暗之外看不到任何东西,即使光子可能穿过那个空间(当然;如果有光子,它们一定来自某个地方。如果你直接看它们,如果它们进入你的眼睛,你会看到反射或发射它们的物体的图像)。
1、正向追踪
如果我们试图在计算机生成的图像中模拟光与物体的交互过程,那么我们需要注意另一种物理现象。 与物体反射的光线总数相比,只有少数光线会到达我们眼睛的表面。 这是一个例子。
想象一下,我们创建了一个一次仅发射一个光子的光源。 现在让我们看看这个光子发生了什么。 它从光源发出并沿直线路径传播,直到撞击物体的表面。 忽略光子吸收,我们可以假设光子沿随机方向反射。 如果光子击中我们眼睛的表面,我们就会“看到”光子反射的点(图 1)。
我们现在可以从计算机图形学的角度来看看这种情况。 首先,我们用由像素组成的图像平面代替我们的眼睛。 在这种情况下,发射的光子将撞击图像平面上的众多像素之一,从而将该点的亮度增加到大于零的值。 这个过程会重复多次,直到调整所有像素,创建计算机生成的图像。 这种技术称为前向光线追踪,因为我们跟踪光子从光源到观察者的路径。
但是,你认为这种方法有潜在的问题吗?
问题如下:在我们的示例中,我们假设反射的光子总是与眼睛的表面相交。 实际上,光线会向每个可能的方向反射,每个方向都有非常非常小的概率射中眼睛。 我们必须从光源中投射出无数的光子才能找到唯一一个能击中眼睛的光子。 这就是自然界的运作方式,无数光子以光速向各个方向传播。 在计算机世界中,模拟场景中许多光子与物体的相互作用并不是一个实用的解决方案,原因我们现在将解释。
所以你可能会想:“我们需要向随机方向发射光子吗?既然我们知道眼睛的位置,为什么不直接向那个方向发送光子,看看它穿过图像中的哪个像素(如果有的话)呢?” 这是一种可能的优化。 但是,我们只能对某些类型的材料使用此方法。 在后面关于光与物质相互作用的课程中,我们将解释方向性对于漫反射表面来说并不重要。 这是因为撞击漫射表面的光子可以在以接触点法线为中心的半球内的任何方向上反射。 然而,假设表面是一面镜子并且不具有漫反射特性。 在这种情况下,光线只能沿精确方向反射,即镜像方向(稍后我们将学习如何计算)。 对于这种类型的表面,如果光子遵循镜像方向,我们就不能决定人为地改变光子的方向,这意味着这种解决方案可能更令人满意。
即使我们决定使用这种方法,对于仅由漫反射对象组成的场景,我们仍然需要帮助。 我们可以想象将光中的光子射入场景中,就像我们将光线(或小颗粒油漆)喷射到物体表面上一样。 如果喷雾不够密集,某些区域将不会被均匀照亮。
想象一下,尝试用白色记号笔在一张黑色纸上画点来画茶壶(将每个点视为光子)。 如下图所示,只有少数光子与茶壶物体相交,留下许多未覆盖的区域。 当我们添加点时,光子的密度会增加,直到茶壶“几乎”完全被光子覆盖,从而使物体更容易识别。
但发射 1000 个光子,甚至 X 倍以上,永远无法保证物体的表面会被光子覆盖。 这是该技术的一个显着缺点。 换句话说,我们必须让程序运行,直到我们确定它已将足够的光子喷射到物体的表面上以获得其准确的表示。 这意味着我们必须在渲染图像时观察图像,以决定何时停止应用程序。 在生产环境中,这是不可能的。 正如我们将看到的,光线追踪器中最昂贵的任务是找到光线与几何体的交点。 从光源产生许多光子不是问题,但在场景中找到所有的光子会非常昂贵。
结论:前向光线追踪(或光追踪,因为我们从光线中发射光线)使得在计算机上模拟光在自然界中的传播方式在技术上成为可能。 然而,正如所讨论的,这种方法可能更有效、更实用。 在 1980 年发表的一篇题为“改进的阴影显示照明模型”的开创性论文中,Turner Whitted(计算机图形学领域最早的研究人员之一)写道:
在光线追踪的一种明显方法中,从光源发出的光线会通过其路径进行追踪,直到到达观察者为止。 由于只有少数内容会到达观众眼中,因此这种方法可能会更好。 在阿佩尔建议的第二种方法中,光线沿着相反的方向追踪,从观察者到场景中的物体。
现在我们来看看Whited谈到的另一种模式。
2、反向追踪
我们不是追踪从光源到接收器(例如我们的眼睛)的光线,而是从接收器向后追踪光线到物体。 由于这个方向与自然界中发生的方向相反,因此称为反向光线追踪(backward ray-tracing)或眼睛追踪,因为我们从眼睛位置发射光线(图 2):
该方法为前向光线追踪的缺陷提供了便捷的解决方案。 由于我们的模拟无法像自然一样快速和完美,因此我们必须妥协并追踪从眼睛到场景的光线。 如果光线击中物体,我们可以通过从击中点向场景灯光投射另一条光线(称为光线或阴影光线)来确定它接收到的光线量。 有时,这条“光线”会被场景中的另一个物体阻挡,这意味着我们原来的击中点位于阴影中,它不会受到任何光线的照射。 因此,我们不将这些命名为光线,而是将其命名为阴影光线(shadow ray)。 在 CG 文献中,我们从眼睛(或相机)射入场景的第一条光线称为主光线(primary ray)、可见光线(visibility ray)或相机光线(camera ray)。
3、结束语
在计算机图形学中,从光或从眼睛发射光线的概念称为路径追踪(path tracing)。 也可以使用术语“光线追踪”,但路径追踪的思想表明,这种制作计算机生成图像的方法依赖于跟踪从光线到相机的路径(反之亦然)。 通过以物理真实的方式这样做,我们可以轻松地模拟光学效果,例如焦散或场景中另一个表面的光反射(间接照明)。 这些主题将在其他课程中讨论。
原文链接:The Raytracing Algorithm in a Nutshell
BimAnt翻译整理,转载请标明出处