Cesium 高性能扩展之DrawCommand(一):入门

DrawCommand 是 Cesium 渲染器的核心类,常用的接口 Entity、Primitive、Cesium3DTileSet,以及地形和影像的渲染等等,底层都是一个个 DrawCommand 完成的。在进行扩展开发、视觉特效提升、性能优化、渲染到纹理(RTT),甚至基于 Cesium 封装自己的开发框架,定义独家数据格式等等,都需要开发人员对 DrawCommand 熟练掌握。而这部分接口,Cesium 官方文档没有公开,网上的相关资料也比较少,学习起来比较困难,所以接下来我们用几期文章,由浅入深,实用为主,力求全面地介绍 DrawCommand 及相关类的运用。
在这里插入图片描述
简单列个计划吧,可能部分内容合为一期来介绍:

入门;
显隐控制;
支持 pick;
阴影(shadows);
实例化(instance);
支持 Entity 的贴地属性;
解决抖动问题(RTC);
支持BatchTable。
本期我们先从一个简单的示例来介绍 DrawCommand 基本属性,通过这个示例,大家可以自己基于 DrawCommand 创建一个最基本的可用的 Primitive。

1、创建 DrawCommand

在这里插入图片描述
一个基本的 DrawCommand 至少包含:

  • vertexArray :顶点数组,向 GPU 传递顶点属性、索引(可选的)数组等几何信息;
  • shaderProgram :着色器程序对象,负责编译、链接顶点着色器(vertexShader)、片元着色器(fragmentShader);
  • renderState :渲染状态对象,封装如深度测试(depthTest)、剔除(cull)、混合(blending)等状态类型的参数设置;
  • pass :渲染通道,Cesium 提供的常用渲染通道(封装在Cesium.Pass)有:
    ENVIRONMENT:环境,如天空盒(星空背景)
    COMPUTE :用于并行加速计算
    GLOBE :地形瓦片等
    TERRAIN_CLASSIFICATION :地形分类
    CESIUM_3D_TILE :3D Tiles 瓦片
    CESIUM_3D_TILE_CLASSIFICATION :3D Tiles 分类(单体化)
    OPAQUE :不透明物体
    TRANSLUCENT :半透明物体

不是必须但是常用的属性:

  • modelMatrix:模型变换矩阵,用于指定所绘制物体的参考系,包括位置、旋转、缩放三方面参数。如果不设置,则参考系为世界坐标系,原点在地球球心;
  • uniformMap :用于传递 uniform 具体的值,是一个回调函数字典对象,key 是 uniform 变量名,value 是回调函数,回调函数的返回值可以是:
  • number :数字类型,或者数字数组;
    boolean :布尔类型,true 或者 false,或者数组;
    Cartesian2 :二维向量;
    Cartesian3 :三维向量;
    Cartesian4 :四维向量;
    Color :颜色,本身也是四维向量;
    Matrix2 :2x2 矩阵;
    Matrix3 :3x3 矩阵,一般可以传法线矩阵(normalMatrix);
    Matrix4 :4x4 矩阵,如 modelMatrix、viewMatrix、projectionMatrix 等等都是这个类型;
    Texture :二维贴图;
    CubeMap :立方体贴图。

2、使用 DrawCommand

DrawCommand的使用需要通过实现Primitive接口来完成,具体代码如下(已经省去创建DrawCommand部分)
在这里插入图片描述

3、基本属性详解

下面详细介绍各个基本属性及其创建方法。

3.1、modelMatrix

模型变换矩阵,用于指定所绘制物体的参考系,包括位置、旋转、缩放三方面参数。Cesium 提供现成的一组方法(封装在Cesium.Transforms)可以快速创建几种常见的站心坐标系,最常用莫过于 ENU 坐标系了。
在这里插入图片描述
3.2、vertexArray

顶点数组的创建有多种方法,通常可以将几何数据用Cesium.Geometry来表达,然后用Cesium.VertexArray.fromGeometry可以用更少代码量完成创建。关键参数:

  • attributeLocations :顶点属性索引,key 为属性名称,value 为顶点属性缓冲区在同一个着色器程序中的索引,相当于将 js 中的顶点数组,传递到 shader 中的 attribute 变量。在后面创建shaderProgram时还需要用到;
  • ontext:从Primitive.update方法的frameState参数中获取;
  • geometry:Cesium.Geometry,Cesium 自带的几何类型都提供一个静态方法createGeometry来生成这个类型的几何对象。
    在这里插入图片描述
    3.3、shaderProgram
    着色器程序,负责编译、链接顶点着色器(vertexShader)、片元着色器(fragmentShader)。熟悉整个流程之后,这一步的shader编写就是分高下的关键所在了,或炫酷的视觉效果、或高效的并行算法,都在 shader 代码。我们需要清楚:
  • 需要声明哪些attribute变量?这取决于geometry.attributes,变量名称必须保持一致;变量类型取决于geometry.attributes中各个属性的componentsPerAttribute值:
  • 1——float;
    2——vec2;
    3——vec3;
    4——vec4;
  • Cesium 提供哪些内置的uniform变量(通常前缀为czm_)?比如下面的czm_projection,内置uniform变量无需在我们的 shader 代码中声明,Cesium 会自动添加,下一节的uniformMap也无需包含;
  • 需要声明哪些uniform变量?除了内置变量,我们运算需要的外部传递的,每一个次运算所使用的值都相同的外部变量,都需要声明。变量的值,通过下一节的uniformMap传递。
    在这里插入图片描述
    3.4、uniformMap
    用于传递自定义 uniform 变量的值,是一个回调函数字典对象,key 是 uniform 变量名,value 是回调函数,回调函数的返回值可以是:
  • number :数字类型,在 shader 中类型为float;
  • boolean :布尔类型,true 或者 false,在 shader 中类型为bool;
  • Cartesian2 :二维向量,在 shader 中类型为vec2;
  • Cartesian3 :三维向量,在 shader 中类型为vec3;
  • Cartesian4 :四维向量,在 shader 中类型为vec4;
  • Color :颜色,本身也是四维向量,在 shader 中类型为vec4;
  • []:元素为上述类型的数组
  • Matrix2 :2x2 矩阵,在 shader 中类型为mat2;
  • Matrix3 :3x3 矩阵,一般可以传法线矩阵(normalMatrix),在 shader 中类型为mat3;
  • Matrix4 :4x4 矩阵,如 modelMatrix、viewMatrix、projectionMatrix 等等都是这个类型,在 shader 中类型为mat4;
  • Texture :二维贴图,在 shader 中类型为sampler2D;
  • CubeMap :立方体贴图,在 shader 中类型为samplerCube;
  • {}:结构体。
    在这里插入图片描述
    3.5、renderState
    渲染状态对象,封装如深度测试(depthTest)、剔除(cull)、混合(blending)等状态类型的参数设置。其中涉及多个技术,后面会展开部分来介绍,其余的在使用中慢慢掌握。
    在这里插入图片描述在这里插入图片描述

4、完整示例代码

在这里插入图片描述
两个字:快,稳!
欢迎咨询,后台回复【商务合作】,获取联系方式!

欢迎关注微信公众号【三维网格3D】,第一时间获取最新文章在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值