TA工具箱首页 / TA 术语百科

sRGB 与线性色彩空间:理解伽马校正与渲染管线

2026-08-24

色彩空间概述

在计算机图形学中,色彩空间定义了颜色的表示方式。sRGB 和线性是两种常见的色彩空间。sRGB 是一种非线性的色彩空间,广泛应用于显示器和图像文件;线性色彩空间则直接存储物理光强度值,用于光照计算。正确处理两者之间的转换对于实现真实感渲染至关重要。

为什么需要线性色彩空间

物理光照是线性的,即两倍的光强度产生两倍的辐射。然而,人眼对亮度的感知是非线性的,对暗部变化更敏感。因此,显示设备(如 CRT、LCD)使用伽马编码来优化感知,输出与输入电压呈非线性关系。sRGB 标准定义了这种非线性编码,通常近似为伽马 2.2 曲线。

如果直接在 sRGB 空间进行光照计算,由于非线性,叠加和混合会产生错误的结果,导致暗部失真、颜色偏移等。因此,渲染管线通常在内部使用线性空间进行计算,最后将结果转换为 sRGB 用于显示。

伽马校正与 sRGB 转换

伽马校正是指在线性与 sRGB 之间转换的过程。典型公式:

  • 线性到 sRGB:`C_srgb = C_linear^(1/2.2)`(近似)
  • sRGB 到线性:`C_linear = C_srgb^2.2`(近似)

精确的 sRGB 转换使用分段函数,但近似通常足够。在渲染管线中:

  1. 纹理采样:如果纹理以 sRGB 格式存储(如普通颜色贴图),需要先转换到线性空间再用于光照计算。引擎可以自动处理(如 Unity 中标记 sRGB 纹理)。
  2. 光照计算:在线性空间进行。
  3. 最终输出:将结果从线性转换到 sRGB,写入帧缓冲或显示。
  4. 在游戏引擎中的实现

    **Unity**:

    • 在 Player Settings 中选择 Color Space 为 Linear 或 Gamma。Linear 模式下,引擎自动处理 sRGB 纹理的解码和输出编码。
    • 纹理资源可标记为 sRGB(默认颜色纹理)或 Linear(法线贴图、金属度贴图等数据纹理)。

    **Unreal Engine**:

    • 默认使用线性工作流,纹理导入时设置 sRGB 选项。
    • 项目设置中可调整 Gamma。

    正确设置色彩空间对于 PBR 渲染尤为重要,因为 PBR 依赖物理正确的光照计算。

    常见问题与注意事项

    • **纹理标记错误**:如果法线贴图被标记为 sRGB,采样时会错误解码,导致法线方向错误。因此,数据纹理(如法线、金属度、粗糙度)应标记为 Linear。
    • **混合操作**:在线性空间混合颜色更准确,在 sRGB 空间混合可能导致边缘伪影。
    • **UI 元素**:UI 通常直接使用 sRGB 颜色,不需要线性转换。
    • **移动平台**:部分移动 GPU 不支持线性渲染,需要权衡。

    常见问题

    sRGB 和线性色彩空间有什么区别?

    sRGB 是非线性编码,用于显示和图像存储;线性色彩空间直接表示物理光强度,用于光照计算。渲染时需在线性空间计算,输出时转换为 sRGB。

    为什么渲染要使用线性色彩空间?

    因为光照是线性的,在线性空间计算可以保证物理正确性,避免颜色变暗或偏移。sRGB 空间计算会导致错误的光照结果。

    伽马校正是什么?

    伽马校正是在线性与 sRGB 之间转换的过程,通过幂函数调整亮度编码,以适应人眼感知和显示设备。

    如何知道纹理是否需要 sRGB 解码?

    颜色纹理(反照率、漫反射)需要 sRGB 解码;数据纹理(法线、金属度、粗糙度)不需要,应标记为 Linear。

    Unity 中如何切换到线性空间?

    在 Player Settings > Other Settings > Color Space 中选择 Linear,并确保所有纹理的 sRGB 标记正确。

常见问题

sRGB 和线性色彩空间有什么区别?

sRGB 是非线性编码,用于显示和图像存储;线性色彩空间直接表示物理光强度,用于光照计算。

为什么渲染要使用线性色彩空间?

因为光照是线性的,在线性空间计算可以保证物理正确性,避免颜色变暗或偏移。

伽马校正是什么?

伽马校正是在线性与 sRGB 之间转换的过程,通过幂函数调整亮度编码,以适应人眼感知和显示设备。

如何知道纹理是否需要 sRGB 解码?

颜色纹理(反照率、漫反射)需要 sRGB 解码;数据纹理(法线、金属度、粗糙度)不需要,应标记为 Linear。

Unity 中如何切换到线性空间?

在 Player Settings > Other Settings > Color Space 中选择 Linear,并确保所有纹理的 sRGB 标记正确。