自动曝光
AutoExposureEffect 根据所见亮度调整相机曝光,类似人眼适应黑暗或日光。每帧测量屏幕亮度直方图,只平均两个分位之间的部分,排除深阴影、太阳等最暗和最亮区域,再逐渐调整曝光,让平均值显示为中灰。
自动曝光并非 CameraFrame 内置效果,需要创建后通过 addEffect 添加:
const autoExposure = new AutoExposureEffect(app.graphicsDevice);
cameraFrame.addEffect(autoExposure);
cameraFrame.update();
调整的曝光
效果调整相机实际渲染使用的曝光:通常是场景曝光,使用物理单位时则为物理相机曝光。调整范围为相对基础曝光的 minEv 到 maxEv 档,因此应先针对典型视图设定曝光,再让效果在其基础上适应。
帧中所有使用曝光的部分都会跟随,包括合成色调映射和抗锯齿。此效果需要色调映射,因为没有它合成就不应用曝光;rendering.toneMapping 为 TONEMAP_NONE 时效果不活动。
测光
效果从场景半分辨率副本测量屏幕亮度,构建 64 个区间的直方图。三个属性选择参与平均的部分:
| 属性 | 说明 |
|---|---|
lowPercent | 从平均中排除的最暗屏幕比例,0–1,例如深阴影。越高越侧重明亮区域,使图像变暗。默认 0.1。 |
highPercent | 只对低于该亮度分位的部分平均,0–1,排除太阳和强高光等最亮部分。默认 0.9。 |
centerWeight | 屏幕中心相对边缘的亮度权重,0–1。0 为全屏等权,1 主要考虑中心。默认 0.5。 |
适应
| 属性 | 说明 |
|---|---|
compensation | EV 曝光补偿,决定平均亮度比中灰亮多少。正值提亮,负值压暗,每档翻倍或减半。默认 0。 |
minEv | 相对相机曝光的最低 EV。-2 允许在明亮场景中降到四分之一亮度。默认 -6。 |
maxEv | 相对相机曝光的最高 EV。2 允许在黑暗场景中提高到四倍亮度。默认 6。 |
speedDarkToLight | 场景变亮时的适应速度,例如从暗室走向日光。约在 1 / speedDarkToLight 秒内完成三分之二变化。默认 3。 |
speedLightToDark | 场景变暗时的适应速度。人眼适应黑暗比适应明亮更慢,因此默认 1。 |
与所有效果一样,属性变化在下一次 CameraFrame#update 生效。
镜头切换
切换到另一视图后,从旧视图渐变适应通常不自然。切换时调用 reset,忽略切换前的测量,并立即适应下一次测量:
cameraEntity.setPosition(nextShot.position);
autoExposure.reset();
首次测量也会立即适应。
读取曝光
直方图从 GPU 回读,因此曝光通常落后屏幕一两帧,渐变适应会掩盖延迟。两个属性提供结果:
调试视图
autoexposure 视图按实际曝光显示场景,不带其他效果,并在底部绘制亮度直方图。参与平均的区间高亮,平均值标黄,相机曝光为中灰的亮度标蓝。适应完成后两个标记重合。
cameraFrame.debug = 'autoexposure';
cameraFrame.update();
编辑器中的自动曝光
auto-exposure.mjs 的 autoExposureEffect 脚本应与 cameraFrame 脚本放在同一相机实体,将效果加入该相机的 CameraFrame。脚本属性对应效果属性,Debug 显示调试视图。
示例
从日照庭院走入连接庭院的黑暗隧道,曝光随之适应,对明亮的适应快于对黑暗的适应。