3D游戏阴影技术综合指南

在维姆·文德斯 (Wim Wenders) 的优秀作品《完美的日子》 (Perfect Days) 的结尾,男主角平山 (Hirayama) 在桥下喝啤酒,因为他看到一个商人在追求他的暗恋对象。突然,商人在桥下加入了他。事实证明,事情并没有那么简单,但重点是他们的对话将他们引向了一些基本问题:

商人:阴影。当它们重叠时,它们会变暗吗?
平山:不确定。
商人:还有很多事情我都不知道……我想,这就是生命的终结……。
平山:现在让我们来一探究竟。
商人:什么?

然后他们走进路灯的光亮中,调查他们的影子(完整场景):

《完美的日子》(2023) 中的标志性场景。剧照来自 film-grabs.com。

尽管商人看不出有什么不同,但平山确信重叠的阴影确实变暗了。“它必须变暗才能有意义。”多么感人的场景。

不幸的是,平山搞错了。阴影在那里不会变暗。只有一个光源,而且距离相对较远,所以阴影只是光的缺失。无论光被遮挡多少次都无关紧要。

在 3D 电子游戏中,阴影是另一回事。很容易在某个角色的脚下画出黑色斑点,并假设其他一切都是亮着的。也许平山想起了《合金装备》中的斑点阴影,当它与其他阴影重叠时,它会变暗?

在《合金装备》中,阴影重叠时会变暗。

在现实世界中,阴影只是存在,但在游戏中,它们既是工程化的,也是设计的。它们必须运行良好,但看起来也很好。我发现这种关系很有趣,我将向你展示原因。让我们从简单的开始。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模

1、屏幕上的 2D 阴影

你可以在绘制角色之前将阴影图像绘制到屏幕上。我说的不是像 Duke Nukem 3D 中的阴影精灵,而是实际上没有任何缩放的 2D 图像。如果角色位于 Winter Gold 或 MDK 中的所有内容前面,这种方法是可行的。

Winter Gold(1996 年,SNES)和 MDK(1996 年,PC)绘制动画 2D 阴影图像。还可以查看 Winter Gold 的 Amiga 风格介绍视频 :)


我说这很简单。

2、斑点阴影

现在在 3D 中好了。在角色下方绘制一个暗色圆盘。完成。

好吧,你还应该将阴影圆盘与地面对齐,并决定如何处理阴影超出壁架的情况。例如,在 Super Mario 64 中,斑点(blobs)是使用特殊硬件功能绘制的,该功能可以有效地剪切阴影以仅显示在地面上。

Super Mario 64(1996 年,Nintendo 64)使用斑点阴影来表示角色。左:与树影重叠的斑点阴影。中间:使用硬件贴花功能剪切的斑点阴影。右图:所有移动的角色和物体都有自己的阴影。透明气泡内的剪切阴影显示了 Nintendo 64 贴花功能的局限性。屏幕截图是在 ares 模拟器中拍摄的。

斑点阴影也可以动画化。在 Super Mario 64 中,跳跃时它会变小,在 Metal Gear Solid 中它会改变形状。如果你有雄心壮志,还可以通过像贴花一样投射斑点四边形来解决阴影越过壁架的问题。

3、带有渲染纹理的平面阴影

斑点只是一种纹理,通常可以在运行时渲染纹理。因此,从顶部渲染角色并使用它而不是黑色圆圈。这在 Crash 3(视频)中效果很好,但在 Soldier of Fortune 中效果不佳,因为他们将阴影分辨率保持在如此低的水平。

左图:Crash Bandicoot: Warped(1998,PlayStation)在运行时渲染阴影纹理。右图:《财富战士》(2000,PC)也采用了这种技术,但分辨率较低。这是 FirstPlays HD 视频的截屏。

请注意,这与阴影贴图不同,阴影贴图是从光的视角渲染深度贴图。这里我们只渲染用作纹理的黑白图像。所以从某种意义上说,我们谈论的是 1 位阴影贴图。

我们怎样才能使阴影更清晰?

4、带有几何图形的平面阴影

F-117A 飞机在 F-19 隐形战斗机(1988,DOS)中投射阴影

一种直观的选择是通过将阴影投射器投射到远离光线的地方来使其在平面上变平。然后第二次渲染,但现在是黑色。它们通常保持不透明,以隐藏物体部分如何绘制在另一个物体之上。自然,阴影只有在平坦的地板上才会正确。

一些早期的飞行模拟器在跑道上绘制自上而下的平面阴影。在我的研究中,我期望看到飞行时也能看到阴影的例子,但找不到。

GLQuake 在两款游戏中的平面阴影。左图:Kingpin: Life of Crime(1999,PC)使用黑色平面阴影。右图:阴影在 Half-Life alpha 0.52 中表现出透明度问题。屏幕截图通过 Linux 上的 Wine 拍摄

从视觉上看,这些看起来与投射在平面上的黑色模板阴影相同。

5、地形上的阴影

Virus(1987)Atari ST 移植。这艘小船投射出一个整齐的阴影。

大卫·布拉本 (David Braben) 于 1987 年创作的 Virus 绘制了在地形上投射自上而下阴影的宇宙飞船。

一个更复杂的例子是 76 号州际公路。在那里,它们倾斜和拉伸平面阴影以匹配地面坡度。阴影偶尔会穿透地面,但总体上非常令人信服。有趣的是,下面的软件渲染截图有略微透明的阴影,而硬件加速的阴影则是漆黑一片。

他们还勇敢地尝试为桥梁等大型物体投射阴影,但并不完全成功。

76 号州际公路 (1997,PC) 的太阳在地形上投射倾斜的平面阴影

但是你如何在任何类型的场景上投射阴影?

6、投影纹理阴影

左图:来自《玩具总动员 3:视频游戏渲染技术》幻灯片。右图:阴影与其他阴影重叠时会变暗。Xbox 360 游戏视频《玩具总动员 3:视频游戏》(2010 年)的剧照。

这种方法与之前介绍的带有渲染纹理的平面阴影非常相似,但适用于任何形状的表面。游戏从顶部渲染阴影纹理,但不是将其显示在平面上,而是将其投射到其他物体上。可以将其想象成蝙蝠信号,但从天空直指下方。

这样的阴影可以做得非常清晰,但它们在垂直表面上看起来很奇怪,有时甚至会出现在天花板上。你可以看看这个 Sonic Adventure 2: Battle(2001,GameCube)的游戏视频。

这种技术也适用于树木:

The Elder Scrolls IV: Oblivion(2006,Xbox 360)有美丽的投影树影

投影阴影可以透过物体显示出来,这使得它们只适用于特殊情况。阴影图是您可以在任何地方使用的东西。

7、阴影图

事实上的阴影方法。游戏从光的角度绘制深度图像,即阴影贴图(shadow map),并在渲染世界时从该图像中读取。这很容易做到,因为你可以重复使用游戏引擎的常规渲染代码。

《半条命 2》(2004 年,PC)为角色使用了阴影贴图。动态手电筒阴影(未显示)是在 2007 年的第二集扩展中添加的

阴影贴图的分辨率有限,导致了一些众所周知的现象,这些现象有着富有创意的名字,例如“彼得潘”和“阴影痤疮”。人们提出了许多技巧,将更多的阴影贴图区域分配给最需要额外分辨率的相机附近的表面。阴影贴图通常需要进行一些调整才能看起来正确。

在阴影贴图占据主导地位之前,有一个很受欢迎的竞争对手。

8、模板阴影

一种过时的阴影处理方法。模板阴影(stencil  shadow)可以在任何类型的表面上绘制清晰的阴影。它们创造了一种独特的黑色电影外观,很难用阴影贴图模仿。最著名的例子当然是《毁灭战士 3》及其黑暗的房间:

《毁灭战士 3》(2004 年)没有静态水平照明,所有阴影都是在运行时计算的。截图来自《毁灭战士 3》阴影引擎快照

模板阴影基于阴影体积的概念,阴影体积是一种将世界切割成有光和有阴影空间的不可见几何体。游戏只对不在阴影体积内的像素应用照明。

游戏需要构建“阴影体积”网格(黄色显示)。体积内的表面保持不亮。阴影体积插图由 Rainwarrior 绘制,CC BY-SA 3.0。

模板阴影需要多次绘制世界才能工作。稍微简化一下,游戏首先用环境光绘制整个世界。然后对于每个光源,绘制所有阴影体积,然后再次绘制世界,只影响无阴影像素。体积是使用为正面和背面设置的不同模板操作绘制的。需要绘制很多像素。

最早推出带有模板阴影的游戏可能是 2001 年的《Severance: Blade of Darkness》,其阴影效果非常棒。

《Severance: Blade of Darkness》(2001 年,PC)有模板阴影

阅读 2001 年 3 月的《Edge UK》游戏评论(pdf)可以清楚地看出,尽管图形方面取得了进步,但当时的世界还没有准备好迎接类似灵魂的游戏。

模板阴影现在用得不多了。原因之一是它们的运行时间成本不可预测。成本取决于屏幕上的体积大小,因此变化很大。此外,优化算法也获得了专利。对于《毁灭战士 3》,Id Software 显然达成了某种协议。

9、柔和的模板阴影

左图:《寂静岭 2》(2001 年,PlayStation 2)有柔和的模板阴影。中图:2 倍放大裁剪图。右图:阴影调试视图,其中未点亮的区域为黑色。 PCSX2 模拟器的屏幕截图经过调亮处理,以便于查看

模板阴影不需要太清晰。2001 年的另一款游戏,PlayStation 2 上的《寂静岭 2》,之后模糊了模板阴影,如上图所示。它在控制台上看起来非常完美。

10、简化的角色阴影

如果阴影是由比屏幕上显示的更简单的模型投射的,会怎么样?例如,在 Nintendo 64 上的《塞尔达传说》中,林克的脚会投射阴影,尽管其他任何东西都不会投射阴影:

《塞尔达传说:时之笛》(1998 年,Nintendo 64)。林克的脚投射的阴影就像是垂直的圆柱体。我推测阴影是两个拉伸的贴花。

Hyperblade 中采用了一种独特的方法,未来冰球场上的玩家将平面阴影投射为简单的动画形状。

Hyperblade(1996 年,PC)投射出移动的简化平面阴影。它并不完美,如最右边的图像所示。来自 Bit Games Reviews 视频的剧照。

11、静态关卡照明中的阴影

顶点颜色和光照贴图是捕捉游戏关卡照明的技术。它们已在许多游戏中用作显示大规模阴影的唯一方法,这就是我将它们包括在这里的原因。

11.1 顶点颜色

Ico 展示了仅使用老式的顶点照明就可以呈现多么复杂的阴影。

Ico(2001 年,PlayStation 2)将关卡照明烘焙到顶点颜色。对于角色,它使用模板阴影。

对于低多边形贴图,即使是锐利的阴影也可以用顶点颜色表示。一个典型的例子是 Tony Hawk Pro Skater 2(2000 年,PlayStation),考虑到该技术的简单性,它看起来很棒。

Tony Hawk Pro Skater 2(2000 年,PlayStation)中的“威尼斯海滩”关卡具有清晰的顶点颜色阴影。此镜头来自 Dreamcast 移植。

11.2 光照贴图

光照贴图(lightmap)是存储关卡照明和阴影的经典方式。它不是为每个顶点存储一种颜色,而是有第二组仅表示照明的纹理。分辨率可以根据区域而变化,使阴影在需要时更准确。另一方面,光照贴图比顶点颜色消耗更多的内存。

Mirror’s Edge(2008 年,PC)基本上就是光照贴图:游戏。

光照贴图因 Quake(1996 年,PC)而流行,这就是它们的外观。

我们对传统阴影技术的了解到此结束。接下来让我们谈谈一般的照明。

12、现代游戏中的阴影

现代游戏在适当的时候使用传统技术。一些示例:

  • 阴影贴图的变体,例如级联阴影贴图,可以覆盖大面积区域,同时保持速度。
  • 光照贴图与其他技术(例如光探测器)相结合。使命召唤仍然有光照贴图,请参阅半球形照明洞察幻灯片。
  • 简化的角色模型理念。《最后生还者》(2013 年,PlayStation 3)使用拉伸球体投射柔和的角色阴影。请参阅《最后生还者》(2013 年)幻灯片照明技术的幻灯片。虚幻引擎还支持角色的简化“胶囊阴影”。
  • 投影阴影。在《风火轮赛道大战》(2010 年,Wii)中,他们将阴影网格渲染为纹理并将其投射到赛道上,如开发人员博客中所述。游戏在运动中看起来很棒!

一开始,我们确定阴影是由光线不足形成的。如果游戏真的试图模拟物理上正确的照明,那么阴影就会自然出现。即使是很小的几何细节也会投射出精确的阴影,这与阴影贴图不同。大灯会自然地产生柔和的阴影,间接光会照亮黑暗的角落。为了实现这一梦想,人们在光线追踪算法和硬件上投入了大量的时间和金钱。

实际上,现代游戏的场景非常复杂,上述模拟解决方案必须近似。例如,在《心灵杀手 2》(2023 年)的光线追踪阴影中,每个像素仅从单个随机选择的光源接收照明。结果最终被输入到降噪器,该降噪器可以智能地平滑嘈杂的图像。有关详细信息,请参阅整个演示文稿。因此,即使是光线追踪阴影也不会“完美”,并且会根据所做的权衡而拥有自己的外观。

最后,显而易见的选择。

13、没有阴影

有时你的优先事项在别处。

《鬼屋魔影》(1992 年,DOS)没有角色阴影

在电影场景中,当平山仔细研究阴影时,他的新朋友发表了评论:

商人:你真的很喜欢这个。

作为计算机图形爱好者,我想我们可以感同身受。


原文链接:3D游戏阴影技术综合指南 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905510.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 2D寻路导航 NavMeshPlus解决方案

插件的github主页 h8man/NavMeshPlus: Unity NavMesh 2D Pathfinding 这个插件是基于新版3D寻路导航制作的,所以你可能需要看一下这篇文章 新旧Navmash 寻路导航组件对比 附使用案例与实用教程链接-CSDN博客 这行代码agent.updateUpAxis false 一定要为代理单位…

K8s企业应用之容器化迁移

#作者:曹付江 K8s企业应用之容器化迁移 Kubernetes(K8s)中的企业应用容器化迁移是一个复杂但重要的过程,平滑的迁移应用,可以让开发、运维、测试人员循序渐进的学习和掌握Kubernetes,通常包括以下步骤&am…

Flash的语音ic型号有哪些?

深圳唯创知音电子有限公司在语音技术领域具有深厚的积累,其Flash语音IC产品凭借高性能和广泛的应用领域,在市场上占据了一席之地。以下是对该公司Flash语音IC产品的详细介绍: 一、产品概述 Flash语音IC是一种采用Flash存储技术的语音芯片&…

vscode摸鱼学习插件开发

不知道大家在摸鱼的时候,会不会想要学习? 或者有没有考公人,下班要学习的? 上班时间摸鱼,下班时间不够学习? 为此,我决定开发一个vscode插件,来刷粉笔题 粉笔插件名称:…

PPT制作新选择:本地部署PPTist结合内网穿透实现实时协作和远程使用

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击跳转到网站】 前…

文件上传知识梳理:原理、工具、绕过、利用与防御

文章简介: 本文全面梳理了文件上传相关知识,包括文件上传漏洞的原理及危害,介绍了 Webshell 相关工具(如冰蝎、哥斯拉、蚁剑),详细阐述了文件上传绕过检测的多种方法(前端检测、服务端检测的各…

SpringMvc参数传递

首先对于post请求汉字乱码需要进行过滤器配置 普通参数传递 直接传递 客户端传递的属性名与我的bean中的函数参数名相同 映射传递RequestParam("XXX") 在我们方法参数中定义一个与客户端属性名一致 并绑定参数 POJO实体类传递 嵌套POJO传递 数组likes参数传递…

sqoop Oracle to hive出现 Error Msg = ORA-00933: SQL 命令未正确结束

原sqoop脚本: sqoop import \ --connect "jdbc:oracle:thin://10.82.88.223:61521/LZY2" \ --username LZSHARE \ --password LZ^share$5105 \ --driver oracle.jdbc.driver.OracleDriver \ --query "SELECT TO_NUMBER(TO_CHAR(GCRQ, YYYY)) AS gcr…

Spring Boot + Vue:打造高效图书借阅管理平台

作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 🍅获取源码联系方式请查看文末🍅 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目…

STM32F103C8T6学习笔记1--新建工程模板

1、简介 STM32是一系列由STMicroelectronics(瑞士意法半导体)公司设计和生产的32位微控制器产品线。这些微控制器基于ARM Cortex-M内核,并具有高性能、低功耗和多种外设接口的特点。STM32处理器被广泛应用于各种嵌入式系统领域,包…

Java日志脱敏(二)——fastjson Filter + 注解 + 工具类实现

背景简介 日志脱敏 是常见的安全需求,最近公司也需要将这一块内容进行推进。看了一圈网上的案例,很少有既轻量又好用的轮子可以让我直接使用。我一直是反对过度设计的,而同样我认为轮子就应该是可以让人拿去直接用的。所以我准备分享两篇博客…

篡改猴 (Tampermonkey) 安装与使用

一、下载篡改猴 (Tampermonkey) 步骤1---官网:篡改猴 - Microsoft Edge Addons

无人机之感知避让技术篇

无人机的感知避让技术是无人机安全飞行的重要保障,它依赖于多种传感器和算法来实现对周围环境的感知和判断。 一、主要技术类型 视觉避障 原理:通过安装在无人机上的摄像头捕捉周围环境的图像,利用计算机视觉技术对图像进行处理和分析&…

动态规划路径问题(不同路径 不同路径2 珠宝的最大价值 下降路径最小和 最小路径和)

本期题型: 1. 不同路径. - 力扣(LeetCode) 2. 不同路径2. - 力扣(LeetCode) 3. 珠宝的最大价值 . - 力扣(LeetCode) 4. 下降路径最小和. - 力扣(LeetCode) …

ARM base instruction -- bfxil

Bitfield Extract and Insert Low copies a bitfield of <width> bits starting from bit position <lsb> in the source register to the least significant bits of the destination register, leaving the other destination bits unchanged. 位域提取并插入低位…

1.探索WebSocket:实时网络的心跳!

序言 你可能听说过"WebSokcet"这个词&#xff0c;感觉它好像很高深&#xff0c;但其实它是一个超级酷的小工具&#xff0c;让我们在Web应用里实现实时通信。想象一下&#xff0c;你可以像聊天一样&#xff0c;在浏览器和服务器之间来回“畅聊“&#xff0c;没有延迟…

springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38819)

刚解决Spring Framework 特定条件下目录遍历漏洞&#xff08;CVE-2024-38816&#xff09;没几天&#xff0c;又来一个新的&#xff0c;真是哭笑不得啊。 springboot 修复 Spring Framework 特定条件下目录遍历漏洞&#xff08;CVE-2024-38816&#xff09;https://blog.csdn.ne…

嵌入式硬件电子电路设计(二)开关电源BOOST升压电路

目录 升压电路原理 BOOST电路基本结构 BOOST电路工作过程分析 1. 开关导通阶段 2. 开关关断阶段 3. 稳定输出电压 BOOST电路工作的实际调研分析 1. 非同步BOOST电路 2. 同步BOOST电路 XL6009电路分析 SX1308电路分析 引言&#xff1a;前面已经讲述了Buck电路&#…

如何安装和使用PowerDesigner

教程目录 一、安装二、使用 一、安装 1、启动安装程序。 2、Trial&#xff0c;然后Next。 3、选PRC&#xff0c;同意协议&#xff0c;Next。 4、设置安装路径&#xff0c;Next。 5、Next。 6、全选&#xff0c;Next。 7、Next。 8、Next。 9、等待安装。 10、…

SQL进阶技巧:巧用异或运算解决经典换座位问题

目录 0 问题描述 1 数据准备 2 问题分析 2.1 什么是异或 2.2异或有什么特性? 2.3 异或应用 2.4 本问题采用异或SQL解决方案 3 小结 0 问题描述 表 seat中有2个字段id和student id 是该表的主键(唯一值)列,student表示学生姓名。 该表的每一行都表示学生的姓名和 ID。…