CESIUM 原理 之 COMMAND拼接【转】

VAO

VAO(Vertext Array Object),中文是顶点数组对象。之前在《Buffer》一文中,我们介绍了Cesium如何创建VBO的过程,而VAO可以简单的认为是基于VBO的一个封装,为顶点属性数组和VBO中的顶点数据之间建立了关联。我们来看一下使用示例:

如同,创建顶点数据和顶点索引的部分之前已经讲过,然后将顶点数据添加到属性数组中,并最终构建成VAO,使用方式很简单。

RenderState

指定DrawCommand的渲染状态,比如剔除,多边形偏移,深度检测等,通过RenderState统一管理:

Drawcommand

前面我们讲了VBO/VAO,Texture,Shader以及FBO,终于万事俱备只欠东风了,当我们一切准备就绪,剩下的就是一个字:干。Cesium中提供了三类Command:DrawCommand、ClearCommand以及ComputeCommand。我们先详细的讲DrawCommand,同时也是最常用的。

如上是DrawCommand的创建方式,这里只有两个新的知识点,一个是owner属性,记录该DrawCommand是谁的菜,另外一个是pass属性。这是渲染队列的优先级控制。目前,Pass的枚举如下,具体内容下面后涉及:

创建完的DrawCommand会通过update函数,加载到frameState的commandlist队列中,比如Primitive中update加载drawcommand的伪代码:

进入队列后就开始听从安排,随时准备上前线(渲染)。Scene会先对所有的commandlist会排序,Pass值越小优先渲染,通过Pass的枚举可以看到最后渲染的是透明的和overlay:

根据渲染优先级排序后,会先渲染环境相关的command,比如skybox,大气层等,接着,开始渲染其他command:

接着,就是对每一个DrawCommand的渲染,也就是把之前VAO,Texture等等渲染到FBO的过程,这一块Cesium也封装的比较好,有兴趣的可以看详细代码,这里只讲一个逻辑,太困了。。。

ClearCommand

ClearCommand用于清空缓冲区的内容,包括颜色,深度和模板。用户在创建的时候,指定清空的颜色值等属性:

然后在渲染中更新队列执行清空指令:

然后,会根据你设置的颜色,深度,模板值来清空对应的帧缓冲区,代码好多啊,但很容易理解:

ComputeCommand

ComputeCommand需要配合ComputeEngine一起使用,可以认为是一个特殊的DrawCommand,它不是为了渲染,而是通过渲染机制,实现GPU的计算,通过Shader计算结果保存到纹理传出的一个过程,实现在Web前端高效的处理大量的数值计算,下面,我们通过学习之前ImageryLayer中对墨卡托影像切片动态投影的过程来了解该过程。

首先,创建一个ComputeCommand,定义这个计算过程前需要准备的内容,以及计算后对计算结果如何处理:

还记得Pass中的Compute枚举吧,放在第一位,每次Scene.update时,发现有ComputeCommand都会优先计算,这个逻辑和DrawCommand一样,都会在update中push到commandlist中,比如在ImageryLayer中,则是在

queueReprojectionCommands方法完成的,而具体的执行也和DrawCommand比较相似,稍微有一些特殊和针对的部分,具体代码如下:

Renderer系列告一段落,并没有涉及很多WebGL的语法层面,主要希望大家能对各个模块的作用有一个了解,并在这个了解的基础上,学习一下Cesium对WebGL渲染引擎的封装技巧。通过这一系列,个人很佩服Cesium的开发人员对OpenGL渲染引擎的理解,在完成这一系列的过程中,个人受益匪浅,也希望能对各位起到一个分享和帮助。

基于功能的面向函数的接口,封装成基于状态管理的面向对象的封装,方便了我们的使用和管理。但从中我们还是可以看到,WebGL在某些方面的薄弱,比如实例化和FBO的部分功能需要在WebGL2.0的规范下才支持,当然对此,我表示乐观,我感受到了WebGL标准化的快速发展。

另外,我也想到了用Three.js封装Cesium渲染引擎的可能,当然我对Three.js不了解,但随着不断学习Cesium。Renderer,我个人并不喜欢这个想法。我觉得在设计和封装上,Renderer已经很不错了,我们可以借鉴Three.js在功能和易用性上的特点,强化Cesium,而不是全盘否定重新造轮子。而且并不能因为点上的优势而进行面上的推倒,如果对这两个引擎都不了解,最好还是埋头学习少一点高谈阔论。基本功是顿悟不出来的。

转自:https://www.cnblogs.com/yanan-boke/p/9140519.html

Original: https://www.cnblogs.com/mazhenyu/p/16351147.html
Author: 3D入魔
Title: CESIUM 原理 之 COMMAND拼接【转】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/552666/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SQL–基础语句

    1 SELECT skucolor,clicks FROM shecharme;#SQL语句从Shecharme表&#x4E…

    技术杂谈 2023年7月24日
    075
  • EBS QRCODE

    qrcode_java0.50beta10.tar [root@ebs12vis ~]# su – applmgr [applmgr@ebs12vis ~]$ cd $…

    技术杂谈 2023年6月1日
    080
  • commit –amend

    为了节省时间,这个教程使用现有的历史记录作为本地数据库。 从这里下载 我们将修改最近一次的提交。 首先进入stepup-tutorial/tutorial1目录。本地端的历史记录状…

    技术杂谈 2023年5月31日
    0111
  • 剑指offer计划19( 搜索与回溯算法中等)—java

    1.1、题目1 剑指 Offer 64. 求1+2+…+n 1.2、解法 这题看评论区真的绝了,都是人才,各个说话都好听,我看到个还有用异常来结束的就离谱。这题用了&a…

    技术杂谈 2023年7月25日
    068
  • xss 防范

    https://www.npmjs.com/package/xss xss的案例: https://portswigger.net/web-security/cross-site-…

    技术杂谈 2023年5月31日
    089
  • Linux系统安装JDK

    准备工作 1.去JDK的官网下载一个1.8的安装包 2.解压到linux系统 tar -zxvf jdk-8u311-linux-x64.tar.gz -C /download/c…

    技术杂谈 2023年7月11日
    078
  • 【赵渝强老师】MongoDB中的索引(上)

    索引是提高查询查询效率最有效的手段。索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引…

    技术杂谈 2023年7月24日
    073
  • HTB靶场记录之Jarvis

    1、靶机介绍 这次的靶机是Jarvis,很适合练手,难点在提权。 2、信息收集 这里我先用autorecon进行信息收集。 Autorecon集成nmap,nikto等操作可以比较…

    技术杂谈 2023年5月31日
    086
  • MySQL数据库规范

    MySQL数据库规范 前言 今天我们来聊一聊MySQL数据库常见的一些建议设计规范,参考阿里的《JAVA开发手册泰山版》,我们简单挑出几处进行简单分析和回顾复习,如果有不正确或者不…

    技术杂谈 2023年6月21日
    095
  • 文本操作find cut sort wc sed awk

    文本操作 查找文件: # find 大概位置 以名字查找 名字 find /etc/ -name i18n find /etc/ -name 70* find /etc/ -nam…

    技术杂谈 2023年7月11日
    072
  • Python数据分析–Numpy常用函数介绍(7)–Numpy中矩阵和通用函数

    在NumPy中,矩阵是 ndarray 的子类,与数学概念中的矩阵一样,NumPy中的矩阵也是二维的,可以使用 mat 、 matrix 以及 bmat 函数来创建矩阵。 一、创建…

    技术杂谈 2023年7月25日
    080
  • Func<T>、Action<T> 的区别于说明

    Func是一个.Net内置的委托。 Func Func Func Func Func Func 它有5种形式,只是参数个数不同;第一个是无参数,但是有返回值; 下面是一个简单的普通…

    技术杂谈 2023年5月31日
    097
  • golang receiver of method方法接收者

    什么是method(方法)?method是函数的另外一种形态,隶属于某个类型的方法。 method的语法: func (r Receiver) funcName (paramete…

    技术杂谈 2023年5月30日
    0103
  • Service与Activity通信 回调方式***

    要实现service与activity的高强度通信用什么方法? service与activity之前的通信方式有很多,回调接口方式、观察者模式、广播、还有handler等,方法有很…

    技术杂谈 2023年5月31日
    0103
  • 比较 Windows 10 的不同版本

    转自 比较 Windows 10 的不同版本 win10 家庭版、专业版、专业工作站版、企业版的区别比较。 更多信息,可以通过比较完整的列表: Windows10_Commerci…

    技术杂谈 2023年5月31日
    081
  • 批量替换脚本中的换行符rn为n命令引发的问题

    脚本中包含内容: sed -ie ‘s/^M//g’ insert_data.sql 使用一下命令将脚本中的换行符替换成unix下的换行符: find -name *.sh| xa…

    技术杂谈 2023年6月1日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球