cesium FBO(四)自定义相机渲染到Canvas(离屏渲染)

前面几节的例子是将Cesium默认的相机渲染到纹理(RTT)或Canvas,这片文章讲解如何将自定义的一个camera的画面渲染到Canvas上,有了前面几篇的基础了,也能将自定义的画面渲染纹理、也可以灰度处理,原理是一样的。

一、效果

左上一是渲染到Canvas(灰度处理)的画面,右上一是渲染到Canvas正常画面,左下一是渲染到纹理的画面,右下一是自定义的camera视锥体。

二、实现

实现的原理还是基于第一篇的阐述的原理,主要分为以下步骤:

1.创建FBO

2.创建相机

3.将相机内容渲染到FBO

4.将FBO绘制到Canvas

通过前面几篇文章的讲解,其中1、4环节我们已经很熟悉了,这里说明一下2和3。

1)创建相机
    createFboCamera(scene) {let camera = new Cesium.Camera(scene);camera.setView({destination: Cesium.Cartesian3.fromDegrees(126.30158892175582, 35.02368795804565, 200000),orientation: {heading: Cesium.Math.toRadians(0.0), // 航向角,转换为弧度pitch: Cesium.Math.toRadians(-45),     // 俯仰角,转换为弧度  roll: Cesium.Math.toRadians(0.0),       // 翻滚角,转换为弧度}})//这里采用透视投影camera.frustum = new Cesium.PerspectiveFrustum({fov: Cesium.Math.toRadians(60),              // 视场角aspectRatio: 1, // 宽高比near: 1,            // 近裁剪面far: 500000               // 远裁剪面});let primitive = new Cesium.DebugCameraPrimitive({camera: camera,color: Cesium.Color.RED,show: true,});scene.primitives.add(primitive);return camera;}
2)将相机内容渲染到FBO

核心的思路是将场景默认的相机替换成自定义的相机,等渲染完成后再替换回来。主场景已经有一个事件循序在渲染了,我们再加一个势必会影响到性能。

cameraRenderToFbo(fbo, scene, fboCamera) {// 保存原始相机,并将fbo相机设置为当前相机let camera = scene._defaultView.camera;scene._defaultView.camera = fboCamera;// 获取场景的帧状态、WebGL上下文和uniform状态const frameState = scene._frameState;const context = scene.context;const us = context.uniformState;// 设置默认视图const view = scene._defaultView;scene._view = view;// 更新场景帧状态scene.updateFrameState();// 设置3DTiles渲染通道状态const renderTilesetPassState = Cesium.Cesium3DTilePass.getPassOptions(Cesium.Cesium3DTilePass.RENDER);frameState.passes.render = true;frameState.passes.postProcess = scene.postProcessStages.hasSelected;frameState.tilesetPassState = renderTilesetPassState;// 设置背景颜色,如果不是HDR模式需要进行gamma校正let backgroundColor = Cesium.defaultValue(scene.backgroundColor, Cesium.Color.BLACK);let scratchBackgroundColor = new Cesium.Color();if (!scene._hdr) {backgroundColor = Cesium.Color.clone(backgroundColor, scratchBackgroundColor);backgroundColor.red = Math.pow(backgroundColor.red, scene.gamma);backgroundColor.green = Math.pow(backgroundColor.green, scene.gamma);backgroundColor.blue = Math.pow(backgroundColor.blue, scene.gamma);}frameState.backgroundColor = backgroundColor;// 更新大气和雾效果frameState.atmosphere = scene.atmosphere;scene.fog.update(frameState);// 更新uniform状态us.update(frameState);// 处理阴影贴图const shadowMap = scene.shadowMap;if (Cesium.defined(shadowMap) && shadowMap.enabled) {if (!Cesium.defined(scene.light) || scene.light instanceof Cesium.SunLight) {// 将太阳方向取反,使其从太阳射向场景Cesium.Cartesian3.negate(us.sunDirectionWC, scene._shadowMapCamera.direction);} else {Cesium.Cartesian3.clone(scene.light.direction, scene._shadowMapCamera.direction);}frameState.shadowMaps.push(shadowMap);}// 清空命令列表scene._computeCommandList.length = 0;scene._overlayCommandList.length = 0;// 设置视口尺寸const viewport = view.viewport;viewport.x = 0;viewport.y = 0;viewport.width = context.drawingBufferWidth;viewport.height = context.drawingBufferHeight;// 设置通道状态const passState = view.passState;passState.framebuffer = fbo;passState.blendingEnabled = undefined;passState.scissorTest = undefined;passState.viewport = Cesium.BoundingRectangle.clone(viewport, passState.viewport);// 更新并执行渲染scene.updateEnvironment();scene.updateAndExecuteCommands(passState, backgroundColor);scene.resolveFramebuffers(passState);// 清理状态passState.framebuffer = undefined;context.endFrame();// 恢复原始相机和地球显示scene._defaultView.camera = camera;scene.globe.show = true;}

 好啦,关于Cesium的FBO的话题暂时搞一段了,请各位老铁点个赞,评个论啥的,感谢。

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

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

相关文章

双机并联无功环流抑制虚拟阻抗VSG控制【simulink仿真模型实现】

双机并联虚拟同步发电机(VSG)系统中,因线路阻抗不匹配及参数差异,易引发无功环流。本方案在传统VSG控制基础上,引入自适应虚拟阻抗环节。其核心在于:实时检测两机间无功环流分量,据此动态调节各…

python测试总结

测试题的基础知识点总结 1.循环求和 for循环步长(range(2,101,2)) while循环条件判断(i%20) 生成器表达式(sum(i for i in range )) 所以:sum(range(1,101,2))(奇数和)和…

识别和分类恶意软件样本的工具YARA

YARA 是一个用于识别和分类恶意软件样本的工具,广泛应用于恶意软件分析、威胁情报、入侵检测等领域。它通过编写规则(YARA Rules)来匹配文件中的特定字符串、十六进制模式、正则表达式等特征。 一、YARA 的基本使用方法 1. 安装 YARA Linux(Ubuntu/Debian) sudo apt-ge…

GaussDB 约束的语法

1 约束的作用约束是作用于数据表中列上的规则,用于限制表中数据的类型。约束的存在保证了数据库中数据的精确性和可靠性。约束有列级和表级之分,列级约束作用于单一的列,而表级约束作用于整张数据表。下面是 GaussDB SQL 中常用的约束。NOT …

SecurityContextHolder 管理安全上下文的核心组件详解

SecurityContextHolder 管理安全上下文的核心组件详解在 Spring Security 中,SecurityContextHolder 是​​安全上下文(Security Context)的核心存储容器​​,其核心作用是​​在当前线程中保存当前用户的认证信息(如用…

c++详解系列(引用指针)

目录 1.什么是引用 2.引用的定义 3.引用的特性 4.引用的使用 4.1引用传参 4.2传引用返回 5.const引用(在引用的定义前用const修饰) 5.1对于引用 5.2对于指针 6.引用&指针 总结 1.什么是引用 引用就是给变量起别名,一个变量可以…

深度学习loss总结(二)

对于目前深度学习主流任务学习,loss的设置至关重要。下面就不同任务的loss设置进行如下总结: (1)目标检测 2D/3D目标检测中的 Loss(损失函数)是训练模型时优化目标的核心,通常包括位置、类别、尺寸、方向等多个方面。以下是目前 常见的 2D 和 3D 目标检测 Loss 分类与…

【Linux网络】netstat 的 -anptu 各个参数各自表示什么意思?

netstat 是一个网络统计工具,它可以显示网络连接、路由表、接口统计、伪装连接和多播成员资格。在 netstat 命令中,不同的参数可以用来定制输出的内容。 你提到的 -anptu 参数组合各自的功能如下: -a (all): 显示所有活动的连接和监听端口。它…

[硬件电路-115]:模拟电路 - 信号处理电路 - 功能放大器工作分类、工作原理、常见芯片

功能放大器是以特定功能为核心的集成化放大电路,通过将运算放大器与外围电阻、电容等元件集成在单一芯片中,实现标准化、高性能的信号放大功能。其核心优势在于简化设计流程、提升系统稳定性,并针对特定应用场景优化性能参数。以下从定义、分…

双网卡UDP广播通信机制详解

UDP广播通信机制详解 一、通信流程分析 发送阶段 通过Client.Bind(192.168.0.3, 60000)将UDP套接字绑定到指定网卡和端口设置RemoteHost "255.255.255.255"实现全网段广播数据流向:192.168.0.3:60000 → 255.255.255.255:50000 接收阶段 设备响应数据应返…

从遮挡难题到精准测量:激光频率梳技术如何实现深孔 3D 轮廓的 2um 级重复精度?

一、深孔 3D 轮廓测量的遮挡困境深孔结构(如航空发动机燃油喷嘴孔、模具冷却孔)因孔深大(常超 100mm)、深径比高(>10:1),其 3D 轮廓测量长期受限于光学遮挡难题。传统光学测量技术&a…

.NET 依赖注入(DI)全面解析

文章目录一、依赖注入核心原理1. 控制反转(IoC)与DI关系2. .NET DI核心组件二、服务生命周期1. 三种生命周期类型三、DI容器实现原理1. 服务注册流程2. 服务解析流程四、高级实现方法1. 工厂模式注册2. 泛型服务注册3. 多实现解决方案五、ASP.NET Core中的DI集成1. 控制器注入2…

K8S部署ELK(二):部署Kafka消息队列

目录 1. Kafka 简介 1.1 Kafka 核心概念 (1)消息系统 vs. 流处理平台 (2)核心组件 1.2 Kafka 核心特性 (1)高吞吐 & 低延迟 (2)持久化存储 (3)分…

Rust进阶-part1-智能指针概述-box指针

Rust进阶[part1]_智能指针概述&box指针 智能指针概述 在Rust中,智能指针是一类特殊的数据结构,它们不仅像普通指针一样可以引用数据,还带有额外的元数据和功能。与普通指针不同,智能指针通常使用结构体实现,并且会实现 Deref 和 Drop 等特定的trait,以提供更强大的…

C++扩展 --- 并发支持库(补充1)

C扩展 --- 并发支持库(下)https://blog.csdn.net/Small_entreprene/article/details/149606406?fromshareblogdetail&sharetypeblogdetail&sharerId149606406&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link atom…

在Three.js中导入和添加自定义网格的最佳实践 - 综合指南

探索在Three.js中导入和添加自定义网格的最佳实践。本指南涵盖增强 3D 项目的技术、技巧和实际示例。 添加图片注释,不超过 140 字(可选) 强烈建议使用 GLTF 格式来集成 3D 几何体,提供简化的流程,并固有地支持动画、…

Redis知识点(1)

目录 Redis Redis和MySQL的区别 Redis的高可用方案 Redis可以用来做什么 Redis的数据类型 字符串 列表 哈希 集合 有序集合 Bitmap Redis为什么快呢? I/O多路复用 说说select,poll,epoll,kqueue,IOCP的区别 Redis为什么早期选择单线程? …

使用iptables封禁恶意ip异常请求

查看后端日志发现一IP(103.76.250.29)频繁请求不存在的资源路径​​(如 /api/v1/guest/comm/config、/theme/default/assets/compoments.js 等),并伴随对根路径 / 的正常访问。这种行为的可能性包括恶意扫描、自动化工…

BehaviorTree.Ros2 编译教程

1. 源码下载 git clone https://github.com/BehaviorTree/BehaviorTree.ROS2.git2. 编译过程 源码中有3个项目: btcpp_ros2_interfacesbtcpp_ros2_interfacesbtcpp_ros2_samples 2.1 编译btcpp_ros2_interfaces: colcon --packages-select btcpp_ros2_interfaces2.2 编译 …

AR智能巡检系统:制造业设备管理的效率革新

随着工业4.0和数字化转型的加速,设备管理在制造业、能源、交通等关键领域的重要性愈发凸显。传统设备巡检依赖人工记录和纸质报告,不仅效率低下,还容易因人为疏忽导致数据错误或安全隐患。然而,增强现实(AR www.teamhe…