iOS 金属。为什么简单地改变 colorPixelFormat 就会产生更明亮的图像?

2024-03-24

在 iOS 上的 Metal 中,默认的 colorPixelFormat 是bgra8Unorm。当我将格式更改为rgba16Float所有图像都变亮。为什么?

一个例子:

Artwork

MTKView有格式bgra8Unorm。 纹理映射四边形。创建的纹理SRGB=false.

MTKView有格式rgba16Float。 纹理映射四边形。创建的纹理SRGB=false.

Why is 一切更亮与rgba16Float。我的理解是SRGB=false暗示无伽玛校正在导入艺术品时完成。假设艺术品具有no gamma应用。

这里发生了什么?


如果您的作品有伽玛(根据您上传的第一张图像),如果您想在线性空间中使用它,则必须将其转换为线性伽玛。

这里发生的情况是,您在线性工作区中显示图像的伽马编码值,而不使用颜色管理或转换来转换这些值values.

但是:阅读您的一些评论,纹理不是图像而是 .svg 吗?您是否将颜色值转换为线性空间?

事情是这样的:RGB 值是毫无意义的数字,除非您定义这些 RGB 值与给定空间的关系。

例如,sRGB 中的 #00FF00 与 Adob​​e98 中的 #00FF00 是不同的颜色。在你的情况下,你是线性的,但是什么初选呢?还在使用 sRGB 原色吗? P3 初选?我没有看到真正的色调变化,所以我假设您在第二个示例中使用 sRGB 原色和线性传输曲线。

也就是说,顶部中间孩子的绿色衬衫的 RGB 值为 #8DB54F,标准化为 0-1,即 0.553 0.710 0.310 。这些数字通过他们自己不知道它们是否是伽马编码的。

sRGB、Y 和光之间的关系:

出于讨论的目的,我们将假设 SIMPLE sRGB gamma 为 1/2.2,而不是分段版本。L* 也一样

在 sRGB 中,#8DB54F 在具有 sRGB 伽马曲线的 sRGB 显示器上显示时,亮度 (Y) 为 39

这可以通过以下方式找到

(0.553^2.2)*0.2126 + (0.710^2.2)*0.7152 + (0.310^2.2)*0.0722

or 0.057 + 0.33 + 0.0061 = 0.39 and 0.39 * 100 = 39 (Y)

但是,如果颜色管理被告知值是线性的,则伽玛校正将被丢弃,并且(或多或少):

0.553*0.2126 + 0.710*0.7152 + 0.310*0.0722

or 0.1175 + 0.5078 + 0.0223 = 0.65 and 0.65 * 100 = 65 (Y)

(假设使用相同的系数。)

亮度 (Y) 是线性的,就像光一样。但人类感知并非如此,sRGB 值也并非如此。

Y 是 CIEXYZ 的线性亮度,虽然它是根据眼睛对不同波长的响应进行光谱加权的,但它在亮度​​方面并不均匀。在 0-100 的范围内,18.4 被认为是中间值。

L* 是 CIELAB 的感知亮度 (L* a* b*),它是(的简化曲线):

L* = Y^0.42在 0-100 的范围内,L* 50 是“感知的中间”值。因此,当解释并显示为 sRGB 时,Y 39 处的绿色衬衫为 L* 69,而 Y 65 约为 L* 84(这些数字基于数学,以下是我的 MacBook 上的颜色选择器的值):

sRGB 是伽马编码信号,这样做是为了充分利用每通道 8 位的有限位深度。有效伽马曲线与人类感知相似,因此使用更多位来定义较暗区域,因为人类感知对黑暗区域中的亮度变化更敏感。如上所述,它是一条简化曲线:

sRGB_Video = Linear_Video^0.455 (需要注意的是,MONITOR 添加了大约 1.1 的指数)

因此,如果 0% 是黑色,100% 是白色,那么中间灰色,大多数人会说在 0% 和 100% 之间的点是:

Y 18.4%. = L* 50% = sRGB 46.7%

也就是说,sRGB 十六进制值 #777777 将显示 18.4 Y 的亮度,相当于 50 L* 的感知亮度。中灰色。

但是等等,还有更多

所以发生了什么,你是telling MTKView您正在向其发送引用的图像数据linear价值观。但你是actually发送它sRGB由于应用了伽玛校正,值变得更轻。然后,色彩管理会获取它认为是线性的值,并将它们转换为输出显示所需的值。

色彩管理需要知道什么是价值观mean,它们与什么色彩空间相关。当你设置SRGB=false那么你告诉它你正在向它发送线性值,而不是伽马编码值。

但是您显然将伽马编码值发送到线性空间,而不将值转换/解码为线性。除非你隐式地这样做,否则线性化不会发生。

SOLUTION

线性化图像数据或设置标志SRGB=true

如果您还有其他问题,请告诉我。而且,您可能还希望看到波因顿伽马常见问题解答 https://poynton.ca/GammaFAQ.html或者也可以通过颜色常见问题解答来进行澄清。

另外,对于你的灰色:线性值 0.216 相当于 sRGB (0-1) 值 0.500

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 金属。为什么简单地改变 colorPixelFormat 就会产生更明亮的图像? 的相关文章

随机推荐