RGB 和 sRGB 的主要区别在于它们的颜色空间编码方式:

RGB(线性 RGB)

  • 使用线性的颜色空间
  • 颜色值和实际亮度成正比关系
  • 适合进行颜色计算和处理
  • 数学公式:输出亮度 = 输入值

sRGB(标准 RGB)

  • 使用非线性的颜色空间(gamma 约为 2.2)

  • 更接近人眼感知的方式

  • 是显示器的标准颜色空间

  • 数学转换公式(简化版):

    if (linear <= 0.0031308)
        sRGB = 12.92 * linear
    else
        sRGB = 1.055 * pow(linear, 1/2.4) - 0.055
    

主要差异点

Gamma 校正

  • sRGB 包含 gamma 校正
  • RGB 是线性的,没有 gamma 校正
  • gamma 校正让暗部细节更丰富

使用场景

  • 渲染计算:使用线性 RGB

    • 光照计算
    • 颜色混合
    • HDR 渲染
  • 最终显示:使用 sRGB

    • 输出到显示器
    • 保存图片
    • 用户界面

在图形编程中的应用

// Vulkan中指定sRGB格式
VkFormat colorFormat = VK_FORMAT_B8G8R8A8_SRGB;
 
// OpenGL中启用sRGB
glEnable(GL_FRAMEBUFFER_SRGB);

正确处理 RGB 和 sRGB 的转换对于获得准确的颜色显示非常重要,特别是在进行物理基础渲染(PBR)时。不正确的处理会导致颜色看起来过亮或过暗。