NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模
在维姆·文德斯 (Wim Wenders) 的优秀作品《完美的日子》 (Perfect Days) 的结尾,男主角平山 (Hirayama) 在桥下喝啤酒,因为他看到一个商人在追求他的暗恋对象。突然,商人在桥下加入了他。事实证明,事情并没有那么简单,但重点是他们的对话将他们引向了一些基本问题:
商人:阴影。当它们重叠时,它们会变暗吗?
平山:不确定。
商人:还有很多事情我都不知道……我想,这就是生命的终结……。
平山:现在让我们来一探究竟。
商人:什么?
然后他们走进路灯的光亮中,调查他们的影子(完整场景):
尽管商人看不出有什么不同,但平山确信重叠的阴影确实变暗了。“它必须变暗才能有意义。”多么感人的场景。
不幸的是,平山搞错了。阴影在那里不会变暗。只有一个光源,而且距离相对较远,所以阴影只是光的缺失。无论光被遮挡多少次都无关紧要。
在 3D 电子游戏中,阴影是另一回事。很容易在某个角色的脚下画出黑色斑点,并假设其他一切都是亮着的。也许平山想起了《合金装备》中的斑点阴影,当它与其他阴影重叠时,它会变暗?
在现实世界中,阴影只是存在,但在游戏中,它们既是工程化的,也是设计的。它们必须运行良好,但看起来也很好。我发现这种关系很有趣,我将向你展示原因。让我们从简单的开始。
1、屏幕上的 2D 阴影
你可以在绘制角色之前将阴影图像绘制到屏幕上。我说的不是像 Duke Nukem 3D 中的阴影精灵,而是实际上没有任何缩放的 2D 图像。如果角色位于 Winter Gold 或 MDK 中的所有内容前面,这种方法是可行的。
我说这很简单。
2、斑点阴影
现在在 3D 中好了。在角色下方绘制一个暗色圆盘。完成。
好吧,你还应该将阴影圆盘与地面对齐,并决定如何处理阴影超出壁架的情况。例如,在 Super Mario 64 中,斑点(blobs)是使用特殊硬件功能绘制的,该功能可以有效地剪切阴影以仅显示在地面上。
斑点阴影也可以动画化。在 Super Mario 64 中,跳跃时它会变小,在 Metal Gear Solid 中它会改变形状。如果你有雄心壮志,还可以通过像贴花一样投射斑点四边形来解决阴影越过壁架的问题。
3、带有渲染纹理的平面阴影
斑点只是一种纹理,通常可以在运行时渲染纹理。因此,从顶部渲染角色并使用它而不是黑色圆圈。这在 Crash 3(视频)中效果很好,但在 Soldier of Fortune 中效果不佳,因为他们将阴影分辨率保持在如此低的水平。
请注意,这与阴影贴图不同,阴影贴图是从光的视角渲染深度贴图。这里我们只渲染用作纹理的黑白图像。所以从某种意义上说,我们谈论的是 1 位阴影贴图。
我们怎样才能使阴影更清晰?
4、带有几何图形的平面阴影
一种直观的选择是通过将阴影投射器投射到远离光线的地方来使其在平面上变平。然后第二次渲染,但现在是黑色。它们通常保持不透明,以隐藏物体部分如何绘制在另一个物体之上。自然,阴影只有在平坦的地板上才会正确。
一些早期的飞行模拟器在跑道上绘制自上而下的平面阴影。在我的研究中,我期望看到飞行时也能看到阴影的例子,但找不到。
从视觉上看,这些看起来与投射在平面上的黑色模板阴影相同。
5、地形上的阴影
大卫·布拉本 (David Braben) 于 1987 年创作的 Virus 绘制了在地形上投射自上而下阴影的宇宙飞船。
一个更复杂的例子是 76 号州际公路。在那里,它们倾斜和拉伸平面阴影以匹配地面坡度。阴影偶尔会穿透地面,但总体上非常令人信服。有趣的是,下面的软件渲染截图有略微透明的阴影,而硬件加速的阴影则是漆黑一片。
他们还勇敢地尝试为桥梁等大型物体投射阴影,但并不完全成功。
但是你如何在任何类型的场景上投射阴影?
6、投影纹理阴影
这种方法与之前介绍的带有渲染纹理的平面阴影非常相似,但适用于任何形状的表面。游戏从顶部渲染阴影纹理,但不是将其显示在平面上,而是将其投射到其他物体上。可以将其想象成蝙蝠信号,但从天空直指下方。
这样的阴影可以做得非常清晰,但它们在垂直表面上看起来很奇怪,有时甚至会出现在天花板上。你可以看看这个 Sonic Adventure 2: Battle(2001,GameCube)的游戏视频。
这种技术也适用于树木:
投影阴影可以透过物体显示出来,这使得它们只适用于特殊情况。阴影图是您可以在任何地方使用的东西。
7、阴影图
事实上的阴影方法。游戏从光的角度绘制深度图像,即阴影贴图(shadow map),并在渲染世界时从该图像中读取。这很容易做到,因为你可以重复使用游戏引擎的常规渲染代码。
阴影贴图的分辨率有限,导致了一些众所周知的现象,这些现象有着富有创意的名字,例如“彼得潘”和“阴影痤疮”。人们提出了许多技巧,将更多的阴影贴图区域分配给最需要额外分辨率的相机附近的表面。阴影贴图通常需要进行一些调整才能看起来正确。
在阴影贴图占据主导地位之前,有一个很受欢迎的竞争对手。
8、模板阴影
一种过时的阴影处理方法。模板阴影(stencil shadow)可以在任何类型的表面上绘制清晰的阴影。它们创造了一种独特的黑色电影外观,很难用阴影贴图模仿。最著名的例子当然是《毁灭战士 3》及其黑暗的房间:
模板阴影基于阴影体积的概念,阴影体积是一种将世界切割成有光和有阴影空间的不可见几何体。游戏只对不在阴影体积内的像素应用照明。
模板阴影需要多次绘制世界才能工作。稍微简化一下,游戏首先用环境光绘制整个世界。然后对于每个光源,绘制所有阴影体积,然后再次绘制世界,只影响无阴影像素。体积是使用为正面和背面设置的不同模板操作绘制的。需要绘制很多像素。
最早推出带有模板阴影的游戏可能是 2001 年的《Severance: Blade of Darkness》,其阴影效果非常棒。
阅读 2001 年 3 月的《Edge UK》游戏评论(pdf)可以清楚地看出,尽管图形方面取得了进步,但当时的世界还没有准备好迎接类似灵魂的游戏。
模板阴影现在用得不多了。原因之一是它们的运行时间成本不可预测。成本取决于屏幕上的体积大小,因此变化很大。此外,优化算法也获得了专利。对于《毁灭战士 3》,Id Software 显然达成了某种协议。
9、柔和的模板阴影
模板阴影不需要太清晰。2001 年的另一款游戏,PlayStation 2 上的《寂静岭 2》,之后模糊了模板阴影,如上图所示。它在控制台上看起来非常完美。
10、简化的角色阴影
如果阴影是由比屏幕上显示的更简单的模型投射的,会怎么样?例如,在 Nintendo 64 上的《塞尔达传说》中,林克的脚会投射阴影,尽管其他任何东西都不会投射阴影:
Hyperblade 中采用了一种独特的方法,未来冰球场上的玩家将平面阴影投射为简单的动画形状。
11、静态关卡照明中的阴影
顶点颜色和光照贴图是捕捉游戏关卡照明的技术。它们已在许多游戏中用作显示大规模阴影的唯一方法,这就是我将它们包括在这里的原因。
11.1 顶点颜色
Ico 展示了仅使用老式的顶点照明就可以呈现多么复杂的阴影。
对于低多边形贴图,即使是锐利的阴影也可以用顶点颜色表示。一个典型的例子是 Tony Hawk Pro Skater 2(2000 年,PlayStation),考虑到该技术的简单性,它看起来很棒。
11.2 光照贴图
光照贴图(lightmap)是存储关卡照明和阴影的经典方式。它不是为每个顶点存储一种颜色,而是有第二组仅表示照明的纹理。分辨率可以根据区域而变化,使阴影在需要时更准确。另一方面,光照贴图比顶点颜色消耗更多的内存。
光照贴图因 Quake(1996 年,PC)而流行,这就是它们的外观。
我们对传统阴影技术的了解到此结束。接下来让我们谈谈一般的照明。
12、现代游戏中的阴影
现代游戏在适当的时候使用传统技术。一些示例:
- 阴影贴图的变体,例如级联阴影贴图,可以覆盖大面积区域,同时保持速度。
- 光照贴图与其他技术(例如光探测器)相结合。使命召唤仍然有光照贴图,请参阅半球形照明洞察幻灯片。
- 简化的角色模型理念。《最后生还者》(2013 年,PlayStation 3)使用拉伸球体投射柔和的角色阴影。请参阅《最后生还者》(2013 年)幻灯片照明技术的幻灯片。虚幻引擎还支持角色的简化“胶囊阴影”。
- 投影阴影。在《风火轮赛道大战》(2010 年,Wii)中,他们将阴影网格渲染为纹理并将其投射到赛道上,如开发人员博客中所述。游戏在运动中看起来很棒!
一开始,我们确定阴影是由光线不足形成的。如果游戏真的试图模拟物理上正确的照明,那么阴影就会自然出现。即使是很小的几何细节也会投射出精确的阴影,这与阴影贴图不同。大灯会自然地产生柔和的阴影,间接光会照亮黑暗的角落。为了实现这一梦想,人们在光线追踪算法和硬件上投入了大量的时间和金钱。
实际上,现代游戏的场景非常复杂,上述模拟解决方案必须近似。例如,在《心灵杀手 2》(2023 年)的光线追踪阴影中,每个像素仅从单个随机选择的光源接收照明。结果最终被输入到降噪器,该降噪器可以智能地平滑嘈杂的图像。有关详细信息,请参阅整个演示文稿。因此,即使是光线追踪阴影也不会“完美”,并且会根据所做的权衡而拥有自己的外观。
最后,显而易见的选择。
13、没有阴影
有时你的优先事项在别处。
在电影场景中,当平山仔细研究阴影时,他的新朋友发表了评论:
商人:你真的很喜欢这个。
作为计算机图形爱好者,我想我们可以感同身受。
原文链接:Classic 3D videogame shadow techniques
BimAnt翻译整理,转载请标明出处