跳到主要内容

线性工作流

在现代渲染引擎中,线性工作流是实现符合物理规律的光照和颜色表现的关键。它确保从着色到后处理的所有计算都在线性颜色空间中进行,避免伽马压缩纹理或错误混合造成偏差。在线性空间中工作,仅在最终输出阶段进行伽马校正,可以让光照、纹理和特效保持一致,得到更真实、可预测的画面。

在引擎 v1 中,线性工作流仅限于 StandardMaterial;在 v2 中,它已全面集成到所有着色器和渲染阶段,包括 ShaderMaterial、UI 渲染、粒子及其他所有元素,确保全流程的颜色处理一致且符合物理规律。

着色器输入和输出处理​

正确的线性工作流确保着色器中的颜色计算符合物理规律。需要谨慎处理输入和输出,才能在整个渲染管线中保持准确。

着色器输入:确保数据为线性值​

着色器要求所有输入值都在线性空间中,以免产生错误的光照结果。这同时影响纹理和 uniform 颜色值:

  • 存储颜色数据的纹理(例如反照率贴图)应标记为 sRGB。采样纹理时,GPU 自动将 sRGB 编码值转换到线性空间,确保颜色计算正确。
  • 对于 StandardMaterial、粒子渲染和其他内置渲染系统,颜色 uniform 会自动从伽马空间转换到线性空间。但使用 Material.setParameter 或 MeshInstance.setParameter 手动设置 uniform 时,调用者必须确保传入线性值。对于所有参数都必须通过 setParameter 显式定义的 ShaderMaterial,这一点尤其重要。Color 类提供 Color.linear() 函数,帮助将伽马空间颜色转换为线性空间颜色。

当所有输入都在线性空间中时,着色器就能进行符合物理规律的光照计算。

着色器输出:管理伽马校正​

写入最终颜色输出时,伽马校正的处理方式取决于使用 LDR(低动态范围)还是 HDR(高动态范围)渲染:

  • LDR 渲染:在写入渲染目标前,立即在着色器中进行伽马校正,确保在普通显示器上正确显示。
  • HDR 渲染:写入渲染目标时颜色保持在线性空间中,通常需要浮点格式(如 RGBA16F 或 RGBA32F)来保留精度并避免色带。伽马校正延后进行,通常位于最终色调映射或后处理阶段,让泛光和颜色分级等效果能处理高精度的线性 HDR 颜色。

这种有序的处理方式保证光照、混合和后处理运算的一致性,从而得到更真实、可预测的渲染结果。