美文网首页
Cesium 高性能扩展之DrawCommand(二):OSGB

Cesium 高性能扩展之DrawCommand(二):OSGB

作者: 三维网格 | 来源:发表于2022-01-11 11:21 被阅读0次

    欢迎关注微信公号【三维网格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】,第一时间获取最新文章

    相关文章

      网友评论

          本文标题:Cesium 高性能扩展之DrawCommand(二):OSGB

          本文链接:https://www.haomeiwen.com/subject/jyejcrtx.html