跳到主要内容

色调映射与曝光

光照计算在高动态范围内进行:像素强度可能远超普通显示器的显示能力。色调映射是将 HDR 范围压缩为可显示颜色的最终变换,对场景外观影响很大。PlayCanvas 按相机设置色调映射。

色调映射​

可用的色调映射曲线包括:

  • TONEMAP_LINEAR:不压缩,较亮值直接截断为白色。默认选项。
  • TONEMAP_FILMIC:经典电影曲线,高光部分平缓过渡。
  • TONEMAP_HEJL:鲜明、高对比度的电影曲线近似。
  • TONEMAP_ACES:学院色彩编码系统曲线,广泛用于电影级、照片级真实渲染。
  • TONEMAP_ACES2:ACES 的变体,采用不同的对比度与饱和度平衡。
  • TONEMAP_NEUTRAL:压缩高光,同时尽量减少色相和饱和度偏移;适合产品配置器等要求准确颜色的场合。

对于使用 HDR 光照的基于物理的场景,通常可以从 TONEMAP_ACES 或 TONEMAP_NEUTRAL 开始。

camera.camera.toneMapping = pc.TONEMAP_ACES;
备注

通过 CameraFrame 启用后处理时,色调映射由后处理管线执行,应在 CameraFrame 的渲染选项中设置,而不是在相机上设置。

伽马校正​

色调映射后,相机输出经过伽马编码,以便在标准 sRGB 屏幕上显示。这由 gammaCorrection 控制:

  • GAMMA_SRGB:为 sRGB 显示器编码输出。这是默认值,也是所有常规渲染的推荐设置。
  • GAMMA_NONE:输出保留在线性空间中。仅适用于高级 HDR 管线:先渲染到中间 HDR 纹理,再在后续通道中进行色调映射和伽马校正。在标准显示器上直接显示会使场景过暗。

关于为何在线性空间渲染并在最后进行伽马编码,参见线性工作流。

物理曝光​

默认情况下,场景亮度由简单的 scene.exposure 乘数控制。也可以用摄影师熟悉的三个属性,模拟真实相机的曝光:

app.scene.physicalUnits = true; // light intensities are now in physical units (lux)

camera.camera.aperture = 16; // f-stops — higher means less exposure (default: 16)
camera.camera.shutter = 1 / 1000; // seconds — longer means more exposure (default: 1/1000)
camera.camera.sensitivity = 1000; // ISO — higher means more exposure (default: 1000)
备注

aperture、shutter 和 sensitivity 仅在 scene.physicalUnits 为 true 时生效。为默认值 false 时,改用 scene.exposure。

在引擎的物理单位示例中查看效果:

物理光照单位