当前位置: 华文问答 > 游戏

unity默认是错误的gamma space,而不是linear space,原因是什么?

2016-04-19游戏

早期手机 GPU 没有硬件调整 gamma 的电路,unity 保持对过往的流程兼容性是很必要的,但显然一切都还没到对错……

可以手动在查询贴图时自乘一下,输出时开方一下,这样就很接近线性光照了而且很快。

从艺术角度来看,gamma 和 linear 只是一个流程问题。从结果上看,线性党可以说gamma党灯光衰减过快,反过来gamma党也可以说线性党暗部细节不足,色饱和度损失严重。

gamma 的提出是为了应对在有限精度上,暗部细节信息密度不够的问题的:人眼对低照度的轮廓更敏感,对轮廓比对色彩敏感。这些都是我们压缩图形数据的重要基础。gamma 2.2 时低亮度信息密度比线性高 1.4 倍。在采集视觉信息时,对数据进行gamma编码,播放时还原,一样的信息量,更好的视觉体验。

一开始,游戏是定义自己为「视觉信息合成」的。反正信息都是已有的,无所谓了视觉信息本身怎么来的。技术虽然进步,但是大家都是在有限的条件下做着「只要看起来很赞」就可以的工作。如今计算性能开始富裕了,有的团队觉游戏的画面制作应该分成 生成(渲染)和采集(后期) 两部分:自然应该是要把用于视觉计算的素材给变成科学性的,然后把生成出的图片「用gamma编码」之后拿来显示。

可是美术大大一个问题把你打回原形:你告诉我效果是什么样?你回答他,色饱和度会降低,暗部会变亮,高光不那么亮了,全靠后处理再整……你们友情的小船还在不在了?如今的游戏视觉效果(特别是手游)就像8bit一样,仍然是一种特殊环境下的艺术。你说贴图不去gamma,渲染出来会太亮而且会没法搞HDR特效,美术会大嘴巴抽你-我在制作工具里都看不到最终效果你还好意思跟我谈画面质量?制作人会大嘴巴抽你-你要是在红米上跑不起来下个月给我滚蛋!


非上升到工程的角度来说,的确是要分开光学部分和视觉部分的。可惜游戏还太远,游戏里灯光连个单位都没有,扯淡呢么。CG 很早就提出了光度学的概念,灯光就是有单位的了:坎德拉/球面度 或者 尼特(勒克司/平米)或者走辐射单位 w/srm2 。扛过一天摄影机的人都知道灯要算瓦数……

灯光之外是材质,知乎大神写了很多了。这里不赘述。然后我们就得到了一个完整的图像。只不过这个图像压根没法看:对比度实在太大了。

搞光学的人早就发现了人眼所能识别的动态范围只有 7个EV的样子…… 所以之前所有的感光器材,采用的玩法都是把最接近人皮肤的 18% 反射率表面作为标准,然后上3下4取7个EV的动态范围,更大的范围压缩掉。这样可以最大程度上还原一个人和另一个人面对面时的视觉体验。(细节花色太多,玩摄影的都懂)

数字时代感光问题依然有。我们渲染了一幅图像出来,挑选动态范围的过程叫 tonemapping 色调映射。然后把色调映射后的画面 gamma 编码用于显示。色调映射可以和gamma组合在一起, Unreal4 就是这么弄的 GammaColor = LinearColor / (LinearColor + 0.187) * 1.035 。色调映射是个大学问,同样索尼cmos的手机拍照色彩不同也和从半导体感光到图像的色调映射不同有关。

在没有 光度学照明,物理学材质,物理学渲染的 情况下,一切讨论对错都可能仅仅打破成熟美术生产流程而并不带来画面真实感提升的严重后果。特别是游戏美术还稀缺后期意识。


至于 Unity 在 gamma 空间下跑 standard 材质,这是一种兼容带来的畸形。已经不是基于物理学了,错的没边儿。但也许美术同事同样会给你惊喜。