游戏开发论坛

 找回密码
 立即注册
搜索
查看: 47334|回复: 0

游戏色彩101(入门必看)

[复制链接]

4万

主题

5万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
85814
发表于 2023-11-30 08:48:02 | 显示全部楼层 |阅读模式
笔者基于过往的一个美术向讲座整理成本文内容,主要希望帮助美术同学建立起颜色的底层逻辑框架。由于笔者负责的是写实风格的项目,所有问题均从写实角度进行思考,因此可能不完全适用于非写实项目。文章如有错误和疏漏,欢迎大家指正和交流。

一、Light & Color

1. Light

Radiometry(辐射度量学)中的光即Electromagnetic radiation(电磁辐射),是客观物理量,可测量。人可感知的光的波长范围很小。

微信图片_20231130083827.JPG

微信图片_20231130083838.JPG

2. Color

微信图片_20231130083840.JPG

颜色它不是一个客观物理量,而是一个感知结果。

对于人来说,人眼接受到光的能量,最终将刺激传递给大脑解析,产生出“看到的image”。因为人与人之间的人眼、大脑的差异,对同样的光,感知到的色彩会不同。

微信图片_20231130083841.JPG

例如下面这件衣服("The dress"),很多人认为是black and blue, 也有很多人认为white and gold。

微信图片_20231130083842.JPG

人的视网膜上的用来感知色彩的细胞主要是Cone cells,它被分为了3类,分别对短、中、长波长的光波有较强的感知能力,这也是为什么三原色的色彩模型能够较好的表达颜色。

自然界中,人眼接受到的光一般都是不同的波长的光波叠加到一起的。这个不同波长的光的成分组合,一般用光谱来描述。

同色异谱和色彩还原

同色异谱

前面说了人对色彩的感知过程,是将物理量(光)最终主观转换为颜色。实际上,这个过程中,不同的输入可以有相同的输出。

同色异谱现象简单来说就是人感知到的颜色相同,但是光谱组成不同。下图左边是拍摄的一张太阳的照片,右边是显示器里显示的一个太阳,人感知到的色彩类似,但是实际光谱完全不同。

微信图片_20231130083844.JPG

色彩还原(Color Reproduction)

Computer Graphics其实就是计算出一个color image,然后通过显示器发出的光,利用同⾊异谱现象,让观看者看到制作者模拟的画面。这个过程就是Color Reproduction。

目前所有人造显示设备可发出的光的波长、能量这些都是非常有限的,所以无法重现所有的人可感知的色彩。

印刷物、电影银幕这些其实也是在做Color Reproduction,只不过它们不是自己发光,而是靠反弹光。

微信图片_20231130083845.JPG

二、Color in Game - Overview

我们作为游戏开发者,其实就是把Color Reproduction从头到尾做一遍。

对于写实项目来说,目标就是一个:色彩的高保真(high fidelity)。就跟音响领域里的HiFi的含义一样,色彩高保真就是要尽可能还原出人眼看到的颜色(感觉跟“Photorealistic”类似)。

游戏引擎里的Color Pipeline:

微信图片_20231130083847.JPG

上面是从COD的ppt里扣出来的一张图,大部分引擎的这个管线差别不会太大。我个人将引擎内对颜色的处理分为了2个阶段:

  • 模拟客观世界中光线的传播
  • 颜色后处理

整个管线的输入,是各类美术资产(贴图、模型、材质等)、几十上百个引擎参数。输出则是一个image数据,给到显示驱动显示到屏幕上。最终屏幕硬件发出的光线,夹杂着各类环境光进入人眼,交由大脑解析,完成了color reproduction。

三、Color Pipeline - 模拟光线的传播

这部分其实就是基于材质和灯光参数,计算光照,最后算出线性的HDR color的结果。

因为是在模拟光的传播,这是一个客观的可测量的过程,所以很多科学技术手段可以用上,例如photogrammetry的各种思路和工具流程。这一步其实对于写实游戏来说,很像是在做“计算机仿真”,只是多了一步美术设计。

这里涉及到的工作内容,绝大部分都是有正确性基础和物理值参考的:

* 光比、材质的PBR参数
* 引擎基于物理模型实现的lighting model和各种特性(例如procedural sky、volumetric fog等等)的输入参数
* 其他

所以对于高水平的团队,这一步可以做到非常准确和可靠。

它要求有很好的科学思路和流程,否则几乎必然会出问题,最终导致最终效果问题难以定位和收敛(最怕的就是用错误的做法去修复另一个错误)。而这一步的正确性的保证,能把整个色彩高保真的问题的复杂度大幅降低,因为color pipeline的后续部分,绝大部分都是偏主观的,没有绝对的“正确”,很难做到完美的还原真实性。

另外,这一步的输出是HDR color,它的值可以跨越零到几万的范围,例如在我的测试场景里的几个典型的亮度值如下图所示:

(注意:这算不上是一个标准的灯光场景)

微信图片_20231130083848.JPG

微信图片_20231130083850.JPG

因此,千万不要基于最终效果去随意调整灯光参数,他们完全不是线性关系,这也是美术难以驾驭HDR管线的最主要的原因之一。

四、Color Pipeline -颜色后处理

这一步主要包含2部分:

模拟人对颜色的感知行为(Color Perception)

实现颜色数据的转换

1、模拟人对颜色的感知行为

微信图片_20231130083851.JPG

这一步很难像前面的步骤那样,有直接可用的物理模型或者直接可获取的物理参考值,无法量化。

这一步必然需要引入人的主观判断,需要使用科学的方法,由色彩感受能力强、有理论知识、掌握必要工具和分析能力的美术来把控,技术侧提供方法、理论、工程上的支持。

这一步,它不那么依赖于团队的工业化水平,没涉及到那么多的分工,也不像资产生产那样需要长周期验证。可能一个能力超强的灯光师或者TA,就可以成为一个game changer,花几天时间对引擎内的参数做下调整就可以让写实度上升一个level。我觉得这也是为什么现在有不少UE5的小团队游戏都能把写实度做的极高的原因之一。

在这一步要做哪些事情呢?其实游戏业大量参考了摄影界的做法。

(1)曝光

目标效果

其实玩摄影的同学就会很清楚,正确的曝光几乎是整个画面好坏的最关键的一环。过分的under-exposure或者over-exposure,不仅会导致色彩丢失,更会影响写实度,比如白天看着不像白天。

下图是一个典型的under-exposure的例子。大部分物体的固有色都难以分辨,整体光感很奇怪,完全不像是一个晴朗的白天的感受。如果不考虑“强风格化”的话,这个案例的色彩保真度比较低,即使资产、光比等等都做的比较正确。

微信图片_20231130083853.JPG

另外,曝光的结果(亮度缩放过的HDR color)是后续调色和色彩空间转换步骤的输入,而后面这部分颜色操作是非线性的,尤其是对输入当中的那些很亮和很暗的颜色。曝光决定了哪些颜色进入到这些“高非线性区间”,因此对整体结果在另外一个层面又有了巨大的影响。参考下面截图中不同曝光对于天空颜色的影响:

微信图片_20231130083854.JPG

微信图片_20231130083856.JPG

那么怎么确定曝光的值呢?其实这里有2个方面的诉求:色彩高保真,风格化。

对于风格化来说,其实曝光要跟着风格化调色来一起做。没深入研究过,这里就不展开了。

对于色彩高保真来说,一方面可以参考摄影行业的Sunny 16 rule之类的“标准值”,另一方面则可以基于照片或者人眼感受作为reference。总之核心问题就是,不要在曝光的问题上强行参杂美术设计,要以reference为基础。像情绪、氛围这些,应该基于其他层面的美术设计去达到目的,例如场景结构、物件设计和摆放、天气、TOD时间之类的。参考下面的截图:

微信图片_20231130083857.JPG

微信图片_20231130083859.jpg

相关功能

  • 自动曝光

自动曝光的工作原理是整体缩放画面中所有像素的亮度,所以它被归类为global exposure。其目标是”让画面的平均亮度达到一个类似中度灰的亮度“。

它是用来调节画面曝光的最主要的功能。

引擎层面的”基于物理的渲染“的一个很重要的部分就是physically based camera,所以基本上相机上有的曝光功能和参数,引擎里都有。

需要说明的是,人的色彩感知系统的”自动曝光“能力是有限的,例如中午大太阳的室外人眼看着会觉得很亮和刺眼,晚上实在太黑了也会看不清。所以必须基于人的这一感知行为进行手动的曝光控制才行。例如下面几张游戏截图里的大白天就故意调的略为偏亮(over-exposure)。

微信图片_20231130083901.JPG

微信图片_20231130083902.JPG

微信图片_20231130083904.JPG

微信图片_20231130083905.JPG

  • 局部曝光

当画面中同时存在大面积的很亮和和很暗的区域的时候,自动曝光功能就没法解决曝光问题了,因为它是对画面所有像素亮度的整体缩放。这个问题在一些没怎么做过后处理处理视频中可以明显看到:

微信图片_20231130083907.JPG

微信图片_20231130083909.jpg

而人的色彩感知系统是有很强的局部调节亮度的能力的,参考下图(iphone HDR实拍 + 调后期,近似还原了我当时的感受):

微信图片_20231130083910.JPG

微信图片_20231130083912.JPG

可以看到,在自然的光照环境下,人感知到的色彩不太会出现大面积的死黑和爆白。

局部曝光(local exposure)能对画面中各子区域施加不同的亮度缩放值,让原本很黑或者很亮的区域都能保留一些原本的颜色,模拟了人的色彩感知行为,极大的提升了色彩保真度。

UE5已经实现了这个功能(对马岛的方案),能解决相当一部分问题。但是因为算法关系,难以处理极端情况(参数不能调太高)。所以有一些游戏也会尝试一些其他方案来辅助,例如战神使用了”exposure lights“。另外为了缓解这个问题,大部分游戏都会降低自然光源和人造光源之间的光比,例如CyberPunk2077和镜之边缘都将太阳光亮度降低了100倍。

(2)白平衡

白平衡(white balance)简单理解为是一种对色彩整体的修正。相机里都自带auto white balance功能。如果把它关掉的话,拍出来的照片的色彩会非常un-natural,参考下图:

微信图片_20231130083913.JPG

微信图片_20231130083915.JPG

摄影师基于自己实际感知到的色彩,对white balance进行修正之后如下图:

微信图片_20231130083916.JPG

微信图片_20231130083918.JPG

从上面的对比中可以看到,人眼的auto white balance机制从结果上看是有点像de-lighting的,即感知到的色彩一定程度上降低了光源的影响,更接近物体固有色一些(因为进化方向是人需要更好的识别出物体本身的信息?)。

White balance这个对整体色彩的保真度影响巨大,而且引擎没有auto white balance的功能,需要手调参数才行。UE4默认的White balance是6500k。

另外它也存在跟曝光类似的问题,即同一个画面里可能同时有大片的相反色温的区域,这个时候一个white balance参数没法兼顾二者。因为目前也没发现有什么解决方案,在此不做展开了。

我没找到直接测量White balance数值的方法,但是尝试了使用比较粗糙的方法去做校正。具体做法如下:

1、将白板放在无遮挡的室外,拍摄照片后,通过后期调整,还原出当时我的实际感受到的颜色,此作为reference。

微信图片_20231130083953.JPG

2、在引擎里试图还原出室外的光照(方向光+天光),然后也放置一块白板在无遮挡的室外。

微信图片_20231130083955.JPG

3、调节PPV上的white balance参数,让白板的颜色尽可能接近reference中的颜色。

我当时收集了9点多和13点多的数据,9点多的白板轻微偏黄,13点多的白板几乎是无偏的白色,利用上述方法在引擎内校正后的效果大致如下:

微信图片_20231130083956.JPG

微信图片_20231130083959.JPG

(3)调色

调色类似曝光,也是有2个方面的诉求:模拟人的色彩感知行为、风格化。

模拟人的色彩感知行为

UE4使用的这套ACES Filmic Tonemapper其实已经能模拟出一些人的色彩感知行为了,例如高亮色彩的de-saturation,参考官方文档的下图:

微信图片_20231130084000.JPG

但是引擎做的事情还是很有限的,简单来说只是做了一些色彩空间转换和s-curve tonemapping的计算,保证不了色彩的高保真(高质量),因此基本的调色是必须的,可以认为是对色彩的一个基本的修正(color correction)。

当然还是有很多更明显的感知行为需要我们去模拟,一个常被人谈起的例子就是Purkinje effect。

月亮的光是偏暖色温的(4100K),为什么看起来是偏蓝色的?因为人眼在极暗环境下,对颜色的识别能力会下降,并对”蓝色”更敏感。因此有的灯光讲座里,会在夜晚场景的后期调色中,对暗部做蓝色增强处理,并且降低暗部整体饱和度,模拟这一感知行为特征。

风格化调色

这个应该大家都非常熟悉,主要就是为美术表达服务的。以我非常喜欢的CyberPunk2077为例,他们基于对CyberPunk这个世界观的理解,选择的调色风格是电影化+强对比。如下图所示,整体感受就是under-exposure + 高对比度 + 偏高饱和度:

微信图片_20231130084002.JPG

这个风格其实跟人感知到的色彩特征是不一致的,人感知到的色彩就是所谓的natural,即曝光、对比、饱和度这些都很适中,例如Unrecord、Bodycam这2款超写实风格的游戏的调色风格就比较符合这一特点(可能他们基本上没做风格化调色):

微信图片_20231130084003.JPG

微信图片_20231130084005.JPG

(4) 其它

还有一些比较明显的视觉特征可以通过引擎特性来模拟,例如bloom和lensflare,它们对整体画面的写实度其实非常重要。

Bloom

瞳孔的结构有点类似快门,光在穿过它时会发生衍射现象,参考下面的视频:

除了模拟衍射之外,它还能强化画面中高亮的部分从而更好的模拟出真实世界里光强的”高动态范围“,也能提升光源本身的表现,总体来说能大幅提高整体画面的真实感。

Lensflare

Lensflare常常被用来模拟人眼看到超亮光线时候的刺眼效果,例如在比较暗的环境下看到战术手电筒,在中午看到太阳等等。对写实度影响很高。

2. 实现颜色数据的转换

微信图片_20231130084006.JPG

Color pipeline最后需要把色彩数据转换成显示驱动可用的数据,一般涉及到色域转换和数据编码。

显示设备是否支持HDR对这一步的数据处理影响会比较大,一般会分为SDR和HDR两种流程。

另外需要注意,为了完成色彩高保真的目标,绕不开显示器的问题。不同显示器能发出的光谱差别很大,玩家观看显示器的环境光照差异也很大,因此必须为玩家提供合理的手动画面校正工具,这个目前基本也是端游的标配了:

微信图片_20231130084008.JPG

这个问题的另一方面,则是美术工作阶段的色彩高保真问题,比如显示器校正、引擎内色彩管理等等。这些问题都非常重要,还需要做更深入得研究。

文/Ned
来源:腾讯游戏学堂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-11-21 20:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表