美文网首页
从一个bug来了解Gama空间

从一个bug来了解Gama空间

作者: wlxkhawk | 来源:发表于2021-05-25 23:07 被阅读0次

    从一个bug来了解Gama空间

    bug

    光照强度系数 bug fix前 bug fix后
    0.01 20210525174143 20210525221041
    0.02 20210525174344 20210525221303
    0.03 20210525174423 20210525221412
    0.04 20210525174500 20210525223249
    0.05 20210525174549 20210525223451
    0.1 20210525174641 20210525175708

    看到上面的图,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/SoftRenderer

    相关文章

      网友评论

          本文标题:从一个bug来了解Gama空间

          本文链接:https://www.haomeiwen.com/subject/qmrhsltx.html