Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Cesium渲染一帧中用到的图形技术

Cesium渲染一帧中用到的图形技术

作者头像
charlee44
发布于 2020-12-29 02:19:44
发布于 2020-12-29 02:19:44
3.1K0
举报
文章被收录于专栏:代码编写世界代码编写世界

译者注:本文翻译自Cesium官方博文《Graphics Tech in Cesium - Rendering a Frame》,May 14, 2015 by Patrick Cozzi。

目录

  • 设置
  • 更新
  • 潜在可见集合
  • 渲染
  • 排序和批处理
  • 拾取
  • 未来的工作
    • 地面通道
    • 阴影
    • 深度纹理
    • WebVR
    • 立方体贴图通道
    • 后处理效果
    • 计算通道
  • 致谢
  • 参考

本文通过追溯Cesium的Scene.render,解释了Cesium 1.9如何使用其WebGL渲染器渲染每一帧。在Scene.render中放置一个断点,运行一个Cesium应用,然后继续。

由于Cesium专注于可视化地理空间内容,因此使用许多不同光源的场景并不常见,因此Cesium使用传统的前向阴影管线(Forward Rendering)。 Cesium的管道之所以独特,是因为它使用了多个视锥体来支持巨大的视距,避免造成Z-fighting现象[Cozzi13]。

译者注:正向渲染/前向渲染(Forward Rendering)与延迟渲染(Deferred Rendering)相对,延迟渲染多用于多光照的场合。参看《正向渲染和延迟渲染彼此之间有什么不同》

设置

Cesium将具有帧生存期的常量存储在FrameState对象中。在每一帧的开始阶段,将使用诸如相机参数和仿真时间之类的值对其进行初始化。 这个FrameState对可用于其他对象,例如在整个帧周期中生成命令(绘图调用)的图元(primitives)。

UniformState是FrameState的一部分,具有通用的预先计算的着色器uniform变量。 在每一帧的开始阶段,诸如视图矩阵和太阳光线矢量等uniform变量将会被计算

更新

Cesium具有经典的动画/更新/渲染管线,动画步骤可以在不与WebGL交互的情况下移动图元(primitives,Cesium表示可渲染对象的术语),更改材质属性,添加/删除图元等。 这不是Scene.render的一部分,它可能会在应用程序代码中,通过在渲染帧之前显式设置属性时发生;或者可能会在Cesium中隐式地,通过使用Entity API分配时间变值触发。

经典的动画/更新/渲染管线

Scene.render的第一步是更新场景中的所有图元。 在此步骤中,每个图元会

  • 创建/更新其WebGL资源。例如,编译/链接着色器,加载纹理,更新顶点缓冲区等。Cesium永远不会在Scene.render之外调用WebGL,因为这样做会增加requestAnimationFrame的耗时,并使其难以与其他WebGL引擎整合。
  • 返回一组DrawCommand对象的列表,这些对象可以表示成绘图调用命令,并引用了由图元创建的WebGL资源。 有些图元(例如折线或布告板(billboard)集合)可能会返回单个命令;而其他的图元(例如Globe或3D模型),可能会返回数百个命令。 大多数帧将是几百到几千个命令的。

Globe对象是Cesium的地形和图像引擎,可以看作是一个图元(primitive)。它的更新函数可处理多层级结构的细节和拣选,以及用于加载地形和图像图块的核心外内存管理

潜在可见集合

拣选是图形引擎常见的优化方法,能够快速的消除视野外的对象;以便管道的其余部分不必处理这些对象。通过可见性测试的对象就是“潜在可见性集”,并继续沿管道传输。它们可能是可见的,因为使用了不精确的保守可见性测试来提高速度。

Cesium通过使用commands的世界空间的boundingVolume(包围盒)对象,来对单个命令(图元,例如执行自己拣选操作的Globe,可以禁用此功能),自动执行视锥和水平剔除[Ring13a,Ring13b]。

传统的图形引擎可以通过检查每个命令(command)的可见性测试来找到潜在的可见集。 Cesium的createPotentiallyVisibleSet函数更进一步,将命令动态地分为多个视锥(通常是三个),它们将所有命令限制在一定的范围之内,并保持恒定的远近比以避免深度冲突( z-fighting)。每个视锥体具有相同的视场和宽高比,只有近平面和远平面的距离不同。作为一种优化,此函数利用时间相干性,并且如果对于该帧的命令仍然合理,则将重用最后计算的视锥。

左:多视锥体;右: 在视锥体中的命令

渲染

每个视锥体都有各自的命令列表,组成视锥体列表后,我们现在可以执行命令了——也就是执行WebGL的drawElements/drawArrays的调用。以下会顺着追踪Cesium的executeCommands相关的内容,因为这是Cesium渲染管线的核心。

首先,清除颜色缓冲区。如果使用了与顺序无关的透明度(OIT)[McGuire13,Bagnell13]或快速近似抗锯齿(FXAA),则它们的缓冲区也将被清除(有关更多信息,请参见下文)。

然后,使用整个视锥体(不是单个计算的视锥之一)来渲染一些特殊情况的图元:

  • 包含星星的天空盒。 老式的优化方法是先渲染天空盒,然后跳过清除颜色缓冲区的操作。 如今,这实际上会影响性能,因为清除颜色缓冲区有助于最大程度地压缩GPU(与清除深度相同)。最佳做法是使天空盒最后渲染以利用Early-Z。Cesium首先渲染天空盒,因为它必须这样做,需要在每个视锥体之后清除深度(正如下面所描述的那样)。
  • 天空大气。来自[ONeil05]的基本大气。
  • 太阳。如果太阳是可见的,则渲染太阳的布告板(billboard)。如果还启用了泛光过滤器,则会剪掉太阳,然后几个通道将会被渲染:对颜色缓冲区进行降采样,变亮,模糊(分别在水平和垂直通道中进行),然后进行升采样并与原始混合。

接下来,从最远的视锥开始,按照以下步骤执行每个视锥中的命令:

  • 视锥体特定的uniform状态量将会被设置。这只是视锥体的近距离和远距离。
  • 深度缓冲区将会被清空。
  • 首先执行不透明图元的命令。 执行命令会设置WebGL状态,例如渲染状态(深度,混合等),顶点数组,纹理,着色器程序和统一,然后发出绘图调用。
  • 接下来,执行半透明命令。如果由于缺少浮点纹理而不支持OIT,则将命令从头到尾排序,然后执行。否则,OIT用于提高相交半透明对象的视觉质量,并避免排序的CPU开销。命令的着色器针对OIT进行了修补(并缓存),如果支持MRT,则通过一次OIT渲染进行渲染,或者作为后备通过两次渲染。可以参阅OIT.executeCommands

使用多个视锥会导致一些有趣的情况,例如如果命令重叠多个视锥,则命令可以执行多次。详细信息请参见[Cozzi13]。

至此,每个视锥体的命令已执行。如果使用OIT,则执行最后的OIT复合通道。如果启用了FXAA,则会执行全屏通道以进行抗锯齿。

与平视显示器(HUD)相似,覆盖通道的命令最后执行。

Cesium当前的渲染管线。

排序和批处理

在每个视锥中,保证按图元返回命令的顺序执行命令。例如,Globe从头到尾对其命令进行排序,以利用GPU Early-Z优化。

由于性能通常取决于命令的数量,因此许多图元使用批处理通过将不同的对象组合为一个命令来减少命令的数量。 例如,BillboardCollection在一个顶点缓冲区中存储尽可能多的布告板,并使用相同的着色器对其进行渲染。

拾取

Cesium使用颜色缓冲区实现拾取。每个可选取的对象都有一个唯一的ID(颜色)。为了确定在给定的(x,y)窗口坐标中拾取到内容,将帧渲染到屏幕外的帧缓冲区,其中写入的颜色为拾取ID。然后,使用WebGL的readPixels读取颜色,并将其用于返回拾取的对象。

Scene.pick的管道类似于Scene.render,但由于例如天空盒,大气层和太阳无法拾取而得以简化。

未来的工作

关于一帧中进行的渲染工作,有一些正在进行中还处于计划阶段的提升。

地面通道

上面描述的Scene.render中的通道在图形引擎中很常见:OPAQUE,TRANSLUCENT,然后是OVERLAY。 实际上,OPAQUE分为GLOBE和OPAQUE。 可能会对其进行扩展,以便其顺序为:基本globe,固定在地面上的矢量数据,然后是一般的不透明对象。 参见#2172

阴影

阴影将通过shadow mapping实现。从每个阴影投射光的角度渲染场景,并且每个显示投射对象都有助于深度缓冲区或阴影贴图,即从灯光角度到每个对象的距离。然后,在主色通道中,每个阴影接收对象检查每个光源阴影图中的距离,以查看其片段是否在阴影内。实际的生产实现非常复杂,需要解决锯齿伪像,柔和阴影,多个视锥体以及Cesium的核心外地形引擎。 参见#2594

深度纹理

添加阴影的一个子集增加了对深度纹理的支持,例如,可以将其用于针对地形进行深度测试的告示板,并根据深度重构世界空间的位置。

WebVR

添加阴影的另一部分是从不同角度渲染场景的能力。WebVR支持可以基于此。标准相机和视锥用于拣选和LOD选择,然后使用两个偏心的视锥(每个眼睛一个)进行渲染。NICTA的VR插件使用类似的方法,但是使用了两个画布。

立方体贴图通道

阴影的另一个扩展是渲染立方体贴图的能力,即形成一个盒子的六个2D纹理描述了盒子中间某个点周围的环境。立方体贴图可用于反射,折射和基于图像的照明。立方体贴图通道的使用代价可能会变得昂贵,因此我怀疑这将仅少量用于即时生成。

后处理效果

Scene.render具有一些后期处理效果,这些效果经过硬编码,例如太阳泛光,FXAA甚至是OIT合成。我们计划创建一个通用的后处理框架,将纹理作为输入,通过一个或多个后处理阶段运行它们,这些通道基本上是在视口对齐的四边形上运行的片段着色器,然后输出一个或多个纹理。例如,这将用驱动后处理框架的数据代替许多硬编码的太阳泛光,并打开许多新效果,例如景深,SSAO,发光,运动模糊等。 请参阅这些说明

计算通道

Cesium会使用老式的GPGPU来进行GPU加速的图像重投影,在该渲染过程中,它将渲染一个与屏幕视口对齐的四边形,以将重投影推向着色器。这可以通过在帧开始时的计算过程中使用后处理框架来完成。参见#751

潜在的未来Cesium渲染管线(新阶段以粗体显示)。

致谢

我和Dan Bagnell编写了大多数Cesium渲染器。要获得娱乐,请参阅我们的Cesium Wiki注释。 当我还在读高中时,Ed Mackey在90年代就在AGI进行了最初的多视锥体实现。

参考

[Bagnell13] Dan Bagnell. Weighted Blended Order-Independent Transparency. 2013

[Cozzi13] Patrick Cozzi. Using Multiple Frustums for Massive Worlds. In Rendering Massive Virtual Worlds Course. SIGGRAPH 2013.

[McGuire13] McGuire and Bavoil, Weighted Blended Order-Independent Transparency, Journal of Computer Graphics Techniques (JCGT), vol. 2, no. 2, 122–141, 2013

[ONeil05] Sean O’Neil. Accurate Atmospheric Scattering. In GPU Gems. Edited by Matt Pharr and Randima Fernando. 2005.

[Ring13a] Kevin Ring. Horizon Culling. 2013.

[Ring13b] Kevin Ring. Computing the horizon occlusion point. 2013.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
三维图形渲染显示的全过程
图像中物体所处位置及外形由其几何数据和摄像机的位置共同决定,物体外表是受到其材质属性、光源、纹理及着色模型所影响。
刘盼
2018/08/16
4.1K0
三维图形渲染显示的全过程
3D 可视化入门:渲染管线原理与实践
玩 3D 游戏的时候,有没有想过这些 3D 物体是怎么渲染出来的?其中的动画是怎么做的?为什么会出现穿模、阴影不对、镜子照不出主角的情况?要想解答这些问题,就要了解实时渲染。其中最基础的,就是渲染管线。
Tecvan
2021/12/09
7K1
3D 可视化入门:渲染管线原理与实践
Unity通用渲染管线(URP)系列(一)——自定义渲染管线(Taking Control of Rendering)
这篇是自定义可编程管线的教程的第一部分,它创建一个基础的渲染管线资源,为后面的教程提供基础。
放牛的星星
2020/12/11
17.8K1
Unity通用渲染管线(URP)系列(一)——自定义渲染管线(Taking Control of Rendering)
(实时)渲染管线(pipeline)
假设一个工具需要4个步骤才能够完成,那么一个人只能完成了全部的4个步骤后才能继续进行下一个工具的生产。但如果引入另外的3个人,每个人只负责一个步骤,那么一个人只需要完成一个步骤就可以进行下一个工具的生产。
Zero Two
2024/07/09
2970
(实时)渲染管线(pipeline)
(一) 3D图形渲染管线
渲染简单的理解可能可以是这样:就是将三维物体或三维场景的描述转化为一幅二维图像,生成的二维图像能很好的反应三维物体或三维场景(如图1):
bering
2019/12/02
1.5K0
OpenGLES-02 绘制基本图元(点、线、三角形)
在绘制之前,我们需要了解下面的知识: 一、渲染管线 下图中展示整个OpenGL ES 2.0可编程渲染管线 渲染管线.png 图中Vertex Shader和Fragment Shader 是可编程
清墨
2018/05/07
2.3K0
OpenGLES-02 绘制基本图元(点、线、三角形)
OpenGL学习笔记(二)——渲染管线&着色语言
导语 :渲染管线(渲染流水线),一般由显示芯片(GPU)内部处理图形信号的并行处理单元组成。这些并行处理单元两两之间相互独立。不同的型号硬件上独立处理单元的数量有很大差异。 与CPU串行执行不同,渲染
MelonTeam
2018/01/04
2.1K0
OpenGL学习笔记(二)——渲染管线&着色语言
基础渲染系列(十五)——延迟光照
这是关于渲染的系列教程的第15部分。在上一部分中,我们添加了雾。现在,我们将创建自己的延迟光照。
放牛的星星
2020/07/10
3.6K0
基础渲染系列(十五)——延迟光照
OpenGL ES初探:渲染流程及GLKit简介
OpenGL是一套多功能开放标准库,用于处理可视化2D和3D数据。OpenGL可以将调用函数转换成图形处理命令并传送给底层图形硬件,因此OpenGL的绘制效率非常快。
CC老师
2021/08/25
1.7K0
【前端er入门Shader系列】01—从渲染管线了解Shader
对于深耕web前端多年的开发者来说,大多有过开发web轻游戏应用的梦想。毕竟前端的本质是为用户提供令人愉悦的交互体验,而游戏作为第九艺术,更是交互艺术的巅峰,二者有异曲同工之妙。
CS逍遥剑仙
2025/01/06
4230
OpenGL ES 3.0 简介
OpenGL ES 3.0实现了具有 可编程着色功能 的图形管线,由 OpenGL ES 3.0 API 和 OpenGL ES 着色语言3.0规范 组成。 下图中深色背景的 顶点着色器 和 片段着色器 为可编程阶段。
103style
2022/12/19
1.4K0
OpenGL ES 3.0 简介
Unity高级开发-Shader开发(1)-渲染管线
学习Shader(着色器)必须先要了解渲染管线。如果不了解,那么就不能说你了解Shader
孙寅
2020/06/02
1.2K0
Cesium中用到的图形技术——Horizon Culling
在开发像Cesium这样的虚拟数字地球时,我们需要能够快速确定场景中的对象(例如地形图块,卫星,建筑物,车辆等)何时不可见,因此不需要渲染。当然,我们进行视锥体裁剪。但是,另一种重要的剔除类型是地平线剔除。
charlee44
2021/08/13
2K0
Cesium中用到的图形技术——Horizon Culling
OpenGL与OpenGL在移动端的应用
OpenGL首先我们从字面意思来理解:Open Graphics Library,开放的图形库,图形库自然是处理图形的,所以简单来说OpenGL就是用来处理图形的一个三方库。 稍微技术流一点,作如下解释:是用于渲染2D,3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。
清墨
2019/11/15
2.8K0
OpenGL与OpenGL在移动端的应用
基础渲染系列(五)——多灯光
(温馨提示:本系列知识是循序渐进的,推荐第一次阅读的同学从第一章看起,链接在文章底部)
放牛的星星
2020/07/10
2.6K0
基础渲染系列(五)——多灯光
GPU渲染之OpenGL的GPU管线
GPU渲染流水线,是硬件真正体现渲染概念的操作过程,也是最终将图元画到2D屏幕上的阶段。GPU管线涵盖了渲染流程的几何阶段和光栅化阶段,但对开发者而言,只有对顶点和片段着色器有可编程控制权,其他一律不可编程。如下图:
刘盼
2018/07/26
3.1K0
GPU渲染之OpenGL的GPU管线
Unity通用渲染管线(URP)系列(十五)——粒子(Color and Depth Textures)
这是有关创建自定义脚本渲染管线的系列教程的第15部分。我们将基于颜色和深度纹理来创建基于深度的淡入和扭曲粒子。
放牛的星星
2021/01/11
4.9K0
Unity通用渲染管线(URP)系列(十五)——粒子(Color and Depth Textures)
OpenGL学习笔记 (一)- 综述、渲染管线
最近写的程序需要使用很多OpenGL的API,但是我对OpenGL的认识就停留在多年前写Minecraft模组时的简单了解。因此借此机会打算系统的学习一遍OpenGL,浅窥计算机图形学一隅。由于本学习笔记只是记录个人的学习过程,因此内容会有一定偏向性,并且也难免有错漏,还请各路大神不吝赐教。同时不建议以这系列文章作为初学材料,若是初学建议看更专业、全面的书籍。另外,本文虽不要求有计算机图形学基础,但是需要有一定的数学基础(主要是线性代数),过于基础的数学不会展开描述。
KAAAsS
2022/01/14
1.7K0
OpenGL学习笔记 (一)- 综述、渲染管线
音视频技术基础(四)-- OpenGL
既然是学习音视频技术,那必然少不了渲染这个环节,OpenGL就是进行图形渲染的一个重要角色。
黑眼圈云豆
2020/07/10
2K0
浅谈 GPU图形固定渲染管线
图形渲染管道被认为是实时图形渲染的核心,简称为管道。管道的主要功能是由给定的虚拟摄像机、三维物体、灯源、光照模型、纹理贴图或其他来产生或渲染一个二维图像。由此可见,渲染管线是实时渲染技术的底层工具。图像中物体的位置及形状是通过它们的几何描述、环境特征、以及该环境中虚拟摄像机的摆放位置来决定的。物体的外观受到了材质属性、灯源、贴图以及渲染模式(sharding modles)的影响。
Tencent JCoder
2018/07/19
2.6K0
相关推荐
三维图形渲染显示的全过程
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档