Cesium学习——渲染、加载GeoJSON、调整位置

渲染概述

作者:当时明月在曾照彩云归

出处:https://www.cnblogs.com/jiujiubashiyi/p/17124717.html

1. 引言

Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业用途

Cesium官网:Cesium: The Platform for 3D Geospatial

Cesium GitHub站点:CesiumGS/cesium: An open-source JavaScript library for world-class 3D globes and maps (github.com)

API文档:Index - Cesium Documentation

通过阅读源码,理清代码逻辑,有助于扩展与开发,笔者主要参考了以下两个系列的文章

  • Cesium教程系列汇总 - fu*k - 博客园 (cnblogs.com)
  • 开源GIS/Cesium源码 - 随笔分类 - 四季留歌 - 博客园 (cnblogs.com)

渲染是前端可视化的核心,本文描述Cesium的渲染模块概述

2. WebGL渲染流程

WebGL(或者说OpenGL)的绘制流程(图形渲染管线,Graphics Pipeline)如下:

img

  • 顶点着色(vertex shader)阶段将CPU传入的数据进行一定的变换处理
  • 图元装配(shape assembly)阶段的就是上阶段的顶点数据处理成图元(如,三角形)
  • 几何着色(geometry shader)阶段是根据一定规则将输入的图元变更或输出更多的图元(可选)
  • 光栅化(rasterization)阶段的是将上阶段的图元进行计算得到图元占据的屏幕像素列表
  • 片元着色(fragment)阶段是将上阶段生成的片元进行着色处理后
  • 测试与混合阶段计算片元的深度、颜色等从而进行舍弃或保留

绘制流程繁琐,然而,我们能配置的只有三个蓝色的着色器部分。几何着色器可选,一般配置顶点着色器和片段着色器即可,即,以下步骤就是配置顶点着色器和片段着色器

2.1 生成顶点数据

生成顶点缓冲对象(Vertex Buffer Objects, VBO)并加载数据:

const vertices = new Float32Array([
-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
0.0, 0.5, 0.0,
]);
const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

2.2 链接属性数据

顶点数组对象(Vertex Array Object, VAO)与VBO绑定,用于保存属性数据(先绑定VAO,再创建VBO就会绑定到VAO上):

const vao = gl.createVertexArray();
gl.bindVertexArray(vao);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(0)

2.3 创建顶点着色器

创建顶点着色器(Vertex Shader)并编译:

const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, `
attribute vec3 aPos;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
`);
gl.compileShader(vertexShader);

2.4 创建片段着色器

创建片段着色器(Fragment Shader)并编译:

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, `
#version 100
void main()
{
gl_FragColor = vec4(1.0, 0.5, 0.2, 1.0);
}
`);
gl.compileShader(fragmentShader);

2.5 链接着色器

着色器程序对象(Shader Program Object)是多个着色器合并之后并最终链接完成的版本:

const shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);

2.6 绘制

开始绘制:

gl.clearColor(0.2, 0.3, 0.3, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.useProgram(shaderProgram);
gl.drawArrays(gl.TRIANGLES, 0, 3);

2.7 流程总结

上述几乎可以说是最简化的WebGL渲染流程,包含的基本要素有

  • VBO,顶点缓冲对象 --------> 存顶点数据
  • VAO,顶点数组对象(WebGL 2支持)--------> 存顶点属性
  • Shader,着色器(包括顶点和片段着色器) --------> 运算和渲染
  • Shader Program,着色器程序 --------> 连接着色器

此外,常用的还有:

  • Texture,纹理(通常是一张图片)
  • Framebuffer,帧缓冲对象(FBO)
  • Renderbuffer,渲染缓冲对象(RBO)
  • CubeMap,立方体贴图

3. Cesium渲染模块

查看Cesium渲染模块中的文件:

$ ls packages/engine/Source/Renderer/
AutomaticUniforms.js
Buffer.js
BufferUsage.js
ClearCommand.js
ComputeCommand.js
ComputeEngine.js
Context.js
ContextLimits.js
CubeMap.js
CubeMapFace.js
DrawCommand.js
Framebuffer.js
FramebufferManager.js
MipmapHint.js
MultisampleFramebuffer.js
Pass.js
PassState.js
PixelDatatype.js
RenderState.js
Renderbuffer.js
RenderbufferFormat.js
Sampler.js
ShaderBuilder.js
ShaderCache.js
ShaderDestination.js
ShaderFunction.js
ShaderProgram.js
ShaderSource.js
ShaderStruct.js
Texture.js
TextureCache.js
TextureMagnificationFilter.js
TextureMinificationFilter.js
TextureWrap.js
UniformState.js
VertexArray.js
VertexArrayFacade.js
createUniform.js
createUniformArray.js
demodernizeShader.js
freezeRenderState.js
loadCubeMap.js

通过文件名,不难发现,Cesium的渲染模块主要包含:

  • Buffer
  • VAO
  • Shader
  • Texture
  • Framebuffer
  • Renderbuffer
  • CubeMap

以上是WebGL渲染流程常见的对象,另外Cesium渲染模块还有:

  • Command,指令对象(包含ClearCommand、ComputeCommand、DrawCommand)
  • Pass,通道(渲染顺序)
  • Sampler,采样器
  • Uniform,GPU全局变量
  • Context,WebGL上下文

3.1 Context对象

相关代码文件:

  • Context.js
  • ContextLimits.js

Context对象是对WebGL上下文对象的封装,包含Pass、Uniform等,并且对WebGL 1.0和WebGL 2.0做了兼容处理:

function Context(canvas, options) {
this._canvas = canvas;
this._originalGLContext = glContext;
this._gl = glContext;
this._webgl2 = webgl2;
this._id = createGuid();
this._clearColor = new Color(0.0, 0.0, 0.0, 0.0);
this._clearDepth = 1.0;
this._clearStencil = 0;
// ...
const us = new UniformState();
const ps = new PassState(this);
const rs = RenderState.fromCache();
this._defaultPassState = ps;
this._defaultRenderState = rs;
// ...
RenderState.apply(gl, rs, ps);
}

3.2 Buffer对象

相关代码文件:

  • Buffer.js
  • BufferUsage.js

Buffer对象主要包含顶点缓冲对象(Vertex Buffer Objects, VBO)和索引缓冲对象(Index Buffer Object,IBO)

function Buffer(options) {
const gl = options.context._gl;
gl.bindBuffer(bufferTarget, buffer);
gl.bufferData(bufferTarget, hasArray ? typedArray : sizeInBytes, usage);
gl.bindBuffer(bufferTarget, null);
}
Buffer.createVertexBuffer = function (options) {
return new Buffer({
// ...
});
};
Buffer.createIndexBuffer = function (options) {
const buffer = new Buffer({
// ...
});
return buffer;
};

3.3 VAO对象

相关代码文件:

  • VertexArray.js
  • VertexArrayFacade.js

顶点数组对象(Vertex Array Object, VAO)与VBO绑定,用于保存属性数据

function VertexArray(options) {
// ...
const context = options.context;
const gl = context._gl;
const attributes = options.attributes;
const indexBuffer = options.indexBuffer;
let vao;
vao = context.glCreateVertexArray();
context.glBindVertexArray(vao);
bind(gl, vaAttributes, indexBuffer);
context.glBindVertexArray(null);
}

3.4 Shader对象

相关代码文件:

  • ShaderBuilder.js
  • ShaderCache.js
  • ShaderStruct.js
  • ShaderSource.js
  • ShaderProgram.js
  • ShaderFunction.js
  • ShaderDestination.js

Cesium渲染模块中的Shader对象包含从创建GLSL到创建Shader Program整个流程

流程大致为:

image-20230309155628504

  • Cesium中支持分段编写GLSL代码,包括ShaderStruct、ShaderFunction、ShaderDestination
  • 将分段的代码组合成GLSL,即ShaderSource
  • ShaderBuilder使用ShaderSource创建的ShaderProgram会缓存起来,即ShaderCache
  • 需要新的ShaderProgram时,先查询缓存中是否有,有就复用,无则创建

3.5 Texture对象

主要代码文件:

  • Texture.js
  • TextureCache.js
  • TextureMagnificationFilter.js
  • TextureMinificationFilter.js
  • TextureWrap.js

Cesium中的Texture对象是对WebGL中Texture对象的进一步封装:

function Texture(options) {
// ...
const context = options.context;
const gl = context._gl;
const textureTarget = gl.TEXTURE_2D;
const texture = gl.createTexture();
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(textureTarget, texture);
// Source: ImageData, HTMLImageElement, HTMLCanvasElement, or HTMLVideoElement
gl.texImage2D(
textureTarget,
0,
internalFormat,
pixelFormat,
PixelDatatype.toWebGLConstant(pixelDatatype, context),
source
);
gl.bindTexture(textureTarget, null);
this.sampler = defined(options.sampler) ? options.sampler : new Sampler();
}

3.6 Framebuffer对象

主要代码文件:

  • Framebuffer.js
  • FramebufferManager.js
  • MultisampleFramebuffer.js

Cesium中的Framebuffer对象是对WebGL中Framebuffer对象的进一步封装:

function Framebuffer(options) {
// ...
this._gl = gl;
this._framebuffer = gl.createFramebuffer();
this._bind();
this._colorTextures[i] = texture;
this._colorRenderbuffers[i] = renderbuffer;
this._depthTexture = texture;
this._depthRenderbuffer = renderbuffer;
this._stencilRenderbuffer = renderbuffer;
this._depthStencilTexture = texture;
this._depthStencilRenderbuffer = renderbuffer;
this._unBind();
}

3.7 Renderbuffer对象

主要代码文件:

  • Renderbuffer.js
  • RenderbufferFormat.js

Cesium中的Renderbuffer对象是对WebGL中Renderbuffer对象的进一步封装:

 
function Renderbuffer(options) {
// ...
const gl = context._gl;
this._renderbuffer = this._gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderbuffer);
gl.renderbufferStorage(gl.RENDERBUFFER, format, width, height);
gl.bindRenderbuffer(gl.RENDERBUFFER, null);
}

3.8 CubeMap对象

主要代码文件:

  • CubeMap.js
  • CubeMapFace.js
  • loadCubeMap.js

Cesium中的CubeMap对象是对WebGL中CubeMap对象的进一步封装:

function CubeMap(options) {
// ...
const gl = context._gl;
const textureTarget = gl.TEXTURE_CUBE_MAP;
const texture = gl.createTexture();
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(textureTarget, texture);
gl.texImage2D()
// ...
gl.bindTexture(textureTarget, null);
this.sampler = defined(options.sampler) ? options.sampler : new Sampler();
}

3.9 Command

主要代码文件:

  • ClearCommand.js
  • DrawCommand.js
  • ComputeEngine.js
  • ComputeCommand.js

Command对象主要有三类:

  • ClearCommand
  • DrawCommand
  • ComputeCommand

Command对象包含执行的指令参数和执行方法,比如最简单的ClearCommand:

function ClearCommand(options) {
// ...
this.color = options.color;
this.depth = options.depth;
this.stencil = options.stencil;
this.renderState = options.renderState;
this.framebuffer = options.framebuffer;
this.owner = options.owner;
this.pass = options.pass;
}
ClearCommand.prototype.execute = function (context, passState) {
context.clear(this, passState);
};

ClearCommand包含颜色、深度、通道等指令参数和执行方法context.clear(this, passState)

3.10 Pass

主要代码文件:

  • Pass.js
  • PassState.js

Pass是一种渲染优先级,数值越低,等级越高:

const Pass = {
ENVIRONMENT: 0,
COMPUTE: 1,
GLOBE: 2,
TERRAIN_CLASSIFICATION: 3,
CESIUM_3D_TILE: 4,
CESIUM_3D_TILE_CLASSIFICATION: 5,
CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW: 6,
OPAQUE: 7,
TRANSLUCENT: 8,
VOXELS: 9,
OVERLAY: 10,
NUMBER_OF_PASSES: 11,
};

3.11 Sampler

主要代码文件:

  • Sampler.js

Sampler是将采样方式封装:

function Sampler(options) {
// ...
this._wrapS = wrapS;
this._wrapT = wrapT;
this._minificationFilter = minificationFilter;
this._magnificationFilter = magnificationFilter;
this._maximumAnisotropy = maximumAnisotropy;
}

3.12 Uniform

主要代码文件:

  • createUniform.js
  • UniformState.js
  • createUniformArray.js

Uniform是对WebGL中一系列Uniform的封装,比如UniformFloat:

function UniformFloat(gl, activeUniform, uniformName, location) {
// ...
this.name = uniformName;
this.value = undefined;
this._value = 0.0;
this._gl = gl;
this._location = location;
}
UniformFloat.prototype.set = function () {
if (this.value !== this._value) {
this._value = this.value;
this._gl.uniform1f(this._location, this.value);
}
};

4. 参考资料

[1]WebGL2RenderingContext - Web APIs | MDN (mozilla.org)

[2]LearnOpenGL CN (learnopengl-cn.github.io)

[3]Cesium教程系列汇总 - fu*k - 博客园 (cnblogs.com)

[4]Renderbuffer Object - OpenGL Wiki (khronos.org)

[5]基于JavaScript的OpenGL 01 之Hello Triangle - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)

 

GeoJSON加载

  var promise = Cesium.GeoJsonDataSource.load('../Data/res024.json',{clampToGround: true});promise.then(datasource=>{viewer.dataSources.add(datasource);datasource.entities.values.forEach(enetity=>{console.log(enetity);enetity.polygon.outlineColor=Cesium.Color.RED;enetity.polygon.material=Cesium.Color.BLUE;// enetity.polygon.height=1000;// enetity.polygon.extrudedHeight=2000;})viewer.zoomTo(datasource)})

位置调整

cesium编程入门(六)添加 3D Tiles,并调整位置,贴地 | cesium中文网

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/7648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

以中国为目标的DinodasRAT Linux后门攻击场景复现

概述 在上一篇《以中国为目标的DinodasRAT Linux后门剖析及通信解密尝试》文章中,笔者对DinodasRAT Linux后门的功能及通信数据包进行了简单剖析,实现了对DinodasRAT Linux后门心跳数据包的解密尝试。 虽然目前可对DinodasRAT Linux后门的通信数据包进…

SecretFlow学习指南(3)框架拆解和使用

“隐语”架构设计全貌 1.隐语框架设计思想 隐私计算是一个新兴的跨学科领域,涉及密码学、机器学习、数据库、硬件等多个领域。根据过去几年的实践经验,我们发现 ●隐私计算技术方向多样,不同场景下有其各自更为合适的技术解决方案 ●隐私计算…

Windows系统安装MySQL数据库详细教程

【确认本地是否安装mysql】 (1)按【winr】快捷键打开运行; (2)输入services.msc,点击【确定】; (3)在打开的服务列表中查找mysql服务,如果没有mysql服务&am…

麦肯锡精英高效阅读法笔记

系列文章目录 如何有效阅读一本书笔记 读懂一本书笔记 麦肯锡精英高效阅读法笔记 文章目录 系列文章目录序章 无法读书的5个理由无法读书的理由① 忙于工作,没时间读书无法读书的理由② 不知应该读什么无法读书的理由③ 没读完的书不断增多无法读书的理由④ 工作繁…

《QT实用小工具·五十三》会跑走的按钮

1、概述 源码放在文章末尾 该项目实现了会逃跑的按钮: 两个按钮,一个为普通按钮,另一个为会跑走的按钮 鼠标移到上面时,立刻跑掉 针对鼠标、键盘、触屏进行优化 随机交换两个按钮的文字、偶尔钻到另一个按钮下面、鼠标移开自…

2024.1.1 IntelliJ IDEA 使用记录

2024.1.1 IntelliJ IDEA 使用记录 下载设置文件编码maven 配置 插件可以中文语言包安装lombok 插件Smart Tomcat ( 根据需要安装)Smart Tomcat 配置 项目导入java 设置maven 配置 项目运行SpringBoot 项目运行tomcat 运行 (根据需要)相关依赖添加运行配置 下载 IntelliJ IDEA …

0基础学PHP有多难?

php作为web端最佳的开发语言,没有华而不实,而是经受住了时间考验,是一门非常值得学习的编程语言。 目前市场上各种网站、管理系统、小程序、APP等,基本都是使用PHP开发的,也侧面反映了PHP的需求以及学习的必要性&…

前端传递list(数组)类型参数,后端接收失败

一顿报错,我之前遇到的list都是Long类型 貌似用GET也是可以的,但是很奇怪一直报错 就是不可以 后来去百度 查询到可以用两种方法解决这个问题 1、拆开 传 以GET方式,后端GetMappingRequestParam接收。 2、以Post方式传,后端创建dto PostMappingReques…

55. 【Android教程】位图:Bitmap

在上一节学习 Drawable 图像资源的时候我们在很多地方用到了 bitmap,bitmap 其实就是真实图片在 Android 中最直接的表现形式,这一节我们来仔细学习一下 Bitmap 的使用。 1. 什么是 Bitmap Bitmap 在 Android 中对应一张图片文件,它是一个二…

普通人可以做什么兼职副业?推荐7 种卖情怀的生意,小众高利润

一瓶茅台,尽管成本仅为70元,但其建议零售价却高达1499元,而在市场上的流通价格更是突破了2600元大关。同样的一款手提包,在网络上仅售几百元,但一旦贴上了LV的标志,其售价便瞬间飙升至一万多元。这究竟是为…

【超好用的前端表单辅助功能】

前端表单辅助功能 1. 根据模块自动生成目录锚点定位2. 描点定位动态组件3. 隔离组件,组件内部实现校验逻辑,交给提交按钮统一处理4. 选择不同的类型需要重组不同的模块展示,并整合数据传给后端 最近做了一个复杂的表单,涉及到的技…

AI实景自动无人直播软件:引领直播行业智能化革命;提升直播效果,无人直播软件助力智能讲解

随着科技的快速发展,AI实景自动无人直播软件正在引领直播行业迈向智能化革命。它通过智能讲解、一键开播和智能回复等功能,为商家提供了更高效、便捷的直播体验。此外,软件还支持手机拍摄真实场景或搭建虚拟场景,使直播画面更好看…

43.WEB渗透测试-信息收集-域名、指纹收集(5)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:42.WEB渗透测试-信息收集-域名、指纹收集(4) web-架构资产收集&a…

蓝桥杯备赛(填空题)【Python B组】

一、弹珠堆放 问题描述 小蓝有 20230610 颗磁力弹珠,他对金字塔形状尤其感兴趣,如下图所示: (图是盗来的啊,侵权请联系删除) 问题分析 找规律,第一层1个,第二层3个,第…

UE5 audio capture 回声问题 ||在安卓上有爆鸣声

参考视频 0.基本步骤 【UE4_蓝图】录制麦克风声音/系统声音并输出保存WAV文件_ue4录音-CSDN博客 1.步骤 1.创建Sound Submix A 2. 右键新建Sound Submix B 3.把B的两个参数调为-96 4.audio capture的Base Submix,把前面提到的A赋值进去 5.开始录制输出和完成录制…

PXE远程部署CentOS系统

文章目录 在局域网内搭建PXE服务器PXE 启动组件PXE的优点实验一、搭建PXE服务器,实现远程部署CentOS系统环境准备server关闭防火墙安装组件准备 Linux 内核、初始化镜像文件及PXE引导文件配置启用TFTP 服务配置启动DHCP服务准备CentOS 7 安装源配置启动菜单文件 Cli…

突然断电,瀚高数据库启动失败

服务器临时断电后,数据库启动不起来 ps -ef|grep postgres 进到数据库的data目录下看下ls 看下 查看临时文件: ls -la /tmp 把这两个5866的文件改个名字张老师 加个bak就行 改完了pg_ctl start起一下

暗区突围联机不了联机失败无法联机的极速解决方法

暗区突围联机不了/联机失败/无法联机的极速解决方法 《暗区突围》是由腾讯魔方工作室群开发的第一人称射击类手游,于2021年8月17日进行先锋测试,并在2022年7月13日正式公测。《暗区突围》提供了双模式玩法,包括战术行动和伪装潜入&#…

猫咪没精神不吃饭?这招主食冻干喂养教你让猫咪恢复食欲

猫突然不吃东西没精神是生病了吗?当猫咪不吃东西、精神不振时,可能的原因有健康问题、环境因素或食物原因。首先应进行身体检查,观察是否有其他并发症,如无则可排除健康问题。还要给猫咪提供一个舒适的环境,多给它们一…

Cloudera简介和安装部署

ChatGPT Cloudera 是一个基于 Apache Hadoop 的数据管理和分析平台。它是由 Hadoop 的几位创始人及早期贡献者于 2008 年创立的公司,并随着公司的不断发展,Cloudera 开始提供企业级的解决方案,帮助企业更好地利用 Hadoop 生态系统进行大数据…