深色模式
空间采样:最近邻、双线性与三次
屏幕上的一个片元通常不会恰好落在数据格点上。采样(sampling)要回答:已知周围离散值,该位置画什么?它依赖场重建(reconstruction)假设,也就是如何从离散样本定义中间位置。提高画面平滑度不会创造新的观测,也不能把粗网格升级成高分辨率数据。
本课只需要加、乘和比例。更慢的逐步推导放在采样与插值,不要求先学信号处理。
用四个数建立直觉
设一个单元左下、右下、左上、右上的值依次为 0、10、20、30,单元内坐标为 (s,t),两者无量纲且范围为 0–1;s=0 在左边,t=0 在下边。双线性插值(bilinear interpolation)先沿横向,再沿纵向:
text
a = (1-s) × 0 + s × 10
b = (1-s) × 20 + s × 30
f = (1-t) × a + t × b在中心得到 15,在 (0.25,0.5) 得到 12.5。权重(weight)表示各样本占多少比例,四个权重非负且和为一,所以有效标量不会超出四个角的最小值和最大值。Bilinear 名字中的“线性”是分别对两个轴而言;一般单元内部包含 s*t 项,并不总是一张平面。
最近邻采样(nearest-neighbor sampling)只选最近节点,保留原始离散值和明显格块,适合分类编码、掩膜,以及检查原始网格。对土地类别编号做双线性插值会制造没有意义的“小数类别”。
三次不等于唯一算法
二维三次采样(bicubic sampling)通常使用 4×4 邻域,但具体重建核(reconstruction kernel,即邻点权重随距离变化的函数)不同。Catmull–Rom 一类插值可能产生超出原值范围的过冲(overshoot);B 样条(B-spline)更平滑,却一般不穿过所有原始样本。页面上只写“Cubic”不足以表达科学含义,应说明核、边界与缺测策略。
绘制等值线时,采样器与提取算法还需要一致。用双线性场算几何线,再用三次场画底色,线与同值颜色边界可能不重合。这不是浮点误差,而是两个不同重建场。
接缝是拓扑问题
全球经度周期网格在日期线两侧相邻,纬度却不能简单重复。极点附近的经线收敛,重复极点列也不代表许多独立物理位置。区域场应在边界外停止采样;随意 REPEAT 会把西边的数据贴到东边之外。缺测邻居如何处理则必须在最近邻、双线性与三次三种路径中统一。
本页实验提供最近邻与双线性两种实际采样路径,可配合时间和色带控件观察。三次采样在本章用于解释算法取舍,未作为实验开关提供。
一个场,多种颜色
在同一组合成场上切换采样、时间和颜色映射。
在浏览器本地运行 · 无需账号 · 鼠标拖动旋转,滚轮缩放
教学合成数据,不代表真实观测或天气预报。规则场用于验证,拟真形态用于观察复杂结构。 数据说明
查看运行源码
此代码直接读取实际运行的实验模块。按 kind 分支定位当前实验,也可查看数据公式和 GLSL。
读取源码…观察任务
放大标量场,观察相邻颜色过渡。假设原始四角是 0、0、0、100,中心值应是多少?若只把数据纹理的过滤方式改成 LINEAR,是否自动完成了正确的经纬度插值?
展开答案
双线性中心值是 25。硬件 LINEAR 只知道纹理坐标,仍需要正确的节点到 texel 映射、周期规则和有效性处理。它也不会理解球面距离;等角经纬网格上的双线性,定义在经纬参数空间,而非地表等距离空间。
性能优化时先建立一个 CPU 参考采样器,用中心、边界、日期线与缺测邻域作小样本对照,再验证 GPU。否则“看起来平滑”很容易掩盖半格错位。
阅读依据:Khronos WebGL 2 纹理规范、Cesium 1.145 Sampler 源码(internal)。