深色模式
DrawCommand:一次绘制的完整契约
有了顶点和 shader,GPU 仍不知道该如何画。它还需要顶点格式、索引(index)、uniform、深度(depth)与混合(blending)状态,以及输出阶段。DrawCommand 把这些条件汇集起来。它是一份绘制描述,而不是一个已经完成的屏幕图像。
优先使用更高层的入口
多数几何展示可以从公开的 Primitive + Geometry + Appearance 开始。Primitive 根据场景状态准备几何与命令;Appearance 定义着色方式和相关状态。只有当目标确实需要自定义状态纹理、特殊顶点格式或多阶段计算时,才值得进入命令层。
在 Cesium 1.145.0 中,DrawCommand、VertexArray、ShaderProgram、RenderState 以及 frameState.commandList 是内部实现契约。能够从运行时对象找到它们,并不意味着升级时保持兼容。应把这类访问集中在小型 adapter,普通应用代码仍使用明确的图层接口。
一条命令需要什么
以经纬网格表面为例,vertexArray 绑定顶点与索引缓冲,shaderProgram 负责位置和颜色,uniformMap 提供当前标量纹理与 alpha,renderState 指定深度测试和混合,包围体(bounding volume)boundingVolume 支持剔除。包围球通常由中心位置和半径表示,两者的长度单位及坐标空间必须与命令约定一致。下面是阅读源码的结构示意,不是可直接粘贴的公开 API 示例:
ts
// internal:省略资源创建与版本适配
command = new Engine.DrawCommand({
vertexArray,
shaderProgram,
uniformMap,
renderState,
boundingVolume,
pass: Engine.Pass.TRANSLUCENT,
});合理的 boundingVolume 不只是性能选项。包围体过小可能让本应可见的几何被裁掉;把它无限放大虽然掩盖问题,却会失去有效剔除。跨日期线的大区域也不能简单用未经处理的经纬最小最大值推断空间范围。
创建一次,每帧提交
自定义图元通常在第一次 update 时创建资源,之后更新必要 uniform 并把已有命令放入列表。每帧重新创建 ShaderProgram、Texture 或 Buffer,会引入编译、上传、垃圾回收及泄漏风险。风场中计算必须先产出新状态,绘制再读取它;命令相邻出现并不自动证明所有通道、派生命令与透明流程都符合预期,需要真实验证。
一个场,多种颜色
在同一组合成场上切换采样、时间和颜色映射。
在浏览器本地运行 · 无需账号 · 鼠标拖动旋转,滚轮缩放
教学合成数据,不代表真实观测或天气预报。规则场用于验证,拟真形态用于观察复杂结构。 数据说明
查看运行源码
此代码直接读取实际运行的实验模块。按 kind 分支定位当前实验,也可查看数据公式和 GLSL。
读取源码…观察任务
标量场只改变色带范围时,应该重建顶点缓冲吗?如果旋转到某个角度后整片场突然消失,而 Console 没有 shader 错误,应检查哪些信息?
展开答案
色带范围通常只影响 uniform 或小纹理,不需要改变几何。整片消失优先检查包围体、剔除、面朝向、深度以及命令所属 pass。无编译错误只证明程序能编译,不能证明绘制状态和空间范围正确。
阅读依据:Cesium 1.145 DrawCommand 源码(internal)、Cesium 1.145 Primitive 源码。