mcpField
T
threejs-sky-atmosphere-and-haze

threejs-sky-atmosphere-and-haze

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

关于 threejs-sky-atmosphere-and-haze

threejs-sky-atmosphere-and-haze 是一项用于在 Three.js 中实现天空传输、大气雾霾和大气光照的技能。它说明手绘与 LUT 方案、产品依赖、合成规则,以及不同渲染分支的验证方法。

主要功能

  1. 01手绘天空与雾霾实现指导
  2. 02紧凑型及高阶 LUT 方案
  3. 03大气产品依赖管理
  4. 04深度感知的空中透视合成
  5. 05大气光照交接指导
  6. 06数值与视觉验证

适用场景

  1. 01为场景选择大气模型
  2. 02为渲染场景添加深度感知雾霾
  3. 03随相机或场景输入变化管理 LUT 更新
  4. 04按数值和视觉标准检查大气渲染

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/linegel/threejs-complete-set-of-skill --skill threejs-sky-atmosphere-and-haze

安装后在 Claude Code 中输入/threejs-sky-atmosphere-and-haze确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
agents/
openai.yaml
references/
atmosphere-transport.md
body-depth-and-composition.md

详细介绍

天空、大气与雾霾

所有分支都围绕一种大气模型、一条场景线性 HDR 路径和一个最终输出负责人构建。

流程

1. 选择传输方式

选择满足所需可观测结果且成本最低的分支:

需求分支有效声明
区域性创作天空、距离雾霾或高度雾霾SkyMesh 加 TSL 雾效/雾霾在有界局部坐标系中呈现创作效果
实时行星天空和大气透视紧凑型 Hillaire 风格 LUT在测得的误差范围内近似高阶传输
固定大气,且需要更严格的光谱/角度精度Bruneton 风格散射阶数或离线求解通过与选定参考结果对比证明精度

对会变化的摄像机和太阳使用紧凑型分支。当高阶分支的重新生成成本和高维产品适合实际工作负载时,再使用该分支。将离线积分器作为参考依据,而非用于可见像素的运行时计算。

完成标准: 实现明确指定一个分支、其支持的空间范围、其物理效果或创作效果的声明,以及用于验收的误差或视觉标准。

2. 确立统一模型

为半径、位置和积分步长声明一个长度单位;以其倒数单位存储消光/散射系数,使 beta * ds 无量纲。定义天体或局部坐标系、原点策略、高度模型、太阳方向约定、光谱/工作基底,以及太阳光源采用法向辐照度还是有限圆盘辐亮度。

初始化 WebGPURenderer,等待 renderer.init() 完成,并在分配计算/存储产品前确认使用原生 WebGPU 后端。传输数据使用 NoColorSpace,并在主机输出阶段之前保持辐亮度处于场景线性空间。

关于具有物理量纲的消光、LUT 辐射度学、映射方程、相位约定、产品依赖关系、导入的 LUT/产品兼容性,或单一单位等价性测试,请阅读 references/atmosphere-transport.md。

完成标准: 所有生产者和消费者都使用相同的坐标系、长度换算、太阳约定和辐射度学基底;对于具有物理量纲的消光,CPU 和 GPU 对同一测试样例得出的光学深度也必须一致。

3. 按依赖顺序构建产品

编写的本地分支直接从共享模型采样天空和距离/高度雾。只有在雾作为独立的深度感知后处理时,才需要宿主深度。对于紧凑 LUT 分支,不要仅仅因为选择了该分支就分配产品。根据消费者需求准入产品:

产品仅在以下情况下分配
透射率已准入的天空、大气透视或光照路径直接或通过依赖产品需要它
多重散射已准入的天空、大气透视或光照闭合包含高阶响应
辐照度已准入的漫射光照消费者对其进行采样
天空视图已准入的可见天空消费者对其进行采样
大气透视 RGB 内散射和 RGB 光学深度已准入的深度感知合成消费者对这对负载进行采样

仅含天空或仅含光照的分支没有大气透视分配或视图依赖项。

为每个产品指定独立的依赖键和上次更新原因。大气剖面和天体变化会使基础产品失效。相机相对于天体的姿态、投影、视口和深度映射变化会使大气透视产品失效。相机偏航、投影抖动和纯浮动原点平移不会使未变化的天体坐标系 LUT 失效。

使用 StorageTexture 和 textureStore() 写入 2D 产品;使用 Storage3DTexture 和 storageTexture3D() 写入 3D 产品。明确设置格式、过滤器、环绕方式和 mip 所有权。将 renderer.computeAsync() 视为提交操作,而非 GPU 完成操作;通过实际的完成机制同步读取回传、复用和回收。

完成条件: 每个被采样的产品都列出其所有物理和视图依赖项;没有消费者会观察到较新的依赖项搭配较旧的依赖产品;已被取代的工作无法发布到当前模型纪元之上;每个未准入的产品都没有任何分配或依赖状态;基础 LUT 在仅相机变化时保持有效。

4. 合成所选分支

对于场景内编写的分支,将 SkyMesh 和 TSL 雾/霾附加到宿主场景,并使其输出保持场景线性。

对于独立的深度感知雾/霾或 LUT 大气透视分支,复用宿主场景颜色和深度。将当前透视、反向、对数或正交深度约定重建为度量线段,然后与大气求交,并在首次进入不透明天体时停止。不要在不透明区间之后继续进行远侧壳层积分。通过显式覆盖信息或声明的清空深度编码对天空进行分类。

对于该分支中的可见表面,严格应用:

C_out = C_scene * T_segment + S_segment

对于天空像素,采样天空辐射以及经过校准的太阳/月球圆盘。将直接光照、天空漫射光照、云影、不透明可见性和相机线段传输作为独立因子处理。由 renderOutput() 或 RenderPipeline.outputColorTransform 负责呈现。

对于行星天体、外部相机、椭球体、非透视深度或壳层/后处理交接,请阅读 references/body-depth-and-composition.md。

完成条件: 每个已准入的场景内分支都恰好到达一次宿主输出路径;每个启用的深度感知分支都能在声明的容差范围内重建已知位置,保持天空/表面覆盖稳定,并在零大气控制下返回 C_scene;色调映射/输出转换只运行一次。

5. 暴露经过准入的光照交接信息

当其他系统使用大气推导的光照时,只暴露其所需的量:

  • 采样时间、模型修订版本、物理坐标系/原点、支持范围、滤波方式、采样时长和误差;
  • 采样点到太阳的单位方向和太阳圆盘角半径;
  • 经校准的太阳量、单位和基准;
  • 已经经过大气衰减的直射阳光,或未衰减的光源及大气透射率;
  • 定向天空辐射亮度、依赖法线的天空辐照度,以及各自是否包含直射太阳圆盘;
  • 摄像机线段的 RGB 透射率和 RGB 空气散射。

云层增加仅由云层产生的光学深度;几何体增加可见性;水增加自身路径消光。使用方选择一种大气直射光形式,并对每个因子只应用一次。

**完成标准:**仅用于视觉效果的分支不包含未使用的光照接口;每个准入的光照使用方都能识别量、单位、坐标系、采样时长和已包含的衰减,并且其因子追踪证明大气、云层、几何体、水和空中传输各自最多只出现一次。

6. 验证所选分支

验证分支实际使用的机制:

  • LUT 正向/逆向映射在纹素中心、边界、地平线分界和方位角接缝处的表现;
  • 相位归一化和前向瓣符号;
  • 光学深度、辐射亮度和能量与更高精度参考值的收敛情况;
  • 天体交点和所有已启用的深度编码;
  • 参数、摄像机、抖动、视口和原点变化时的产品失效情况;
  • 固定视角下线性 HDR 天空、地平线、夜景、地表雾霾和外部摄像机诊断;
  • 创建、调整大小/切换层级、完成和释放时的所有权。

**完成标准:**每个已启用分支都通过数值和视觉门槛;每项诊断都标明所显示产品的修订版本;重复调整大小/切换层级后,每个保留的产品都只剩一个有效代次。

失败特征

症状检查项
光晕出现在太阳的反方向相位方向符号
雾霾随世界缩放而变化长度/系数换算
地平线接缝或天体边缘跳变LUT 接缝、天体区间或所有权转换
地形被重复变暗直射光或空中传输因子的所有权
摄像机抖动导致基础 LUT 重新生成依赖键范围过宽
离轴雾霾距离过短将归一化深度误认为射线距离

路由边界

此技能负责分子/气溶胶天空传输、大气推导的太阳/天空光照,以及摄像机线段空中透视。天气塑形的云密度和仅由云层产生的阴影,请使用 $threejs-volumetric-clouds;共享场景信号和最终输出所有权,请使用 $threejs-image-pipeline;测光/色调映射,请使用 $threejs-exposure-color-grading;地形/天体细节,请使用 $threejs-procedural-planets。

评论

支持 Markdown