空间的错觉:新型蜘蛛侠如何渲染无几何形状的房间


在最近发布的漫威的蜘蛛侠游戏中,许多建筑物的窗户都设有室内装饰。 它们看起来很棒,但似乎是使用狡猾的渲染实现的-内部几何实际上并不存在,而是由着色器生成的。 我没有看到任何有关失眠症患者如何做的官方声明,但是基于效果的外观,我很可能在2007年研究论文时采用了内部贴图技术。 我以前没有在博客上写过它,所以现在是时候解释我提出的好奇的小着色器了。

让我们从观看漫威的蜘蛛侠游戏开始。 游戏看起来真棒。 Kotaku网站在Windows上录制了单独的视频:


正如您在大约40秒的视频中所看到的,实际上,房间不是几何的一部分:显然,窗户应该位于门所在的位置。 另外,从建筑物的不同角度看一个房间,我们看到的是不同的内部。 在某些情况下,建筑物的拐角处甚至还有一堵墙。 所有这些使我们了解房间是模仿的。 但是,从角度来看,它们可以正确显示并具有真实的深度。 我认为此类房间的弊端在游戏过程中并不是很重要,因为玩家通常不会如此仔细地研究房间:室内只是一个背景,而不是一个仔细研究的主题。 我相信,这种创建房间的方式无需花费太多资源即可为城市增添深度和活力。


为了节省资源,游戏中的建筑物通常没有内部装饰,如GTA V中的屏幕截图所示

首先,我想解释一下我的帖子不是投诉:我很高兴我的设备被用于如此大型的游戏,而丝毫不指责失眠者偷窃。 就像我在第一本有关内部地图的出版物中所说的那样,如果有人使用这种技术,对我来说是一种荣幸。 如果Insomniac在她的技术中真正利用了我的想法,那么我认为那很棒。 如果她不使用它,那么看来她想出了类似的东西。 然后,我将对如何完成此过程感兴趣。

那么内部贴图如何工作? 想法是建筑物本身不包含任何其他几何形状。 内部仅存在于着色器中。 该着色器对墙壁,天花板和地板进行光线投射,以计算玩家应该在室内看到的东西。


从左到右:仅具有反射的窗口,具有内部贴图的窗口,线框模型-内部贴图不添加任何多边形。

用于光线投射的光线只是从相机到像素的光线。 我们渲染的像素位于建筑物的外部,因此我们仅使用像素之后的光束部分,因为这实际上是建筑物内部的部分。

光线投射似乎是一个复杂且昂贵的操作,但是在这种特殊情况下,它实际上非常简单且快速。 诀窍是您可以添加一个简单的限制:使用内部贴图时,天花板和地板之间的距离一定。 知道了这一点,我们可以轻松计算出我们所在的房间以及地板和天花板在该房间中的位置。 天花板和地板本身是无止境的几何平面。 计算无限平面和射线之间的交点仅需几步,并且只需花费很少的资源。


这个房间有6个平面:天花板,地板和4面墙。 但是,我们只需要考虑其中的三个,因为我们知道我们朝着哪个方向。 例如,如果我们向上看,则无需检查下面的地板,因为我们将看到上面的天花板。 同样,我们不需要考虑4堵墙,而只需要考虑我们所看方向上的2堵墙。

为了确定我们所看到的,我们需要计算射线与这三个平面的交点。 与最靠近相机的光束的交点告诉我们在此像素中看到哪些平面。 然后,我们将交点用作纹理的坐标,以找到像素的颜色。 例如,如果光束在与天花板的位置(x,y,z)相交,则我们使用(x,y)作为纹理坐标,而忽略z。

在这里,我添加了一个很好的优化:三个平面中每个平面的相交计算的一部分可以同时执行。 所使用的着色器以与float4相同的速度与float4一起工作,因此由于变量的巧妙打包,可以同时使所有三条光线与平面相交。 即使在2007年,这也节省了我一些资源,并通过内部贴图实现了高帧率。 有人告诉我,带float的现代视频卡比带float4的视频卡运行更快。 这意味着在当前硬件上,此优化不再有效。


没有窗口纹理的内部贴图显示,尽管不需要其他几何体,但房间的渲染具有正确的透视图和纹理。

您可以在我的文章中了解有关内部贴图的更多信息。 本文在2008年国际计算机图形学大会上发表。拥有该同行评审的出版物是我第一个(也是唯一一个)申请获得科学家荣誉称号的应用程序。 本文还介绍了其他实验,以增加细节,例如,更改大小不等的房间的墙壁之间的距离,并从纹理图集中随机选择纹理,以提高房间的可变性。 它还详细描述了下图中显示的两个变体。


可以动态打开和关闭房间内的照明,以模拟白天和黑夜的变化。 这是通过使用我们正在读取的噪声纹理(使用房间索引作为纹理坐标)来完成的。

由于我们仅在平面上发出光线,因此所有房间都是带有纹理的简单正方形。 房间中的所有家具都将保持纹理,这意味着保持平坦。 在蜘蛛侠中,当您接近相机时,这会很明显:​​房间中的桌子实际上是墙壁上的平面纹理。 如下图所示,我们可以在每个房间添加一个或多个其他纹理层来补充我们的技术,但这会带来额外的性能成本。


对平行于建筑物外表面的另一个平面执行光线追踪,可以向房间添加家具和人员。 但是,它们仍将保持不变。

在这篇文章发表之后,一位程序员《模拟城市》(Simcity,2013年)告诉我,该游戏中还使用了内部贴图技术。 在其中,她看起来很酷,并且开发人员录制了一段很棒的视频。 他们通过将所有纹理保存为一种纹理并添加不同深度的房间来完善我的原始想法。 内部地图部分从凌晨1:00开始:


如果您想更深入地探索这项技术,可以下载带有源代码的我的内部贴图演示 。 如果您使用的是虚幻引擎4,则可以使用InteriorCubeMap函数的形式将内部映射作为标准引擎函数找到。

这么多年之后,很高兴终于看到我的内部贴图技术已用于大型视频游戏的制作中! 如果您熟悉使用类似功能的游戏,请给我写信。

Source: https://habr.com/ru/post/zh-CN424827/


All Articles