欢迎关注微信公号【三维网格3D】,第一时间获取最新文章
DrawCommand 是 Cesium 渲染器的核心类,常用的接口 Entity、Primitive、Cesium3DTileSet,以及地形和影像的渲染等等,底层都是一个个 DrawCommand 完成的。在进行扩展开发、视觉特效提升、性能优化、渲染到纹理(RTT),甚至基于 Cesium 封装自己的开发框架,定义独家数据格式等等,都需要开发人员对 DrawCommand 熟练掌握。而这部分接口,Cesium 官方文档没有公开,网上的相关资料也比较少,学习起来比较困难,所以接下来我们用几期文章,由浅入深,实用为主,力求全面地介绍 DrawCommand 及相关类的运用。
上一期(《Cesium 高性能扩展之DrawCommand(一):入门》)介绍 DrawCommand 基本属性,相信大家已经能够轻松创建一个可用的DrawCommand和自定义Primitive了。那么自定义Primitive有什么用呢?还有没有必要深入学习呢?
这一期我们先不增加知识点,综合运用上一期介绍的基本属性,以及前几期介绍的Osgb解析技术(参考文章《如何在Web上直接浏览大规模OSGB格式倾斜模型(一):解析OSGB,附源码》
《如何在Web上直接浏览大规模OSGB格式倾斜模型(二):转换OSGB》),实现在不依赖Three.js的情况下,直接创建DrawCommand来显示Osgb倾斜摄影模型。
很容易总结出关键步骤:
将Osgb几何体转成Cesium.Geometry;
将Osgb纹理贴图转为Cesium.Texture;
在Shader中读取纹理贴图。
1、将Osgb几何体转成Cesium.Geometry
我们直接基于转换OSGB这篇文章的代码,稍微修改一下就可以实现。
用 Cesium.GeometryAttribute 替代 THREE.BufferAttribute;
用 Cesium.Geometry 替代 THREE.BufferGeometry;
uv属性我们按照Cesium的命名规则,改成st;
索引数组,根据最大值来选择相应的数组类型,可以节省内存。
2、将Osgb纹理贴图转为Cesium.Texture
我们还是基于转换OSGB这篇文章的代码进行修改,不过我们只要提取纹理贴图。
这里需要注意,Cesium创建纹理贴图对象时会立即将贴图数据绑定到绘图上下文,所以不能必须在获取context之后,也就是渲染循环开始之后才能创建。这点和Three.js不同,THREE.Texture只封装贴图数据和参数,绑定是渲染器层负责的(Three.js的渲染器可有多个实现,比如WebGLRenderer、WebGPURenderer、CSSRenderer、SVGRenderer等等),所以可以在渲染循环开始之前创建。
3、在Shader中读取纹理贴图
我们改动一下上一期的shader代码,增加st属性,并将st从vertexShader传到fragmentShader,当然,这对于老手来说是基本操作了。
vertexShader:
fragmentShader:
可以看出,纹理贴图map需要通过uniform传递,所以uniformMap也需要调整。
4、完整代码
构造自定义Primitive时需要传入osg::Geometry类型节点对象,在创建DrawCommand的时调用转换几何体和纹理贴图的函数。
5、调用示例及效果
解析,遍历节点,处理类型为osg::Geometry的节点,创建一个自定义Primitive来展示该节点。
效果如下:
至此,大家对于文章开头的两个问题应该都有自己的答案了,我们下期继续!
欢迎关注微信公号【三维网格3D】,第一时间获取最新文章
网友评论