关于 threejs-exposure-color-grading
用于设计和验证 Three.js 曝光与调色流程的技能,强调明确指定测光、适应、色调映射和输出转换的所有者,并针对不同方案进行验证。
主要功能
- 01场景线性颜色流程
- 02固定与自动曝光
- 03GPU 驻留的适应状态
- 04色调映射与 LUT 放置
- 05重置与不连续处理
- 06分支专用验证用例
适用场景
- 01为校准视图设置曝光
- 02构建自动曝光测光
- 03在 Three.js 渲染链中添加 LUT
- 04检查输出转换的所有权
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ linegel/ threejs-complete-set-of-skill --skill threejs-exposure-color-grading安装后在 Claude Code 中输入/threejs-exposure-color-grading确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEagents/openai.yamlexamples/identity-3d-lut.mjsreferences/scene-referred-color-pipeline.md详细介绍
曝光与色彩分级
在最终图像链路之前,始终将拍摄信号保持在线性场景空间中。每个曝光组、色调映射和输出转换都由一个明确指定的负责人控制。
1. 锁定色彩约定
明确指定线性场景空间的工作原色、辐射亮度标度、Alpha 约定,以及所有进入拍摄信号的生成器。在测量辐射亮度之前,先通过材质/光照模型将辐照度转换为辐射亮度。对灯光、环境、氛围、发光材质、泛光源和光学效果应用统一的物理或感知辐射亮度标度。
将目标或视图划分为曝光控制组。只有当组内的辐射亮度基准、曝光策略和重置历史都相同时,才可共享 GPU 状态;自动曝光组还必须使用相同的测光遮罩、关键值和采样计划,并明确指定一个来源或合并聚合方式。设置相同的独立图像不可互换作为测光输入。每组必须且只能指定一个曝光负责人、一个色调映射负责人和一个输出转换负责人。
**完成标准:**每个拍摄输入都具有唯一的基准和标度;每组都明确列出成员、曝光/色调映射/输出负责人,以及状态共享策略。
2. 选择满足图像要求的最低成本测光方式
按依赖顺序选择:
- 对于受控或经过校准的视图,使用固定 EV;
- 对于常规的全局自动曝光,使用分层网格或分块采样器;
- 只有在每个像素或精确遮罩都必须参与时,才使用精确的全像素分层归约;
- 只有在其他功能会使用其层级或空间统计数据时,才使用对数亮度金字塔;
- 只有在百分位裁剪能够解决已证实的离群值或双峰光照问题时,才使用直方图。
默认采样解析后的泛光前 HDR。这样可避免时域噪声影响测光,并避免泛光与曝光之间产生反馈。使用其他采样点时,必须将其设为图像策略,并配备回归测试样例。
实现采样、精确、金字塔或直方图测光时,请阅读色彩管线参考;其中包含加权对数公式、流量模型和小型发光体故障测试。
**完成标准:**固定 EV 必须明确其数值/校准方式,并且不得读取测光源;否则,必须选择一种测光方式,明确其来源和遮罩,并为每种被排除的低成本方案指出具体的正确性问题。
3. 构建所选曝光控制器
对于固定 EV,直接绑定指定或经过校准的数值,不分配测光、归约、目标发布或适应状态。
对于自动曝光,将 targetEV、currentEV、有效性和帧索引保存在 GPU 状态中。即使测光运行频率较低,也要在每个渲染帧中朝最近一次有效目标推进适应过程。CPU 回读仅用于诊断。
仅对自动曝光使用以下生成器计划:
adapt currentEV from the last completed target
-> render and present with currentEV
-> reduce the new meter source
-> publish targetEV for a later frame
将源纹理绑定为真实的节点依赖,并公开源帧和状态帧。在首次归约之前初始化或清除源数据。有关归约状态、EV 适应、无效聚合以及 r185 计算语义,请阅读 GPU 曝光状态。
**完成标准:**固定 EV 不执行任何测光/适应工作;或者自动曝光的帧跟踪能够证明每个目标由哪个来源生成,适应状态始终驻留在 GPU 上,并且无效聚合会保留先前的有效目标,不使用 CPU 替代方案。
4. 在呈现前处理不连续变化
为画面切换指定 hold、reseed 或固定 EV 策略。将辐射基、工作原色、量值、非线性归一化或曝光键的变化视为新的曝光周期。对于纯正比例缩放变化 L_new = k * L_old,且其他语义完全相同的情况,将固定 EV 或两个自动曝光状态都调整 -log2(k),以保持显示乘积不变:
currentEV_new = currentEV_old - log2(k)
targetEV_new = targetEV_old - log2(k)
同时转换依赖归一化的 EV 边界,否则应说明钳制会破坏保持效果。这不能作为处理正常光照变化的捷径。在被取代的周期中排队的发布内容,必须在覆盖已转换状态前丢弃。
其他所有不兼容变化都会开始新的曝光周期。自动曝光会重置测光累积并重新播种适应状态;固定曝光会在呈现新信号前重新绑定其设定值。调整大小或 DPR 变化只会重建获准的、依赖分辨率的测光资源和采样坐标。设备丢失时,只会在新的资源代次下重新创建并重新播种获准的 GPU 状态。
完成条件: 每次画面切换、无效输入、基准/比例变化、调整大小和设备丢失事件,都必须映射到一种转换、保持、重建或重新播种操作,并在受影响的帧获准前完成;或者明确说明所选分支不拥有任何受影响的状态,因此无需操作。
5. 合成一条最终图像处理链
除非 LUT 声明了另一套完整契约,否则请使用以下域顺序:
scene-linear HDR
-> exposure
-> tone map
-> tone-mapped-linear LUT, when admitted
-> alpha restoration
-> output conversion
在非线性 RGB 操作前取消预乘,并在操作后重新预乘;曝光会保留 alpha。场景线性 LUT 需要声明整形函数。显示编码 LUT 拥有精确的输出原色和传递函数,因此应放在 renderOutput() 之后。
显式使用 renderOutput() 时,将
RenderPipeline.outputColorTransform = false。更改输出节点或输出所有权后,将
renderPipeline.needsUpdate = true。仅在加载、创作或放置 cube 时,才阅读色调映射与 LUT。
采用色调映射线性 cube 时,请阅读恒等 3D-LUT 示例,了解体素顺序和 Data3DTexture 配置。提供设备边长限制和字节预算;该辅助程序会在分配前检查两者。其 RGBA8 恒等 LUT 具有声明的量化容差。这是用于验证正确性的测试样例,不是外观或性能方面的捷径。
完成条件: 图形中包含一次曝光乘法、一次色调映射、一次工作空间到输出空间的转换,并且仅在获准时,包含一次位于其声明域中的 LUT 放置操作。
6. 验证所选分支
采集确定性测试样例:
- 对于固定曝光,使用校准卡证明设定的 EV 和乘数,并确保测光源读取次数为零且不存在适应状态;
- 对于自动曝光,使用中性灰卡验证预期目标 EV,并使用明亮光源进入和离开画面的场景验证目标/当前 EV 轨迹单调变化;
- 对于采样式自动测光,验证其遮罩、小型发光体和更新节奏场景;
- 对于直方图,验证其下溢、上溢和已接受的百分位区间;
- 获准使用 LUT 时,使用恒等 LUT,以及处于其声明域中的渐变色条和高饱和色块;
- 通过输出隔离,确认恰好进行一次色调映射和一次输出转换。
在目标设备上预热后,以成对的图形增量衡量每个获准的测光或 LUT。只有在证明初始化后支持时间戳查询时,才能获取 GPU 时间;否则应报告该计时不可用。
完成条件: 所有适用的测试样例均通过,已检查最终图像,并且每个失败的测试样例都能指出是测光、适应、LUT 域、alpha 还是输出所有权导致的问题。
路由
共享 MRT、时间历史、自适应 DPR 和瞬态生命周期请使用 $threejs-image-pipeline;眩光源所有权请使用 $threejs-bloom;固定视角图像证据请使用 $threejs-visual-validation。