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