为什么现代游戏对镜子使用“渲染到纹理”方法?


40

当查看诸如Mario64或DukeNukem3D之类的旧游戏时,游戏中的所有镜子本质上都是墙壁上的孔,并且在它们后面放置了镜子前面的几何图形。在DukeNukem3D的情况下,甚至可以激活无剪辑并走进那个镜像的房间。

相反,现代游戏对镜子使用“渲染到纹理”方法。这导致镜子在靠近镜子时变得明显像素化。我注意到这种方法的第一批游戏之一是Luigi's Mansion,但它似乎已在几乎所有现代游戏中使用。

如今,硬件或引擎的哪些变化使第二种方法如此占主导地位,它有什么好处?就纯视觉效果而言,第一种方法似乎更好,因为它没有像素问题。


14
如果要在两个房间之间的门上放一面镜子怎么办?
极好

Answers:


37
  1. 使用RTT(渲染到纹理)可以轻松缩放渲染质量(分辨率,LOD,照明复杂度),以实现可调整的性能。RTT还可以更容易地在难以精确看到反射的特定距离处用立方体贴图替换曲面。
  2. 由于输出是纹理,因此有更多选项可用于随后的处理(照明,阴影,混合,变形等)。
  3. 如果将几何体的镜像版本放置在场景中,则当它与真实几何体相交并且可能在拐角处看到时,将需要更复杂的剔除。在较旧的游戏中,关卡旨在避免这种情况。更不用说有人必须进行实际的镜像。
  4. 如果未手动镜像几何图形,则必须通过更改视图矩阵和剔除模式(以补偿矩阵中的空间反转)并使用模板缓冲区切出镜像来完成渲染。现代引擎更喜欢预先创建所有渲染状态,因此在复制每个场景渲染状态并复制镜像渲染所需的更改时会有一个小问题。

因此,基本上,使用RTT可为每个人提供更多的自由。


关于3 .:大多数(较旧的)FPS游戏引擎使用对分算法(例如著名的DOOM使用的“门户引擎”),已经对(最可能是四边形)多边形进行裁剪以进行可见性剔除。这样的引擎可以轻松地将四“镜”作为观察口进入镜后的房间,而不必担心镜外的镜面几何形状。
dronus '16

@dronus什么?比为什么首先要打个“镜子”呢?只是在墙上开一个洞。
S.TarıkÇetin16年

因为真实的几何体可能不会在镜壁后面留下空间,所以像真实的镜子一样,不需要在后面留有空间来工作。
dronus '16

29

不,您错了-这根本不是Duke Nukem 3D镜子的工作原理。

DN3D使用了门户引擎。任何两个扇区之间的联合在一定程度上都是任意的,并且当渲染引擎到达门户时,它知道它必须开始渲染其中的另一个扇区。镜子后面的区域基本上是占位符,用于处理引擎中的异常现象-该区域的唯一要点是大于您需要“反射”的内容。它不包含任何实际几何图形。实际上,它与Portal中“门户”的工作方式几乎相同-区别在于Portal(本身基于门户引擎)在运行时创建门户,并且对门户可以递归的次数有限制(即A -> B-> A-> B-> A ...),而如果将一个镜像指向另一个镜像,则Build(DN3D)会因为堆栈溢出而完全崩溃。

很明显这是多么简单的实现与镜子-做一个门户网站,点进了房间。这意味着渲染镜子的成本与渲染房间本身的成本完全相同,从而提供了出色的性能和一致性。只要您没有将镜像指向另一个镜像,就是这样。如果您查看Build引擎的源代码,您会发现根本没有代码处理镜像-不必一个,因为门户就是这样工作的。 注意:实际上,有代码可以翻转渲染的像素-它只是不翻转几何图形以及所有各种精灵和效果。但是,编辑器必须能够创建这些“伪”门户,并且要回顾自身。如果您想了解更多有关非常聪明的Build引擎的信息,Fabien Sanglard在Build引擎内部进行了很好的分析。整个引擎都是开源的,也可以移植到现代平台上,尽管旧的引擎在Windows 10上仍然可以完美运行(为您测试:P)。许多基于Build的游戏也已开源和/或重新制作。

为什么不再使用它?好吧,其中一些引擎不再喜欢门户网站。应用许多图形技巧和优化是很棘手的-我无法为您指出任何特定的东西,但是很多后处理取决于在真正的门户网站引擎中不起作用的技巧(他们做出了许多假设,不再成立)。这基本上与这些游戏的立体图像具有相同的问题-骇客不再起作用。

最重要的是,镜子变得更加复杂。它们可能具有复杂的形状,纹理,它们可能在地面上(也称为“水”)等。尽管所有这些问题都可以在门户引擎中解决,但是RTT在某些时候成为更简单的选择,并且GPU足够快处理它。

然而,尽管如此,仍有许多具有硬件3D加速功能的游戏可以“真实地”完成工作。在较早的游戏中,例如Quake 3或Alien vs. Predator。据我所知,Source引擎游戏仍然使用“真实”镜像。如果您希望人们会靠近镜子,并且可以保证同时没有太多反射表面(例如通过水平设计),则门镜仍然非常有吸引力。


显然,人们普遍认为Duke Nukem 3D以这种方式工作的原因是,在实际的关卡设计中,镜子后面的空间与反射的房间一样大,即使渲染引擎实际上并不需要它。
Random832 '16

另外,非镜像门户不会很好地镜像事物,因此我不知道“没有代码处理镜像”是怎么可能的。
Random832 '16

5
@ Random832这是必需的-如果应该在镜像房间所在的位置出现某些扇区,则会出现一些视觉伪影。那是大部分无害的假设对性能影响很大的部分之一。如果您曾经玩过Build,您可能已经注意到,当两个扇形以相同的高度交叉时,它们将无法很好地渲染。至于镜像,其工作方式与现实生活中的镜像相同。您是否曾经想过,为什么仅在y轴上镜像“翻转”?这是您无需翻转将您连接回同一房间的门户的相同原因。
a安

关键是,通向一个面向相反方向的房间的普通门户不得不将事物旋转180度而不是对其进行反射。因此,具有不这样做的能力就算是对镜子的特殊处理。(无法执行此操作意味着门户不能作为门户使用,而仅适用于镜像,在这种情况下,整个系统将对镜像进行特殊处理)。而且,是的,我知道为什么在“ y轴”上镜像“仅”翻转”。实际上,它们在z轴上翻转。但是,它们翻转奇数个轴的事实使它们与门户不同。
Random832 '16

@ Random832当然取决于您所说的y轴:)是的,您是对的,有特殊的处理方法。但这很有趣-它翻转了渲染的数据,而不是几何图形(以及精灵和所有东西……实际上是很多工作)。翻转门户框架,照常渲染门户,然后逐行向后渲染整个对象。
a安

3

如果可能的话,将使用RTT,但是硬件渲染管道是其中一种方法。

较旧的硬件也有限制,无法渲染纹理。写入RAM意味着无法同时读取它。为了提高渲染性能,目标缓冲区被锁定为只能写入,只有显示硬件可以从中读取。您可以请求读取,但是它锁定了RAM,并且渲染必须等待锁清除后才能开始下一帧。RTT会成为管道的主要瓶颈,因此使用了其他解决方案。

您会发现在硬件渲染管道之前使用了RTT规范,因为它提供了减少渲染负载的方法。3D渲染为精灵以提供伪3D内容。除了一般消费市场之外的专用机器外,纹理渲染的成本太高了(CPU)当时无法使用。


1

杜克·努克姆(Duke Nukem)认为,通过重新渲染镜子后面的几何图形,其他答案部分正确。镜子后面有一些区域实际上不包含任何几何图形(在游戏数据文件中),实际上在运行时会重新渲染该几何图形,存在这些区域的原因是为了避免在编辑关卡时意外在其中放置一个关卡:

因为有一个标记为区域,所以您不会在其中意外放置任何几何图形。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.