mcpField
T
threejs-exposure-color-grading

threejs-exposure-color-grading

github.com/linegel开发11136 次安装5 周前更新
代码仓库

关于 threejs-exposure-color-grading

用于设计和验证 Three.js 曝光与调色流程的技能,强调明确指定测光、适应、色调映射和输出转换的所有者,并针对不同方案进行验证。

主要功能

  1. 01场景线性颜色流程
  2. 02固定与自动曝光
  3. 03GPU 驻留的适应状态
  4. 04色调映射与 LUT 放置
  5. 05重置与不连续处理
  6. 06分支专用验证用例

适用场景

  1. 01为校准视图设置曝光
  2. 02构建自动曝光测光
  3. 03在 Three.js 渲染链中添加 LUT
  4. 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 外,安装时一起下载的参考资料和脚本。

LICENSE
agents/
openai.yaml
examples/
identity-3d-lut.mjs
references/
scene-referred-color-pipeline.md

详细介绍

曝光与色彩分级

在最终图像链路之前,始终将拍摄信号保持在线性场景空间中。每个曝光组、色调映射和输出转换都由一个明确指定的负责人控制。

1. 锁定色彩约定

明确指定线性场景空间的工作原色、辐射亮度标度、Alpha 约定,以及所有进入拍摄信号的生成器。在测量辐射亮度之前,先通过材质/光照模型将辐照度转换为辐射亮度。对灯光、环境、氛围、发光材质、泛光源和光学效果应用统一的物理或感知辐射亮度标度。

将目标或视图划分为曝光控制组。只有当组内的辐射亮度基准、曝光策略和重置历史都相同时,才可共享 GPU 状态;自动曝光组还必须使用相同的测光遮罩、关键值和采样计划,并明确指定一个来源或合并聚合方式。设置相同的独立图像不可互换作为测光输入。每组必须且只能指定一个曝光负责人、一个色调映射负责人和一个输出转换负责人。

**完成标准:**每个拍摄输入都具有唯一的基准和标度;每组都明确列出成员、曝光/色调映射/输出负责人,以及状态共享策略。

2. 选择满足图像要求的最低成本测光方式

按依赖顺序选择:

  1. 对于受控或经过校准的视图,使用固定 EV;
  2. 对于常规的全局自动曝光,使用分层网格或分块采样器;
  3. 只有在每个像素或精确遮罩都必须参与时,才使用精确的全像素分层归约;
  4. 只有在其他功能会使用其层级或空间统计数据时,才使用对数亮度金字塔;
  5. 只有在百分位裁剪能够解决已证实的离群值或双峰光照问题时,才使用直方图。

默认采样解析后的泛光前 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。

评论

支持 Markdown