sRGB 与每个分量的位数
sRGB vs bits per component
OpenGL 为 sRGB 颜色定义了以下内部格式 space:
GL_SRGB
GL_SRGB8
GL_SRGB_ALPHA
GL_SRGB8_ALPHA8
您能否解释一下为什么具有其他位精度的格式没有 sRGB/sRGBA 等效项,例如 RGB4
或 RGB16
?
它们不存在,因为它们是不必要的。
sRGB 可以被认为是一种压缩形式。通过使用 sRGB 色彩空间中的颜色,您可以更有效地使用 8-bits-per-component,因为它实质上将更多位分配给场景的较亮区域。如果你使用的是 16-bits-per-component,那么这种压缩是不必要的;你有足够的精度。
但更深层次的原因与硬件实现有关。当 GPU 通过纹理获取操作(例如,GLSL 的 texture
函数)从纹理读取数据时,它需要将这些纹素值转换为着色器中的有用值。 RGBA8 存储无符号归一化整数,因此它必须将 [0, 255] 数据映射到 [0, 1.0] floating-point 范围。这很容易通过一些按位运算来完成。
将 sRGB 色彩空间值转换为 [0, 1.0] 线性范围要复杂得多。但是有一个简单的方法:简单的查找 table。毕竟,在8-bits-per-component,你只需要256个条目。
但如果您必须支持 16-bits-per-component sRGB,则需要 65'536 个条目。还有很多。考虑到以上几点,这是不值得的。
至于较小的组件格式,没有意义。这种格式是一种压缩形式;如果您不尝试节省存储空间,您将永远不会使用它们。但是我们有 更好 的图像压缩形式:各种块压缩格式。它们提供更好的图像压缩(4bpp 或更少,相对于 32bpp),更好的图像 quality 与 16bpp 相比,或两者兼而有之。
并且他们已经支持 sRGB。所以没有理由为劣质压缩格式提供此功能。
OpenGL 为 sRGB 颜色定义了以下内部格式 space:
GL_SRGB
GL_SRGB8
GL_SRGB_ALPHA
GL_SRGB8_ALPHA8
您能否解释一下为什么具有其他位精度的格式没有 sRGB/sRGBA 等效项,例如 RGB4
或 RGB16
?
它们不存在,因为它们是不必要的。
sRGB 可以被认为是一种压缩形式。通过使用 sRGB 色彩空间中的颜色,您可以更有效地使用 8-bits-per-component,因为它实质上将更多位分配给场景的较亮区域。如果你使用的是 16-bits-per-component,那么这种压缩是不必要的;你有足够的精度。
但更深层次的原因与硬件实现有关。当 GPU 通过纹理获取操作(例如,GLSL 的 texture
函数)从纹理读取数据时,它需要将这些纹素值转换为着色器中的有用值。 RGBA8 存储无符号归一化整数,因此它必须将 [0, 255] 数据映射到 [0, 1.0] floating-point 范围。这很容易通过一些按位运算来完成。
将 sRGB 色彩空间值转换为 [0, 1.0] 线性范围要复杂得多。但是有一个简单的方法:简单的查找 table。毕竟,在8-bits-per-component,你只需要256个条目。
但如果您必须支持 16-bits-per-component sRGB,则需要 65'536 个条目。还有很多。考虑到以上几点,这是不值得的。
至于较小的组件格式,没有意义。这种格式是一种压缩形式;如果您不尝试节省存储空间,您将永远不会使用它们。但是我们有 更好 的图像压缩形式:各种块压缩格式。它们提供更好的图像压缩(4bpp 或更少,相对于 32bpp),更好的图像 quality 与 16bpp 相比,或两者兼而有之。
并且他们已经支持 sRGB。所以没有理由为劣质压缩格式提供此功能。