北斗网格性能优化(二):GPU Instancing 与 DrawCommand

GPU Instancing 让一批形状相同的物体共享一份几何,各自只提供变换、颜色这些实例属性,一次提交画完整批。 它减少的是 CPU 反复组织和提交绘制的开销,不减少 GPU 要处理的实例数量。

DrawCommand 是 Cesium 对一次绘制任务的描述,把几何缓冲、Shader、渲染状态和绘制数量组织在一起。给顶点属性配上 instanceDivisor、给命令填上 instanceCount,Instancing 就接进了 Cesium 的渲染流程;不带这些配置时,它描述的也是一次普通绘制。

这套北斗网格的做法是:一份中心在原点的单位立方体,每个格子存一份 64 字节矩阵和 16 字节颜色,按 Tile 分批,每个 Tile 最多两条 DrawCommand —— 一条画面,一条画棱。两条命令共用同一批实例缓冲,只有索引和着色器不同,所以只显示线框时不必重传任何实例数据。

GPU 仍要逐实例处理顶点。所以后面还需要 LOD、视锥剔除和活动预算,一起控制真正参与绘制的格子数量。

阅读更多

北斗网格性能优化(五):解决大坐标精度问题——RTE 与局部坐标系

RTE(Relative-To-Eye)是一种相对相机计算坐标的技术:先从物体位置里减去相机位置,再把这个较小的差值交给 GPU。 它解决的是大世界坐标进入 Float32 之后,小尺度细节丢失的问题。

局部坐标系则给一小块空间挑一个附近的参考原点。 在地球场景里,项目让同一个 Tile 内的网格共用一套 ENU(东、北、上)坐标系,每个实例只保存相对 Tile 参考中心的局部位置。

这套北斗网格的坐标链路可以概括为:CPU 用双精度把 ECEF 世界坐标转成 Tile 局部坐标,并算好参考中心减相机的位置;GPU 再把局部偏移旋转回世界方向,得到相对相机的坐标,最后只做视图旋转和投影。

它不是让 Float32 变成 Double,也不解决所有闪烁。它做的是重新安排减法顺序 —— 让最容易损失精度的「大数减大数」先在 CPU 的双精度里完成。

阅读更多