浅聊Cesium.js 后处理原理

浅聊Cesium.js 后处理原理

使用例子:

const stages = viewer.scene.postProcessStages;

const silhouette = Cesium.PostProcessStageLibrary.createSilhouetteStage()
silhouette.enabled = true;
stages.add(silhouette);

silhouette.uniforms.color = Cesium.Color.LIME;

涉及到相关类的关系:
请添加图片描述

0、整体流程

两步: 更新和执行.

function updateAndClearFramebuffers() {
  // ...

  const postProcess: PostProcessStageCollection = scene.postProcessStages;
  postProcess.update();
  postProcess.clear();
  // ...
}
Scene.prototype.resolveFramebuffers() {
  // ...
  const postProcess: PostProcessStageCollection = scene.postProcessStages;

  // 执行后处理渲染
  postProcess.execute();

  // 将结果输出到屏幕
  postProcess.copy();

  // ...
}

1、PostProcessStageCollection

PostProcessStageCollection

PostProcessStageCollection 是一个用于管理后处理阶段的集合类。主要作用和功能如下:

  • 阶段管理:
    以集合的方式管理多个后处理阶段。通常,一个后处理效果可能需要多个阶段的处理,例如先进行图像模糊,然后再应用色调映射。

  • 顺序控制:
    允许定义后处理阶段的执行顺序。通过调整阶段在集合中的顺序,可以控制它们的执行顺序。例如,如果需要先进行亮度调整,再进行颜色校正,可以通过调整阶段的顺序来实现。

  • 功能扩展:
    允许自定义后处理阶段,并将其添加到集合中。

PostProcessStageCollection
  ┣ _ao: PostProcessStageComposite
  ┣ _bloom: PostProcessStageComposite
  ┣ _fxaa: PostProcessStage
  ┣ _autoExposure: AutoExposure
  ┣ _textureCache: PostProcessStageTextureCache
  ┃
  ┣ add()update()
PostProcessStageCollection.prototype.update() {
  // ...
  this._textureCache.updateDependencies();
  this._textureCache.update(context);

  stages[i].update(context, useLogDepth);
  // ...
}

PostProcessStageCollection.prototype.execute() {
  // ...
  execute()
  // ...
}

2、PostProcessStage

PostProcessStage 是后处理阶段的基本单元,用于实现具体的图像处理效果。它是在渲染管线中的最后阶段之一,用于对场景渲染结果进行进一步处理和改善。

PostProcessStage
  ┣ _uniforms: Object
  ┣ _fragmentShader: string
  ┣ _passState: PassState
  ┣ _sampler: Sampler
  ┣ _command: DrawCommand
  ┃
  ┣ outputTexture: Texture
  ┣ _clearColor: Color
  ┣ _pixelFormat: PixelFormat
  ┣ _pixelDatatype: PixelDatatype
  ┃
  ┣ update()execute()destroy()
PostProcessStage.prototype.update() {
  // ...
  createUniformMap()
  updateUniformTextures()
  createDrawCommand()
  createSampler()
  // ...
}
PostProcessStage.prototype.execute() {
  // ...
  this._command.execute();
  // ...
}

3、PostProcessStageTextureCache

PostProcessStageTextureCache 是一个用于缓存后处理阶段纹理的工具。

后处理阶段通常需要使用中间纹理来存储和处理图像数据。PostProcessStageTextureCache 提供了一个管理这些中间纹理的机制,以提高效率和性能。

PostProcessStageTextureCache
  ┃
  ┣ _collection: PostProcessStageCollection
  ┣ _framebuffers: []
  ┣ _stageNameToFramebuffer: []
  ┣ _width: number
  ┣ _height: number
  ┣ _updateDependencies: boolean
  ┃
  ┣ update()clear()getStageByName()getOutputTexture()getFramebuffer()isDestroyed()destroy()updateDependencies()
PostProcessStageTextureCache.prototype.update() {
  // ...
  if (updateDependencies) {
    releaseResources(this);
  }

  if (this._framebuffers.length === 0) {
    createFramebuffers(this, context);
  }
  // ...
}

4、PostProcessStageComposite

PostProcessStageComposite是一个后处理阶段的组合器,用于将多个后处理阶段组合成一个整体的后处理效果。它提供了一种将多个处理阶段串联或并行执行的机制,以实现复杂的后处理效果。

5、PostProcessStageLibrary

各种后处理的实现代码集合。

PostProcessStageLibrary
  ┣ createBlurStage() // 高斯模糊createDepthOfFieldStage() // 景深createEdgeDetectionStage() // 检测边缘createSilhouetteStage() // 轮廓createBlackAndWhiteStage() // 黑白渐变渲染createNightVisionStage() // 夜视效果createLensFlareStage() // 镜头眩光
  ┃
  ┣ createAmbientOcclusionStage() // 环境光遮挡createFXAAStage() // 抗锯齿createAcesTonemappingStage()createFilmicTonemappingStage()createReinhardTonemappingStage()createModifiedReinhardTonemappingStage()createAutoExposureStage()createBrightnessStage()createBloomStage()createDepthViewStage()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OSPF作业3

题目 地址配置 R1: R2: R3: R4: R5: R6: R7: R8: R9: R10: R11: R12: 私网通及LSDB优化 R1: ospf 1 router-id 1.1.1.1 …

关于Godot游戏引擎制作流水灯

先上核心代码 游戏节点 流水灯的通途可以是 1. 装饰 2. 音乐类多媒体程序(如FL中TB-303的步进灯) FL Studio Transistor Bass

STM32基础入门学习笔记:内部高级功能应用

文章目录: 一:低功耗模式 1.睡眠模式测试程序 NVIC.h NVIC.c key.h key.c main.c 2.停机模式测试程序 main.c 3.待机模式测试程序 main.c 二:看门狗 1.独立看门狗测试程序 iwdg.h iwdg.c main.c 2.窗口看门狗测试程序 wwdg…

深入理解缓存 TLB 原理

今天分享一篇TLB的好文章,希望大家夯实基本功,让我们一起深入理解计算机系统。 TLB 是 translation lookaside buffer 的简称。首先,我们知道 MMU 的作用是把虚拟地址转换成物理地址。 MMU工作原理 虚拟地址和物理地址的映射关系存储在页表…

Go语音介绍

Go语言介绍 Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言。 Go是静态强类型语言,是区别于解析型语言的编译型语言。 解析型语言——源代码是先翻译为中间代码,然后由解析器对代码进行解释执行。 编译型语言——源代码编…

20230807通过ffmpeg将DTS编码的AUDIO音频转换为AAC编码

20230807通过ffmpeg将DTS编码的AUDIO音频转换为AAC编码 2023/8/7 20:04 ffmpeg dts 转AAC 缘起:由于网上找的电影没有中文字幕,有内置的英文字幕,但是还是通过剪映/RP2023识别一份英文字幕备用! I:\Downloads\2005[红眼航班]Red E…

【C++】Lambda表达式的使用

学习目标: 例如: 了解Lambda的优点 掌握Lambda表达式的使用 了解Lambda表达式的底层原理 学习内容: Lambda表达式的语法 文章目录 学习目标:学习内容:Lambda表达式排序案例Lambda表达式语法捕捉列表Lambda表达式模拟…

【Java设计模式】建造者模式 注解@Builder

概念 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。它使将一个复杂的对象分解成多个简单的对象,然后一步步构建而成。 每一个具体建造者都相对独立,而与其它的具体建造者无关,因此可以很方便地替换具…

深度学习论文: RepViT: Revisiting Mobile CNN From ViT Perspective及其PyTorch实现

深度学习论文: RepViT: Revisiting Mobile CNN From ViT Perspective及其PyTorch实现 RepViT: Revisiting Mobile CNN From ViT Perspective PDF: https://arxiv.org/pdf/2307.09283.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://gith…

【并发专题】单例模式的线程安全(进阶理解篇)

目录 背景前置知识类加载运行全过程 单例模式的实现方式一、饿汉式基本介绍源码分析 二、懒汉式基本介绍源码分析改进 三、懒汉式单例终极解决方案(静态内部类)(推荐使用方案)基本介绍源码分析 感谢 背景 最近学习了JVM之后&…

Permute 3 for mac音视频格式转换

Permute是一款Mac平台上的媒体格式转换软件,由Chaotic Software开发。它可以帮助用户快速地将各种音频、视频和图像文件转换成所需格式,并提供了一些常用工具以便于用户进行编辑和处理。 Permute的主要特点包括: - 支持大量格式:支…

2020年09月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题 第1题 Python自带的编程环境是? A:PyScripter B:Spyder C:Notepad D:IDLE 正确的答案是:D Python自带的编程环境是IDLE(Integrated Development and Learning Environment&a…

【c语言初级】c++基础

文章目录 1. C关键字2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.2 C函数重载的原理--名字修饰采用C语言编译器编译后结果 1. C关键字 C是在C的基础之上,容纳进去了面向对象编程思想…

【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、讲解 💥1 概述 由于能源的日益匮乏,电力需求的不断增长等,配电网中分布式能源渗透率不断提高,且逐渐向主动配电网方…

Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP

一对一音视频通话使用场景 一对一音视频通话都需要稳定、清晰和流畅,以确保良好的用户体验,常用的使用场景如下: 社交应用:社交应用是一种常见的使用场景,用户可以通过音视频通话进行面对面的交流;在线教…

OLAP ModelKit Crack,ADO.NET和IList

OLAP ModelKit Crack,ADO.NET和IList OLAP ModelKit是一个多功能的.NET OLAP组件,用C#编写,只包含100%托管代码。它具有XP主题的外观,并能够使用任何.NET数据源(ADO.NET和IList)。借助任何第三方组件(尤其是图表组件)呈现数据的能力扩展了产品…

Pytorch深度学习-----损失函数(L1Loss、MSELoss、CrossEntropyLoss)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Co…

【Hystrix技术指南】(5)Command创建和执行实现

创建流程 构建HystrixCommand或者HystrixObservableCommand对象 *使用Hystrix的第一步是创建一个HystrixCommand或者HystrixObservableCommand对象来表示你需要发给依赖服务的请求。 若只期望依赖服务每次返回单一的回应,按如下方式构造一个HystrixCommand即可&a…

24届近5年江南大学自动化考研院校分析

今天给大家带来的是江南大学控制考研分析 满满干货~还不快快点赞收藏 一、江南大学 学校简介 江南大学(Jiangnan University)是国家“双一流”建设高校,“211工程”、“985工程优势学科创新平台”重点建设高校,入选…

【linux源码学习】【实验篇】使用bochs运行linux0.11系统(搭建一个自己的工作站)

目录 背景资源获取bochs环境搭建windowsbochs环境搭建linux声明 背景 最近看赵炯老师的《linux内核完全注释》,然后在最后一个习题里面看到使用bochs跑一下0.11的内核代码,本来觉得很难,但是如果做过一遍就会发现其实很简单,这个…