SuperAPI AI 工具集

atmosphere-shader

设计与创作

查看项目

更新于 10-16 05:30

技能介绍

Atmosphere Shader 是一个用于生成基于物理的大气散射着色器的技能,目标是在 GLSL 片元着色器中通过光线步进(raymarching)合成 Rayleigh、Mie 与 Ozone 模型,渲染物理准确的天空、日落与行星大气。

用途

该技能面向需要物理准确大气渲染的图形开发场景,提供从简单天空背景到生产级行星大气管线的多种实现路径。它同时是一份针对 Claude 常见错误的纠正指南,帮助避免在生成大气散射着色器时出现可复现的失败模式。

四种模式

技能提供四种递进模式:

  • sky-dome:单通道片元着色器,平面天空背景,作为入门模式。包含 Rayleigh + Mie + Ozone 散射与嵌套光照步进,适合作为全屏背景。
  • atmosphere-post:深度感知的后处理效果,带大气雾。从深度缓冲重建世界空间位置,在场景体积中步进,施加随距离增厚的大气雾。
  • planet:围绕网格的球形大气壳层,使用光线-球体相交定义大气进入/退出,采用对数深度缓冲以支持行星尺度。
  • lut:基于 Hillaire (2020) 的透射率 + 天空视图 + 空中透视 LUT 与 FBO 管线,属于生产级方案。

主要能力与关键实现要点

技能重点记录了 Claude 在此类任务中常见的错误,并给出正确实现:

  1. 散射系数:Claude 会编造看似合理但物理错误的 beta 值。技能给出地球的精确常量,包括 Rayleigh 散射、Mie 散射与消光、Ozone 吸收,以及 Rayleigh/Mie 标高、Mie 各向异性参数与大气高度。
  2. 嵌套光照步进:Claude 常只实现视线光线循环,产生蓝色渐变但没有日落。关键缺失是在主光线每个采样点向太阳做二次步进以累积 sunOD。
  3. 对数深度重建:行星尺度下线性深度缓冲会导致 z-fighting,需启用 logarithmicDepthBuffer 并在着色器中解码。
  4. LUT 管线知识:无指导时 Claude 会在屏幕分辨率下尝试完整嵌套光线步进(24 主步 × 8 光照步 = 每像素 192 次纹理采样)。LUT 方法将透射率预计算到 250x64 纹理,下游 LUT 用单次 texture2D 调用采样。
  5. 相位函数归一化:Mie 相位函数(Henyey-Greenstein)分母中的 (2.0 + g*g) 项常被 Claude 遗漏。
  6. 臭氧层:Claude 的大气模型常完全跳过臭氧,丢失紫色暮光偏移与正确的天蓝色。臭氧峰值约在 25 km 高度、宽度约 15 km,只吸收不散射。

使用方式

技能以模式为单位组织实现。sky-dome 模式架构为:每像素从相机位置投射光线,步进大气体积(24 主步),每步累积 Rayleigh、Mie、Ozone 光学深度,每步向太阳做光照步进(8 步)计算太阳透射率,组合散射项,使用 smoothstep 做地平线遮罩,最后 ACESFilm 色调映射。

atmosphere-post 模式通过 getWorldPosition 从深度缓冲重建世界空间位置,根据场景深度驱动步长(背景像素使用大气高度 × 8),并对地面光线做提前终止。R3F 集成需要 depthBuffer、projectionMatrixInverse、viewMatrixInverse 三个 uniform,并在 Canvas gl 属性启用 logarithmicDepthBuffer。

planet 模式使用 raySphereIntersect 做光线-球体相交,处理光线未命中大气、命中行星表面、场景物体遮挡行星三种情况,并包含日食处理(比较太阳/月亮的角半径与分离度)。

lut 模式管线为:透射率 LUT(250x64)→ 天空视图 LUT(256x128)与空中透视 LUT(屏幕分辨率)→ 合成通道。透射率 LUT 的 x 轴为 mu = cos(zenith)(-1 朝地面到 +1 朝太空),y 轴为从 planetRadius 到 atmosphereRadius 的高度,输出 exp(-tau)。

适用场景

适用于需要物理准确天空、日落、行星大气渲染的图形开发,包括全屏天空背景、场景后处理大气雾、行星尺度大气壳层以及生产级 LUT 优化管线。

限制与范围边界

该技能覆盖体积大气光传输,不覆盖:体积云(独立渲染关注点)、域扭曲/程序化效果(属于 rocaille-shader)、粒子系统(属于 threejs-particle-canvas)、TSL/WebGPU API 参考(属于 webgpu-threejs-tsl)、基于 CSS 的天空渐变或表面效果(属于 grainient)。

参考文档

  • references/scattering-coefficients.md — 地球、火星与自定义行星参数表
  • references/hillaire-lut-pipeline.md — 来自 Hillaire (2020) 的 LUT 架构

归属

大气散射模型 — Nishita 等,"Display of the Earth Taking into Account Atmospheric Scattering"(SIGGRAPH 1993);LUT 方法 — Sebastian Hillaire,"A Scalable and Production Ready Sky and Atmosphere Rendering Technique"(EGSR 2020);实现参考 — Maxime Heckel,"On Rendering the Sky, Sunsets, and Planets"(2026);生产参考 — Shota Matsuda 的 three-geospatial。