3D游戏的照明设计理论,第4部分:如何在游戏引擎中照亮游戏世界

 

从更一般和更概念的角度来看,这是有关我如何处理游戏照明的系列文章的一部分。我在Unity中构建了大部分示例,但这通常适用于任何3D游戏引擎,其中大多数具有类似的照明工具。

我们开始思考了有关光照的文化和概念,在第一部分。在第二部分,我们在关卡设计和可读性方面更有效地处理了光照。然后在第三部分中,我们调查了用于游戏中的三点照明方法。但是,如果我们不能在计算机图形学的约束下真正实现这一理论,那么任何的理论都无关紧要。

传统上,光照是在游戏引擎中计算和渲染较慢或者是“昂贵”的事物之一。考虑一下可见光的科学原理:无数个不同波长的光子以难以想象的速度反弹,以某种方式进入您的眼睛。为了以合理的帧速率进行任何此类操作,游戏引擎必须从策略上以特定的方式去简化光照计算,然后希望玩家不要注意到这些不一致不协调之处。这是“冰箱逻辑” -我们希望玩家能够点头,只要它“看起来正确”即可。

好的,那么在3D游戏引擎中通常是如何照明的呢?

最简单的照明形式是“环境光”,这是恒定的默认照明水平,适用于世界上的每个模型,甚至是阴影中的零件。这一点都不现实,因此环境光通常更多地充当“补光灯”(请参阅​​第3部分),尤其是对于室外空间,在室外空间,通常使用深色海军蓝来确保阴影不会终止漆黑。

但是环境光会平均地在每个对象上施加平坦平均的光照效果,因此有人可能会说它甚至不符合照明条件,因为它并不能真正帮助我们了解空间表面的深度或拓扑(几何造型),这对于基本的游戏或者是寻路来说,通常是至关重要的。(请参阅第二部分)(“我可以在这座山上走吗?还是说太陡了?”)……要使光看起来像光,必须根据表面的方向进行更改和调整,而标准的环境照明不会做到这一点。

好的,调整角度后,这样看起来变得更好了,现在我们有了一些形状上的差异。

“定向光” 是阳光或任何其它地方的全局光源,从一个给定的旋转方向产生恒定的光照。它会一次性的直接影响整个世界,因此可以放置在任何地方,甚至是墙壁内。只有它的方向很重要。接着,定向灯光将在朝向它的每个表面上发光,并且与太阳/月亮的距离无关紧要。因为大多数场景和游戏世界都只有一个定向光,所以它们通常更像“主光”。(请参阅第2部分)

“聚光灯”是施放在Y向X度范围的锥形灯光。如果你要制作具有很多舞台灯光,嵌入式天花板灯或路灯的游戏,那么你可能会严重依赖聚光灯。聚光灯最常见的用途是高处的聚光灯指向下方,不强调天花板,而是突出凹显出地板。通过这种方式,聚光灯非常适合暗示特定的方向或者是强调特定的位置,无论它们发出的具体光芒如何。

根据你对聚光灯调整倾斜的角度,让玩家并不是很清楚光源实际来自何处(参考第一部分的内容),学会利用这个优势和技巧。

最后,“点光源”是一个看不见的全范围的光球,它以X强度向所有的方向投射光照。通常这种类型常常用于台灯,灯笼或枝形吊灯。点光源确实擅长于吸引给定的光源,因为它们通常必须要靠近它们需要照亮的任何物体,并且附近所有的被投射物体实际上都将指向该光源。(相对于聚光灯,尚不十分清楚光源到底来自何处,我们也不会在乎。)

总体而言,这4种光源类型通常在每个3D游戏引擎或渲染器中都可以找到。它们有点像一个完整的域:

但实际上,这仅仅是一个开始。

直接照明即初始发射时的第一束光线,这就是为什么它被称为“直接照明”的原因,而不是“间接照明”,后者试图模拟光如何反弹或与表面相互作用。在上面最右边的图像中,请注意三角形中的红色灯光是如何被反弹到地板上,立方体中的蓝色如何反弹到墙壁上的阴影中,背景通常只是更亮。这些效果来自周围空间内所产生的光线的反射。传统上,尝试实时计算这些效果并以每秒60帧的速度去渲染你喜欢的角色面部,所需要消耗的性能对于游戏来说非常的昂贵。(在以后的文章中,我将对此进行更多讨论。)

尝试将手举在明亮的光源之前-手轮廓周围的红色条纹称为“次表面散射”,因为光线实际上在皮肤表面下方通过并从血液中反射出来。我们可以说标准的直接照明模型没有考虑到不同的材质或阴影类型,因此这意味着我们必须设计一个系统来解决该问题……眩光或者你的眼睛最终应该以什么样的方式去适应?黑暗还是明亮的空间?我们也必须设计这些系统!

因此,这基本上就是游戏照明的技术历史:试图弥补此基本照明模型中的所有漏洞。因此,四种基本光源类型仅仅是游戏照明的开始。我们还有更多的事情要考虑和实施:

假设你是在制作游戏中某个城市的夜景。

首先,从全局设置开始。我的环境光设置为深蓝紫色,而定向光光源在整个场景上投射出令人惊讶的明亮蓝光。(请参阅 “黑暗好莱坞”:我们只希望它感到黑暗,而不是实际上物体是黑暗的。)

然后开始添加本地灯光。在这种情况下,下面有一个聚光灯和一个微弱的点光源,以模拟光线的反射和溅射。

现在让我们开始添加不是“光”的东西,但是会强烈影响我们对光的感知。

灯具的模型现在具有自发光的发光材质,看起来很明亮。光晕是一个单独的2D精灵,它会根据玩家镜头的距离淡入和淡出。有一个粒子系统在灯光下以锥形喷洒灰尘。我呢吧还对相机应用了光晕,环境光遮挡和色差效果。并且不要忘记天空盒(Skybox),这是“好莱坞黑暗”真正起作用的唯一方法。最后,我在背景中添加了一些雾,以模拟一些黑暗/大气散射,并将场景背景再推回一点。

请记住,灯光的感知亮度取决于两件事:(1)灯光的实际亮度;(2)灯光周围区域的相对亮度/暗度。通常,尝试使不重要的事物变暗或变暗,以便更重要的事物得到更多关注。连续性的环境中的上下文真的很重要!

镜面反射(Specular Reflection),边缘照明和自发光(Emission),投影与阴影,色差,屏幕空间环境光遮挡(SSAO),立方体贴图(Cubemap)和球谐光照(球面映射),高动态范围色调映射(HDRI),眩光和光晕...在游戏引擎中,这些技术可作为单独的功能运行,有选择地启用或禁用该功能以优化游戏以达到某个帧速率或达到某种艺术风格,但在现实生活中,这些都是我们所知道的统一的光照现象的一部分。

最终,玩家只会在那里看到一个光源。但是我们会更好地了解,我们将能够看到我们精心制作的微妙的效果处于一个什么样的系统...

游戏照明不是一个统一的系统。而是,这是所有这些随机的杂物的拼凑而成,希望它们可以一起使用。作为一名设计师,使所有的这些不同的效果看起来是一件连贯的事情是我们的工作内容。

有时候,当你可以创建不带任何可见灯具的浮动光源时,此控件确实非常好。(换句话说,我的照明设计老师说:“我会杀了那种力量。”)但是有时候,所有的这些责任都是令人讨厌的,因为您必须手动添加每个部分并与其他所有部分进行微调,并且可以做很多工作。(这就是为什么许多Triple-A工作室现在已经从关卡设计师那里取消了费时的照明工作,并将这项工作交给了环境艺术家和/或专门的照明艺术家的原因。有关关卡设计历史的详细信息,请参阅作者的GDC2015讨论-关卡设计的历史与未来。)

游戏中的照明不仅仅是照明。这是关于整体形象和你想要建立什么样的情绪的,同时在你的世界中似乎足够的合理,以至于玩家不会经常的“恍然大悟”(发现不合理的地方)。但是这种“合理性”的想法取决于“什么是现实的”的概念-这影响了开发什么类型的新照明技术,这影响了我们的工具集在美学上潜在的可能性,从而推动了更多的“现实主义”等等。

下次,我将分解一些关于什么是“良好的游戏照明”的基本假设,以及我们如何能够超越这些假设(如果有的话)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity shader 变种(多重编译 multi_compile)

一、定义 在unity中我们可以通过使用#pragma multi_compile或#pragma shader_feature指令来为shader创建多个稍微有点区别的shader变体。这个Shader被称为宏着色器(mega shader)或者超着色器(uber shader)。实现原理:…

AndroidStudio导出aar文件给Unity使用

AndroidStudio导出aar文件给Unity使用 本文参考 :http://www.devacg.com/?post548 Demo地址:https://github.com/JulyNine/AndroidToUnity 一、用Android Studio创建个空工程 注意:包名要与Unity中工程的包名不一致,不然打包时…

Unity C# Job System介绍(四) 并行化Job和故障排除(完结)

并行化job ParallelFor jobs​docs.unity3d.com 当调度Jobs时,只能有一个job来进行一项任务。在游戏中,非常常见的情况是在一个庞大数量的对象上执行一个相同的操作。这里有一个独立的job类型叫做IJobParallelFor来处理此类问题。ParallelFor jobs当调…

C# Job System

概述 设计目的:简单安全地使用多线程,随便就能写出高性能代码 收益:FPS更高,电池消耗更低(Burst编译器) 并行性:C# Job System和Unity Native Job System共享工作线程worker threads&#xf…

Unity游戏开发——C#特性Attribute与自动化

这篇文章主要讲一下C#里面Attribute的使用方法及其可能的应用场景。 比如你把玩家的血量、攻击、防御等属性写到枚举里面。然后界面可能有很多地方要根据这个枚举获取属性的描述文本。 比如你做网络框架的时候,一个协议号对应一个类的处理或者一个方法。 比如你做…

Unity c#中Attribute用法详解

举两个例子,在变量上使用[SerializeFiled]属性,可以强制让变量进行序列化,可以在Unity的Editor上进行赋值。 在Class上使用[RequireComponent]属性,就会在Class的GameObject上自动追加所需的Component。 以下是Unity官网文档中找…

走进LWRP(Universal RP)的世界

走进LWRP(Universal RP)的世界 原文:https://connect.unity.com/p/zou-jin-lwrp-universal-rp-de-shi-jie LWRP自Unity2018发布以来,进入大家视野已经有一段时间了,不过对于广大Unity开发者来说,依然相对…

Unity 2017 Game Optimization 读书笔记(1)Scripting Strategies Part 1

1.Obtain Components using the fastest method Unity有多种Getcomponet的方法&#xff1a; GetComponent(string), GetComponent<T>() GetComponent(typeof(T)) 哪种效率最高会跟随Unity版本的变化而变化&#xff0c;对于Unity 2017&#xff0c;本书作者的测试是Ge…

C# 多态相关的文章

一 C# 多态的实现 封装、继承、多态&#xff0c;面向对象的三大特性&#xff0c;前两项理解相对容易&#xff0c;但要理解多态&#xff0c;特别是深入的了解&#xff0c;对于初学者而言可能就会有一定困难了。我一直认为学习OO的最好方法就是结合实践&#xff0c;封装、继承在…

C++ 虚函数和虚表

几篇写的不错的文章&#xff0c;本文是整合了这几篇文章&#xff0c;感谢这些大佬 https://www.jianshu.com/p/00dc0d939119 https://www.cnblogs.com/hushpa/p/5707475.html https://www.jianshu.com/p/91227e99dfd7 多态: 多态是面相对象语言一个重要的特性,多态即让同一…

Unity 2017 Game Optimization 读书笔记(2)Scripting Strategies Part 2

1. Share calculation output 和上一个Tip很像&#xff0c;可以缓存计算结果或者各种信息&#xff0c;避免多次重复的计算&#xff0c;例如在场景里查找一个物体&#xff0c;从文件读取数据&#xff0c;解析Json等等。 容易忽略的点是常常在基类了实现了某个方法&#xff0c;在…

Unity 2017 Game Optimization 读书笔记(3)Scripting Strategies Part 3

1.Avoid retrieving string properties from GameObjects 通常来讲&#xff0c;从C#的object中获取string 属性没有额外的内存开销&#xff0c;但是从Unity中的Gameobject获取string属性不一样&#xff0c;这会产生上一篇讲到的 Native-Managed Bridge&#xff08;Native内存和…

Unity 2017 Game Optimization 读书笔记(4)Scripting Strategies Part 4

1.Avoid Find() and SendMessage() at runtime SendMessage() 方法和 GameObject.Find() 相关的一系列方法都是开销非常大的。SendMessage()函数调用的耗时大约是一个普通函数调用的2000倍&#xff0c;GameObject.Find() 则和场景的复杂度相关&#xff0c;场景越复杂&#xff0…

Unity HDRP中的光照烘焙测试(Mixed Lighing )和间接光

部分内容摘抄自&#xff1a;https://www.cnblogs.com/murongxiaopifu/p/8553367.html 直接光和间接光 大家都知道在Unity中&#xff0c;我们可以在场景中布置方向光、点光、聚光等类型的光源。但如果只有这些光&#xff0c;则场景内只会受到直接光的影响&#xff0c;而所谓的…

聊聊Unity项目管理的那些事:Git-flow和Unity

感谢原作者https://www.cnblogs.com/murongxiaopifu/p/6086849.html 0x00 前言 目前所在的团队实行敏捷开发已经有了一段时间了。敏捷开发中重要的一个话题便是如何对项目进行恰当的版本管理。项目从最初使用svn到之后的Git One Track策略再到现在的GitFlow策略&#xff0c;中…

聊聊网络游戏同步那点事

写的非常好的一篇博文&#xff0c;转载自https://www.cnblogs.com/murongxiaopifu/p/6376234.html 0x00 前言 16年年底的时候我从当时的公司离职&#xff0c;来到了目前任职的一家更专注于游戏开发的公司。接手的是一个platform游戏项目&#xff0c;基本情况是之前的团队完成…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics(1)

The Rendering Pipeline 渲染表现差有可能取决于CPU端&#xff08;CPU Bound&#xff09;也有可能取决于GPU(GPU Bound).调查CPU-bound的问题相对简单&#xff0c;因为CPU端的工作就是从硬盘或者内存中加载数据并且调用图形APU指令。想找到GPU-bound的原因会困难很多&#xff…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics(2)

Lighting and Shadowing 现代的游戏中&#xff0c;基本没有物体能在一步就完成渲染&#xff0c;这是因为有光照和阴影的关系。光照和阴影的渲染在Fragment Shader中需要额外的pass。 首先要设置场景中的Shadow Casters和Shadow Receivers&#xff0c;Shadow Casters投射阴影&…

Unity 2017 Game Optimization 读书笔记 The Benefits of Batching

batching&#xff08;合批&#xff09; 和大量的描述一个3D物体的数据有关系&#xff0c;比如meshes&#xff0c;verices&#xff0c;edges&#xff0c;UV coordinates 以及其他不同类型的数据。在Unity中谈论batching&#xff0c;指的是用于合批mesh数据的两个东西&#xff1a…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (3)

Rendering performance enhancements Enable/Disable GPU Skinning 开启GPU Skinning可以减轻CPU或GPU中Front End部分中某一个的负担&#xff0c;但是会加重另一个的负担。Skinning是mesh中的顶点根据动画中骨骼的当前位置进行计算&#xff0c;从而让角色摆出正确的姿势。 …