一直在调试一次实时飞行跟踪器,使用3D地球绘制实时飞机位置。想与大家分享一下绘制方面的知识,因为我花了不少时间学的,希望可以节省一下别人的时间苦劳。

主要挑战性在于在球面上绘制成千上万个单个方位偏转的精灵,没有影响帧率。最后使用实例化渲染, 每架飞机被视为单个的画幅四边形,实际形状(喷气式飞机,货机,螺旋桨飞机,直升机,军用机)使用Signed Distance Fields在片元着色器中绘制,完全没有使用纹理,只有数学运算。每种类型是通过叠加SDF基本形状组合而成,并通过实例化浮点数选择绘制哪种形状。 优点是它们在任何缩放程度下都可以完美缩放,还没有使用纹理。

对于平面贴图,每个实例都包含12个浮点数---世界位置,海拔高度,方向,表面法向量,切线向量。 使用这些的顶点着色器将球面上的四边形定向为飞机的方向方向。 我也做了一些快速点积的检查,从而可以跳过任何位于地球另一侧的物体,这将画面数量大约减少了一半。

最困难的部分是使飞机飞行得比较流畅。飞行数据每2分钟更新一次,所以在更新之间,我在老地和新地之间进行线性插值。一旦插值到达截止点,我就使用飞机速度和方向进行死理算法,避免飞机卡在原地。它不是完美的,但看起来足够真实了。

整个项目是使用Rust编译为WASM的代码,使用了原始WebGL2绑定(glow crate)。压缩体积约为4MB,可在双端机部和移动设备上获得60fps绘制3000+飞机的单个绘制调用。

总之,非常感谢。很高兴可以对任何感兴趣的人进行深入的讨论。SDF(Signed Distance Fields)方法在这种地方的应用不够普遍,我觉得它是一个非常有趣的方法。