月食绿松石带

实测大气数据驱动,逐条光线追踪,月亮的颜色全是算出来的。

月全食的时候,月亮边缘藏着一道青色的窄边。

科普里最常见的解释是:绿松石带来自臭氧的 Chappuis 吸收——臭氧吃掉阳光里的橙红色,剩下蓝绿光照到月亮边缘,染出一层青色。方向对,但两件事对不上。第一,臭氧对红橙光的吸收效率是蓝紫光的将近 100 倍,按这个比例,透射光的饱和度应该极高,落到月面上会是一条浓得发蓝绿荧光的宽带。实际的绿松石带淡到裸眼几乎注意不到,照片不拉 HDR 根本翻不出来。第二,经臭氧层折射的太阳光,角径应该和太阳本身是一个量级,也就是 32 角分左右,文献里记载的带宽却只有两角分。这两个对不上的地方,逼着我们放下相机打开代码——用实测的大气剖面数据,对穿过地球边缘的几百万条阳光逐条做折射追踪,把这条带从物理原理里硬算出来。中间翻过好几次车,每翻一次都补上一块之前缺着的物理环节。算完了,模型还附带一个照片做不到的能力:在模拟里关掉臭氧,看那条带还在不在。

−15 档本影最深处相对于未食满月的亮度(photopic 口径,含背景气溶胶的默认物理口径)
R/B 0.81带最蓝处的红蓝比(raw sRGB 口径,41′ 处):一层淡青,离饱和蓝还远
32′ 对 4′太阳角径对青带角宽:32 角分的太阳圆盘,把预想中浓青色的条带糊成了一道只有 4 角分宽的浅青细边
光线追踪渲染的月全食月盘:左侧深入本影呈暗铜红,中偏左有一道冷青灰色的绿松石带,右缘接近正常月光的白
光线追踪渲染的月食月盘(月心与本影中心相距 40′)。左半边深入本影,呈现铜红色;右缘处于半影之中,接近正常的月光;中间偏左那一抹冷青灰色就是绿松石带。画面里每一个像素的颜色都来自光线追踪计算,没有经过任何后期调色。

三件反直觉的事,读完这一页就明白了。

臭氧造就了绿松石带,但它只讲完了故事的一半。

为什么它是一条窄带,本影内沿没有整圈变青?

臭氧的 Chappuis 吸收带会吃掉 500 到 650 纳米的橙红色波段,剩下蓝绿光透过去——这个解释本身成立。但它漏了一个数字矛盾。如果单纯是臭氧在起作用,经平流层折射的阳光角径应该和太阳差不多,在 32 角分上下。文献里记载的绿松石带宽度却只有两角分,差了十几倍。颜色沿月盘的变化其实是横跨十几角分的平滑渐变,没有任何突变——如果只盯着颜色看,本影边缘应该是一整片淡青才对。带子看起来窄成一道细线,根子在它刚好踩在亮度曲线上最暗的那一段,被旁边的亮区挤住了。下面亮度悬崖那一节会把整个机制摊开。

全食最深的时刻,青带为什么消失了?

本影深处对应的阳光,擦过的是地球大气的低层。低层大气里,瑞利散射的强度和波长的四次方成反比——蓝光被散射得干干净净,最后只剩红光能穿透,月面被染成暗铜红色。青色冒出来的位置要比这里高:当阳光擦过地球的高度升到平流层,瑞利散射退居次要,臭氧的 Chappuis 吸收开始接管局面,把橙红吸收掉,蓝绿光透过去。这一段高度对应到月亮上,恰好落在本影边缘附近,不是本影中心。所以全食最深的时刻,整张月盘都泡在瑞利的红区里,臭氧的青根本没照过来。青带要等月亮开始往外移、本影边缘靠近的时候才会现身。

网上的月食照片里,蓝色为什么浓得多?

卫星实测的红蓝比落在 0.8 到 1.0 之间,画面上是极淡的偏青色,裸眼几乎察觉不到。网上那些半个圆盘泡在饱和蓝里的照片,靠的是 HDR 堆栈把多张不同曝光原片合成一张,再进 HSL 面板把青色通道的饱和度使劲往上拉。物理这一侧的账也很清楚:臭氧对红橙光的吸收是蓝紫光的将近 100 倍,如果太阳是一个点,算出来的青带确实又浓又锐,红蓝比可以低到 0.41。但太阳是一个 32 角分的圆盘,这个尺寸把浓青糊开了——算到底红蓝比退到 0.71,和真实观测对上了。网上那种效果,拍照靠后期,物理上只在点源假想里成立。下一节展开对账。

第一次翻车:拿网红照片当标准答案

那种半盘泡在饱和蓝里的效果,我们怎么算都出不来。

项目做到一半的时候,我们盯上了一张传得很广的月食蓝带照片:半个圆盘浸在一层浓郁的饱和蓝里。拿这个效果当参照,模型反复跑,怎么都只出淡淡一层青。那段时间真的怀疑是自己漏了什么物理机制。后来回头查了那张照片——作者是一位风光后期教程博主,帖子标题直接就在讲修图流程:HDR 堆栈合成多张原片,再进 HSL 把青色通道的饱和度一路拖到接近霓虹。同一位作者自己也说过,这种蓝裸眼几乎注意不到,非得靠 HDR 才能把那些淹没在暗部里的色彩翻出来。

物理这边的线索指向了另一个方向。GOES-16 气象卫星在月食期间的实测数据,给出的红蓝比在 0.8 到 1.0 这个范围。专业天文摄影未经后期处理的原图里,蓝带也只是贴着月亮边缘的一丝浅青细线。我们没有为了让计算结果靠向那张网红图去改任何物理参数,后来这些实测数据一项一项把事情对上了。

有意思的是,我们自己的模型里确实跑出过浓青色。把太阳当成点光源来算的时候——这当然是简化——模型给出的青带又浓又锐,最蓝处的红蓝比低到 0.41。这种简化在文献里其实有它的传统。处理太阳圆盘这类问题,学术界一种通行的做法是:先用点源近似推导整套公式,最后再加一道几何补偿。 Mallama 2022 关于月食建模的综述,用的就是"for a point source of light"的假设,在点源框架下推完折射公式之后补一道模糊处理作为修正。我跟着这篇论文的方法适配到我们的场景里,结果怎么都不对——本影亮度算出来和观测差了好几个量级。

到最后我们放弃了近似路线,回到更笨的办法:不做公式推导,不做几何补偿,而是对太阳圆盘上的所有点做多重积分。取很多很多点,模拟发出来的很多光线,对每条光线单独追踪折射、散射和吸收。多重积分一跑完,浓青立刻被稀释了——红蓝比从 0.41 退到 0.71,青色变淡,带变宽变软,位置也往内移了。这才是真实月食看到的样子。网红图里那种浓青,在一个点源世界里确实存在,只不过我们的太阳是一个 32 角分的圆盘,它不认这个账。

人眼本身还有一层故事。这条带的绝对色品其实是偏蓝的:不管你怎么调模型——去掉瑞利散射、加上气溶胶、模拟多次散射的回填效果——它都变不成青绿色。人会感觉它偏青偏绿,是因为它旁边铺着一大片暖红的血月。人的视觉系统对暖色调的视野做了色彩适应之后,这条颜色相对偏冷的带就呈现出了青绿色。turquoise 是一个相对色,我们没有为了让它绝对意义上变成青绿往模型里添加任何额外机制。

两个月盘对比:左为点源近似,青带浓而锐利;右为太阳圆盘真实物理,青带浅淡、边缘柔和
左侧:把太阳当作点源的计算结果,最蓝处红蓝比 0.41(位于 52.6′),浓青、边缘清晰分明。右侧:按 32′ 太阳圆盘做光线追踪的结果,红蓝比 0.71(位于 40.4′),浅青、边缘柔和。口径为线性 sRGB 红蓝比,分子大气条件(未加气溶胶);两图为增强展示版。

核心实验 · 每一步只叠加一个物理机制

分六步,把绿松石带一层一层算给你看。

起点是一块什么都没有的灰色圆盘。每往前推一步,往模型里加一个真实的物理机制,看月亮的盘面怎么从一个假满月一步一步变成月食里的样子。这一串逐步开关还自带一个照片做不到的功能:反事实归因。第四步把臭氧加进去,青带应声出现;退回第三步,等于把臭氧关掉,带就没了——只有通过计算才能做到这种因果确认。六张图统一使用同一套对比度增强参数,方便看清每一步之间的差异;按忠实曝光渲染的版本放在亮度悬崖那一节。

第 1 步:一块灰圆盘

↓ 点击任意一步,右侧画面同步切换

第 1 步:灰白满月圆盘,带月海纹理

同一套物理换一个视角看

站在月亮上看地球,这就是一场日全食。

月全食的时候从月亮表面往地球的方向看,地球的黑夜面完全遮住了太阳,只剩一圈被大气折射点亮的光环围在地球边缘。这两个观察角度是同一套辐射传输物理的两种表达:月亮表面上任意一点的颜色,等于你站在那个位置抬头看到的地球大气环上对应位置的颜色。光环从内圈红到外圈青再到白,正好是把日落的颜色剖面展开成了一整圈。月亮边缘的那条青带,对应的是大气环上朝向太阳那一侧、平流层高度的一小段青色。模拟链路跑通之后,换一个积分的维度,月球的视角就自然出来了——我们没有专门为这个视角写任何新代码,只是把同一个物理从地球这边翻到了月亮那边。

月亮穿过本影的四联画

视频记录月亮中心到本影中心的距离从 10′ 推到 60′。第一格(左上)展示月亮盘面,从最暗处的古铜色血月开始,走过明暗交界线,再进入半影的亮白区域。第二格(右上)展示月亮上回望地球的视角:地球黑夜面把太阳遮住,大气环上被光照亮的那一段随着相对位置的变化自转,月亮离开本影的那一刻恰好对应太阳从地球边缘后面探出头来的钻石环。第三格(左下)给大气环一个长焦特写,这圈环的真实厚度只有地球角直径的 1.3% 左右,画面做了比例放大。第四格(右下)解释绿松石带的光谱成因:瑞利散射、臭氧 Chappuis 吸收和透射窗口如何随着阳光擦过地球的高度移动。视频没有声音。

月食轨迹合成艺术图:月亮沿斜线划过画面,从满月白经青灰、深铜红再回到满月白
把整场月食压缩到一张图里:月亮沿着轨道穿过地球本影,进场和出场的时候各经过一次绿松石带。这是一张艺术合成图,构图和影调做了取舍,亮度关系也经过了压缩处理,不要把它当作光度测量数据来用。

决定性的一次翻车

青带的窄,根源是亮度。

有很长一段时间,我们在颜色这个维度上纠结带到底有多宽。文献里说这条带只占月盘直径的几个百分点,我们跑出来的渲染结果里它铺开了将近三分之一个月盘。于是反复复查臭氧参数、查几何、查色彩科学。后来才意识到翻车的环节是曝光。早期的渲染为了把暗区的内容呈现出来,人为提亮了整个本影。蓝区本来已经很暗,亮度一拉高,它就摊开变成一条宽阔的渐变带。这不是物理模型出了错,是显示策略造出来的假象。

真实的机制是一道亮度悬崖。颜色(红蓝比)沿月盘其实是平滑渐变,跨了十几角分,没有突变。但最蓝的那一段恰好也是整条曲线上最暗的一段——亮度只有月盘最亮处的百分之几。人眼看不见它。它旁边紧贴着的是出本影的正常月光区,亮了整整 250 倍,白色的强烈月光又把青蓝色完全淹没了。按模型卡上的口径,photopic 面亮度从满月的 10% 爬到 90% 只用了 20.4′ 的角距离(从 46.7′ 到 67.1′),在本影边缘最陡的那一段,亮度变化达到每角分 1.8 档。肉眼能看见的青带,是同时满足颜色够蓝和亮度够高这两个条件的那一小片交集,被这道悬崖挤成了一条细缝。颜色沿月盘是一个平滑渐变、没有跳变,你实际看到的却是一道边界分明的细带——这两件事并不矛盾。绿松石带不能太暗,不能太亮,还要够蓝,三个条件在视觉上把它压成了一道窄边。

这次翻车留下的认知有两条。第一,曝光和 tone map 策略有能力彻底误导你对物理机制的判断:遇到一个看着不对劲的渲染结果,先拆开来看——到底是物理本身算错了,还是显示方式在骗你。第二,全食最深的时候为什么没有青带,答案也在这条亮度曲线上:本影深处比满月亮度低了十几档,阳光擦过地球的高度又太低,轮不到臭氧发挥作用。青色只活在亮度悬崖边缘那道窄缝里,全食最深的时候月亮还在本影正中心,离这道悬崖远得很。

两种曝光策略的对比:为暗部曝光时蓝带显得占据大半月盘,忠实亮度下蓝带收窄成细带;下方曲线显示红蓝比与亮度沿月盘的变化
同一套物理模型,两种曝光策略的结果。左边:为暗部做了曝光补偿,蓝色区域被提亮之后显得很宽。右边:按月盘最亮的部分做曝光的忠实版本,蓝带因为本身暗而被周围的亮区压住,收窄成一条细带,与文献记载和真实照片一致。下方曲线:红蓝比(紫色)平滑渐变,亮度(橙色)在带的位置恰好处于低谷。点击图片可在新标签页查看完整大图。
月食光度剖面:从本影中心约负15.5档平缓爬升,41角分处陡升,73角分到达满月0档
光线追踪算出来的亮度剖面分布(以未食满月为 0 档参考)。本影内部是一段折射光形成的平缓斜坡,到了 41′ 附近的本影边界处迅速爬升,进入半影后直射光逐渐补回来,平滑过渡到 73′ 处的满月亮度。图中的曲线由 1600 万条光线的分层采样跑出,中心点读到 −15.5 档;模型卡上的基准跑(400 万条光线)在中心给出 −15.1 档,两次数值之间的差异来自中心位置附近少数几环的统计涨落。点击图片可在新标签页查看完整大图。

说清楚哪些对上了,哪些没对上

对上的部分和没对上的部分,全都摊在台面上。

对上的部分有三处。第一处,折射几何的计算结果,在带所在的中高擦边高度段,与 Mallama 2021 的表列数据偏差在 2% 以内。第二处,带最蓝处的红蓝比和卫星实测数据落在同一个量级——都是 0.8 到 1.0 的淡青色区间(两边的测量口径有差异,严格的逐项对账记录在第二项开放项里)。第三处,带紧贴本影边界、呈浅青色、窄,与专业天文摄影未处理的原始图片所见一致。

没对上的第一项出在暗端。我们模型的本影中心大约是 −15 档,这个结果的口径建立在最晴朗的夜空条件之上,额外加上了气候学统计背景气溶胶(如果只算纯分子大气而不加任何气溶胶,理论上限是 −13.5 档)。Mallama 用的 clear-sky 经验消光模型算出来的本影中心在 −18.7 档(全盘积分)到 −20.5 档(盘面分辨 V 波段)。两个模型都叫 clear-sky,结果却差了好几档。根源之一在于 clear-sky 的具体定义不一样:擦边光在地球大气里穿过的倾斜路径相当于 40 到 60 倍大气质量,背景气溶胶的取值哪怕只有微小的差别,都会被这个倍数放得很大。这个分歧的判断目前还是开放项。

第二项没对上的是卫星窄带测量口径。Shu 2024 用高分四号卫星在本影边界处拍到了 R/B 小于 1 的一条窄带(ribbon),径向全宽在 120 到 190 公里之间。我们把模型换到同一口径下算了一遍,复现不出这条窄带:单层物理确实能产生一个窄带凹陷,但它被 32′ 太阳圆盘的卷积效应和从本影深处流进来的红光抹掉了。我们做过敏感性分析,先后排除了气溶胶参数和深层红光这两个嫌疑来源。目前最强的候选解释是在切点高度 8 到 19 公里那一段,红色的肩部光缺少消光——可能的来源是对流层顶的薄卷云,模型里没有建立这一层,而月食当晚实际云况已无法追溯。此外还有三处口径差异:卫星光谱响应的差异、月面反照率 ±15% 的浮动、以及二维边界测量与一维径向平均之间的不对等。这三项中的每一项,单拿出来都足以改变判据的方向。

第三项是模型主动申明的负边界:它没有办法预测下一次月食看起来是亮还是暗。那取决于月食发生时平流层里的气溶胶状况——一次大型火山喷发之后的月全食,亮度能比风平浪静的年份暗好几档。模型提供的是物理机制和它在最晴朗条件下的亮度下限,不是一个预报工具。

给还想往下挖的人

这些画面是怎么算出来的?

这些画面不依赖任何贴图调色,也没有塞进唯象的拟合参数。折射靠每一条光线的逐条数值积分来算,消光沿弯曲的路径用实测截面数据累加得出,光线的聚焦和散焦则从几百万条光线打在月面上的落点密度里自然涌现。原理页里展开讲了六个关键技术决策、与三组文献的对账结果、模型卡上那些关键数字,以及每张图的可复现命令。

给想自己动手的人

整个项目开源,在你自己的电脑上就能复现。

代码、实测数据的下载脚本和全部参数,都在仓库里放着。你可以重新渲染这一页上所有的图和视频,也可以把每一个物理开关拨过来拨过去,做你自己的反事实实验——比如把臭氧的柱量换成另一个季节的值,看带的颜色会怎么变。

打开 GitHub 仓库