光照强度系数 | bug fix前 | bug fix后 |
---|---|---|
0.01 | ||
0.02 | ||
0.03 | ||
0.04 | ||
0.05 | ||
0.1 |
看到上面的图,bug fix前发现修改参数不是线性的,所以要想到去查下是在gama空间还是线性空间做的加强。
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这些参数
有这三种空间的原因是 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前是很暗的,而且是非线性变亮的。
pbr的计算都是在线性空间计算,所以如果美术出图是在0.45gama空间,要先通过2.2次幂转化到线性空间 在做计算,然后计算完再转回sRGB(0.45gama空间),然后显示器显示的时候 会做2.2次幂的计算去显示线性空间的颜色。
所以特别注意基本上计算都在线性空间,在制定工作流的时候要看下美术的图是在什么空间的sRGB还是线性空间
原文:https://www.cnblogs.com/wlxklyh/p/14811407.html