色调映射与曝光
光照计算在高动态范围内进行:像素强度可能远超普通显示器的显示能力。色调映射是将 HDR 范围压缩为可显示颜色的最终变换,对场景外观影响很大。PlayCanvas 按相机设置色调映射。
色调映射
可用的色调映射曲线包括:
TONEMAP_LINEAR:不压缩,较亮值直接截断为白色。默认选项。TONEMAP_FILMIC:经典电影曲线,高光部分平缓过渡。TONEMAP_HEJL:鲜明、高对比度的电影曲线近似。TONEMAP_ACES:学院色彩编码系统曲线,广泛用于电影级、照片级真实渲染。TONEMAP_ACES2:ACES 的变体,采用不同的对比度与饱和度平衡。TONEMAP_NEUTRAL:压缩高光,同时尽量减少色相和饱和度偏移;适合产品配置器等要求准确颜色的场合。
对于使用 HDR 光照的基于物理的场景,通常可以从 TONEMAP_ACES 或 TONEMAP_NEUTRAL 开始。
- 引擎
- 编辑器
- React
- Web Components
camera.camera.toneMapping = pc.TONEMAP_ACES;
在层级面板中选中相机,在相机组件中设置 Tonemapping(色调映射)。
import { TONEMAP_ACES } from 'playcanvas';
<Entity name="camera">
<Camera toneMapping={TONEMAP_ACES} />
</Entity>
<!-- tonemap: none | linear | filmic | hejl | aces | aces2 | neutral -->
<pc-entity name="camera">
<pc-camera tonemap="aces"></pc-camera>
</pc-entity>
备注
通过 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。
在引擎的物理单位示例中查看效果:
物理光照单位