关于java:从一个bug来了解Gama空间

67次阅读

共计 932 个字符,预计需要花费 3 分钟才能阅读完成。

从一个 bug 来理解 Gama 空间

bug

光照强度系数 bug fix 前 bug fix 后
0.01
0.02
0.03
0.04
0.05
0.1

看到下面的图,bug fix 前发现批改参数不是线性的,所以要想到去查下是在 gama 空间还是线性空间做的增强。

bug 修复前后的代码

Fix 前

color = srgb_to_linear(al.color * lightFactor)) if lightGamma else al.color * lightFactor) //lightFactor 就是 0.01 这些参数

Fix 后

color = (srgb_to_linear(al.color) if lightGamma else al.color) * lightFactor)//lightFactor 就是 0.01 这些参数

线性空间 Gama 空间的阐明

有这三种空间的起因是 CRT 显示器显示图像的时候做了伽马值为 2.2 的纠正(2.2 次幂)之后的 LCD 显示器为了兼容性也做了同样的纠正(2.2 次幂),2.2 是 0.45 的倒数 相互对消失去了与原始图像始终的图像(color ^ 0.45 ^ 2.2 = color ^ 1)所以绝大多数的图片都是做了 0.45 次幂的校对过的 等显示的时候会 2.2 次幂回去。

回到这个 bug,

Fix 前:
(color 0.01) ^ 2.2 = 0.01 ^ 2.2 color ^ 2.2

Fix 后是:
(color) ^ 2.2 0.01 = 0.01 color ^ 2.2

所以 0.01 ^ 2.2 远远小于 0.01 所以看到 Fix 前是 很暗的 ,而且是 非线性变亮的

Gama 空间对游戏开发的影响

pbr 的计算都是在线性空间计算,所以如果美术出图是在 0.45gama 空间,要先通过 2.2 次幂转化到线性空间 在做计算,而后计算完再转回 sRGB(0.45gama 空间),而后显示器显示的时候 会做 2.2 次幂的计算去显示线性空间的色彩。
所以 特地留神基本上计算都在线性空间,在制订工作流的时候要看下美术的图是在什么空间的 sRGB 还是线性空间

个人简介:高级开发工程师,趣味和畛域(Unity、Unreal、cocos creator、安卓终端开发、ios 终端开发、音视频开发、图形学),欢送加 W:wlxklyh 探讨问题。(欢送 star:https://github.com/wlxklyh/So…

正文完
 0