Skip to content

深度、透明与地球背面 ​

半透明天气层叠在地球上,不能只把 alpha 调小。alpha(α)是不透明度(opacity),通常是 0–1 的无量纲数,1 不透明,0 全透明。它同时涉及哪个片元在前、是否更新深度、颜色如何混合,以及地球是否正确遮住背面。四个问题混成一个开关,常常得到“正面看对了,旋转就穿帮”的效果。

深度为什么随距离表现不同,可以配合齐次坐标与投影阅读;浮点分辨能力与容差见精度与误差。

相机射线穿过透明壳面和不透明地球,显示深度与颜色合成顺序

测试与写入是两个决定 ​

深度测试(depth test)用已有深度判断新片元是否可见;深度写入掩码(depth mask)决定通过测试的片元是否写入深度。常见半透明表面保留深度测试,却关闭深度写入,这样前面的透明层不会把后续可见透明层完全挡住。但这不是万能设置:如果顺序或遮挡依据错误,关闭写入也会让不该出现的背面颜色参与合成。

地形与椭球也不同。用椭球交点剔除背面,能挡住理想地球后侧,却不能精确表示山峰遮挡或起伏天气面的自遮挡。若使用自定义 shader 的近似地平线判断,应把适用范围说清楚。

混合通常不交换顺序 ​

普通透明合成(alpha compositing)可写成:

text
Cout = alpha × Cfront + (1-alpha) × Cback

这里 Cfront、Cback、Cout 分别是前景、背景和结果的 RGB 颜色向量,分量通常在 0–1 内;公式对每个颜色分量各算一次。蓝色背景前放 50% 红层,再放 50% 绿层,结果与交换两层不同。颜色越叠越灰,不一定是色带有问题,也可能是多个物理层同时争夺同一个像素。预乘不透明度(premultiplied alpha,将颜色预先乘以 alpha)与普通 alpha 的混合因子还必须匹配,否则边缘会出现黑边或过亮。

Cesium 提供透明渲染处理,包括在条件允许时采用顺序无关透明(order-independent transparency,OIT)路径;它并不承诺任何自定义命令、任何材料都天然符合你的科学显示意图。多壳面可以用隔离层、焦点层或剖面提高可读性,不能只期待更复杂的混合消除信息拥挤。

贴地闪烁也不只是透明问题 ​

两张面几乎处在相同深度时会发生深度冲突(z-fighting),表现为两面互相争夺同一屏幕位置而闪烁。增加一个很小的显示偏移可能改善视觉,但该偏移不是新的真实海拔。近远裁剪范围、地球尺度精度和对数深度同样会影响表现。不要把关闭所有深度测试当作修复,否则图层会穿过地球或前景物体。

深度与透明EXPERIMENT 06 · CESIUM 1.145.0

深度与透明

改变表面的高度和透明度,观察遮挡关系。

在浏览器本地运行 · 无需账号 · 鼠标拖动旋转,滚轮缩放

底图:Natural Earth II(公共领域);其余几何和地形为教学合成。 数据说明
查看运行源码

此代码直接读取实际运行的实验模块。按 kind 分支定位当前实验,也可查看数据公式和 GLSL。

读取源码…

观察任务 ​

旋转到地平线附近,比较正面与背面的遮挡。思考:如果透明层关闭深度写入,它是否就变成“永远可见”?如果把红绿两层交换顺序,画面是否应完全不变?

展开答案

关闭写入不等于关闭测试;它仍可被已有的不透明深度挡住。普通 alpha 混合对顺序敏感,交换层通常改变颜色。OIT 能改善一些排序问题,但显示层的颜色混合仍不等于独立读出各层数据。

阅读依据:Cesium 1.145 OIT 源码、Cesium 1.145 RenderState 源码(internal)。

气象学 · 数学基础 · 地理可视化