DrawCommand 是 Cesium 渲染器的核心类,常用的接口 Entity、Primitive、Cesium3DTileSet,以及地形和影像的渲染等等,底层都是一个个 DrawCommand 完成的。在进行扩展开发、视觉特效提升、性能优化、渲染到纹理(RTT),甚至基于 Cesium 封装自己的开发框架,定义独家数据格式等等,都需要开发人员对 DrawCommand 熟练掌握。而这部分接口,Cesium 官方文档没有公开,网上的相关资料也比较少,学习起来比较困难,所以接下来我们用几期文章,由浅入深,实用为主,力求全面地介绍 DrawCommand 及相关类的运用。
第一次被关注我们的小伙伴催更,还是挺开心的😂,公司事务略忙,只有深夜码字来赶稿了~那么本篇我们就按照计划往下写,介绍自定义Primitive的显隐控制,以及如何支持scene.pick,实现要素拾取查询。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4zA2IeF-1642559060254)(./drawCommand3.png)]
1、显隐控制
从前面两篇的代码看,显隐控制是非常简单的,我们只需要在update方法的开头加入显隐判断,如果隐藏则直接退出,否则继续。
//...
update(frameState) {
if (!this.show) return;
//...
}
//...
考虑一下,如果我们将多个要素的几何体合并成一个几何体,以达到减少绘图批次(DrawCommand的数量)提升性能的目的,这种情况下,上述方法将会同时显示或者隐藏这些要素,那么该如何控制其中任一要素的显隐呢?
参考Cesium的其他Primitive类,会发现他们为每一个顶点创建了一个batchId或者a_batchId属性,这个属性非常重要,除了可以用于控制显隐外,在3D Tiles样式引擎、要素拾取查询(pick)等都起到关键作用。
这里简单介绍基于batchId的显隐控制实现思路:
- 为每一个要素创建
batchId,从0开始编号; - 为要素几何体创建
batchId顶点属性,并将batchId值逐个写入顶点属性数组; - 合并所有要素几何体;
- 创建一个二维数组类型的纹理贴图,宽度等于要素数量,高度为1,用
0和1表示要素隐藏或者显示,写入纹理数据; - 在
shader中根据batchId并计算uv,从显隐纹理获取要素的显隐标记,如果小于1则discard; - 当某个要素显隐发生变化时,更新显隐纹理。
目前我们先不要想那么复杂,等掌握了更多技能,需要设计这么复杂的自定义Primitve的时候,自然能理解并参考Cesium的代码来实现这一显隐控制方法。
2、支持pick实现点选
要素拾取查询(Pick),是3D交互的重要基础,想象一下一个3D应用,所有图形要素怎么点击都没有反应,那它跟一个视频播放器就没有什么两样了~
Cesium提供了统一的要素拾取查询机制,拾取API封装在Cesium.Scene中,前面我们介绍3D描边等后期处理时就曾使用过,非常简单。
viewer.screenSpaceEventHandler.setInputAction(e => {
var picked = viewer.scene.pick(e.pos

本文详细介绍如何在Cesium中自定义Primitive实现显隐控制与要素拾取功能,包括利用DrawCommand进行渲染优化的方法,以及如何支持场景点击拾取。
最低0.47元/天 解锁文章
1951

被折叠的 条评论
为什么被折叠?



