Cesium拾取源码分析

Cesium拾取源码分析

拾取大体上的思路是:在拾取的时候,将物体渲染到帧缓冲区,然后读取拾取的3x3区域像素值,再根据像素值去匹配拾取到的物体。在整个流程中,有两个重要的类:BatchTable和DerivedCommand,前者主要是负责准备渲染需要的纹理、变量,用于后续的查找,DerivedCommand则是负责创建渲染到帧缓冲区的绘制命令。分三个部分来展开说明:BatchTable的作用、DerivedCommand的作用、最后是拾取的流程。

1.BatchTable的作用

BatchTable在整个拾取的流程中扮演了一个非常重要的角色,所以在开始说明拾取流程之前,有必要先了解下,在几何转为DrawCommand的流程,BatchTable起到了什么样的作用。

1.1 BatchTable的创建

在Primitive的update方法中,会执行createBatchTable()从而创建BatchTable,然后会执行batchTable.setBatchedAttribute(i, attributeIndex, value)方法设置BatchTable中用到的属性值,这些属性值会以数组的形式存放在batchTable._batchValues中。

然后是context.createPickId(pickObject),其中会调用createPickId创建PickId对象,PickId对象有:key、color、以及几何本身(Primitive),在创建的时候,此PickId对象会添加到context的_pickObjects字典,用于后面的查找。color的值同样写入batchTable._batchValues中。

Context.prototype.createPickId = function (object) {
   
   
  //>>includeStart('debug', pragmas.debug);
  Check.defined("object", object);
  //>>includeEnd('debug');

  // the increment and assignment have to be separate statements to
  // actually detect overflow in the Uint32 value
  ++this._nextPickColor[0];
  const key = this._nextPickColor[0];
  if (key === 0) {
   
   
    // In case of overflow
    throw new RuntimeError("Out of unique Pick IDs.");
  }

  this._pickObjects[key] = object;
  return new PickId(this._pickObjects, key, Color.fromRgba(key));
};

1.2 BatchTable的更新

这里主要是创建BatchTable的纹理,纹理的值来自前面提到的batchTable._batchValues,纹理宽度根据属性值多少来定,高度都是1。

BatchTable.prototype.update = function (frameState) {
   
   
  if (
    (defined(this._texture) && !this._batchValuesDirty) ||
    this._attributes.
Cesium 是一个基于 WebGL 的开源地球渲染引擎,主要用于在浏览器中呈现三维地理数据。它使用了一些复杂的渲染技术和算法来实现高性能和高质量的地球渲染效果。下面是对 Cesium 渲染源码的简要分析: 1. Shader:Cesium 使用了大量的着色器程序来实现不同的渲染效果,如光照、纹理映射、阴影等。着色器程序是在 GPU 上执行的,并且可以通过 GLSL(OpenGL Shading Language)语言进行编写。Cesium 的着色器程序通常是在运行时动态生成的,以适应不同的地图数据和渲染需求。 2. 地形渲染:Cesium 支持高度精细的地形渲染,它使用了基于切片的地形渲染技术。在渲染过程中,Cesium 会将地球表面分割成小块切片,并根据每个切片的高度数据和纹理信息生成相应的网格和纹理。这些切片可以根据需要进行加载和卸载,以实现地图数据的动态加载和显示。 3. 纹理映射:Cesium 使用了纹理映射技术来实现地球表面的贴图效果。它可以将不同类型的纹理(如卫星图像、地形纹理、气候数据等)映射到地球表面的不同部分,以实现真实的地貌效果。Cesium 通过加载和解析各种类型的地图数据,将其转换为纹理信息,并将其应用到地球表面的相应区域。 4. 光照和阴影:Cesium 支持实时的光照和阴影效果,以增强地球渲染的真实感。它使用了基于物理的光照模型,考虑了光源的位置、光照强度、表面材质等因素,并通过计算每个顶点和像素的光照值来实现逼真的光照效果。此外,Cesium 还支持动态阴影的生成,可以根据光源的位置和地形的形状计算出地球表面上的阴影效果。 5. 动态渲染:Cesium 支持动态渲染技术,可以在实时交互的情况下实现高性能的地球渲染效果。它使用了一些优化技术,如级联阴影映射、视锥剔除、LOD(Level of Detail)等,以减少渲染负载并提高渲染效率。此外,Cesium 还支持动态加载和卸载地图数据,以实现在不同的视角和缩放级别下的快速渲染和响应。 需要注意的是,Cesium 的源码非常庞大和复杂,涉及到多个模块和子系统。以上只是对其渲染部分的简要分析,实际的源码分析需要深入研究 Cesium 的代码库和文档,并对 WebGL 和图形渲染技术有一定的了解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值