当前位置: 首页 > news >正文

Cesium 后期处理教程

cesium后期处理 ·postProcessStage· ▶ 在线运行案例

  • 案例合集:三维可视化功能案例(threehub.cn)
  • 开源仓库github地址:https://github.com/z2586300277/three-cesium-examples
  • 400个案例代码:网盘链接

你将学到什么

  • Cesium PostProcessStage 全屏后期管线

效果说明

本案例演示cesium后期处理效果:Cesium后处理阶段示例,该示例演示了如何使用Cesium的后处理效果来增强场景视觉效果;核心用到 Cesium。建议先打开文首在线案例查看动态画面,再对照下方源码逐步理解。

核心概念

  • Viewer聚合 Scene、Camera、Clock 与渲染循环,是 Cesium 应用入口。
  • Entity面向点线面/模型/标签的高层 API;与 Primitive 相比更适合交互与属性驱动。
  • 阅读下方完整源码时,建议从init/load/animate三条主线入手,再深入 shader 与工具函数。

实现步骤

  • 创建 Viewer,配置地形/影像(若案例需要)并设置初始相机
  • requestAnimationFrame循环中更新状态并 render(Cesium 为viewer.render或自动渲染)
  • 代码要点

    import * as Cesium from 'cesium'

    import { GUI } from 'dat.gui';

    /**

    • Cesium后处理阶段示例
    • 该示例演示了如何使用Cesium的后处理效果来增强场景视觉效果
    • 包括FXAA、Bloom、SSAO、模糊、黑白、夜视、描边、景深和运动模糊等效果
    */

    // 获取Cesium容器元素 const box = document.getElementById('box')

    // 初始化Cesium Viewer const viewer = new Cesium.Viewer(box, { // 禁用动画控件(左下角仪表) animation: false, // 禁用图层选择器(右上角图层选择按钮) baseLayerPicker: false, // 设置基础影像图层为ArcGIS影像服务 baseLayer: Cesium.ImageryLayer.fromProviderAsync(Cesium.ArcGisMapServerImageryProvider.fromUrl('https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer')), // 禁用全屏按钮(右下角全屏选择按钮) fullscreenButton: false, // 禁用时间轴控件 timeline: false, // 禁用信息框 infoBox: false, })

    // 启用地形深度检测,使墙体能够贴合地形 viewer.scene.globe.depthTestAgainstTerrain = true // 隐藏Cesium Logo viewer._cesiumWidget._creditContainer.style.display = "none";

    // 获取后处理阶段集合 const stages = viewer.scene.postProcessStages; let myentity = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(113.5, 34.5, 0), model: { uri: HOST + '/files/model/car.glb', minimumPixelSize: 100, maximumScale: 300 } }) viewer.zoomTo(myentity) /**

    • 清空所有特效
    • 禁用内置特效并移除所有自定义后处理阶段
    */ function clearAll() { // 禁用内置的FXAA抗锯齿效果 stages.fxaa.enabled = false; // 禁用内置的Bloom辉光效果 stages.bloom.enabled = false; // 禁用内置的环境光遮蔽效果 stages.ambientOcclusion.enabled = false; // 移除所有自定义添加的后处理阶段 stages.removeAll(); }

    /**

    • 应用指定名称的滤镜效果
    • @param {string} name - 滤镜名称
    */ function applyFilter(name) { clearAll(); // 先清空所有特效 switch (name) { case 'fxaa': // 启用快速近似抗锯齿(FXAA)效果 stages.fxaa.enabled = true; break; case 'bloom': // 启用辉光(Bloom)效果 stages.bloom.enabled = true; // 设置对比度参数 stages.bloom.uniforms.contrast = 128; // 设置亮度参数 stages.bloom.uniforms.brightness = -0.3; break; case 'ssao': // 启用屏幕空间环境光遮蔽(SSAO)效果 stages.ambientOcclusion.enabled = true; // 设置遮蔽强度 stages.ambientOcclusion.uniforms.intensity = 1.5; break; case 'blur': // 添加高斯模糊后处理阶段 stages.add(Cesium.PostProcessStageLibrary.createBlurStage()); break; case 'bw': // 添加黑白滤镜后处理阶段 stages.add(Cesium.PostProcessStageLibrary.createBlackAndWhiteStage()); break; case 'nv': // 添加夜视效果后处理阶段 stages.add(Cesium.PostProcessStageLibrary.createNightVisionStage()); break; case 'sil': { // 添加描边效果后处理阶段 const sil = stages.add(Cesium.PostProcessStageLibrary.createSilhouetteStage()); // 设置描边颜色为黄色 sil.uniforms.color = Cesium.Color.YELLOW; // 这里可以 push 选中物体:sil.selected.push(entity); break; } case 'dof': { // 添加景深效果后处理阶段 const dof = stages.add(Cesium.PostProcessStageLibrary.createDepthOfFieldStage()); // 设置焦距距离 dof.uniforms.focalDistance = 200; // 设置景深参数 dof.uniforms.delta = 1.0; // 设置高斯模糊参数 dof.uniforms.sigma = 2.0; break; } case 'mb': { // 添加运动模糊后处理阶段 const mb = stages.add(Cesium.PostProcessStageLibrary.createMotionBlurStage()); // 设置模糊强度 mb.uniforms.intensity = 0.8; break; } case 'none': // 无滤镜效果,保持清空状态 break; } }

    // ==================== GUI控制 ====================

    /**

    • 定义图形绘制操作对象
    • 包含各种滤镜效果的触发函数
    • @namespace obj
    */ const obj = { '无滤镜': () => { applyFilter('none'); }, 'FXAA': () => { applyFilter('fxaa'); }, 'Bloom': () => { applyFilter('bloom'); }, 'SSAO': () => { applyFilter('ssao'); }, 'Blur': () => { applyFilter('blur'); }, '黑白': () => { applyFilter('bw'); }, '夜视': () => { applyFilter('nv'); }, '描边': () => { applyFilter('sil'); }, '景深': () => { applyFilter('dof'); }, '运动模糊': () => { applyFilter('mb'); } };

    /**

    • 创建GUI控制面板
    • @type {dat.GUI}
    */ const gui = new GUI(); // 将操作对象添加到GUI控制面板 for (const key in obj) gui.add(obj, key)

    // 默认应用无滤镜效果 applyFilter('none');

    完整源码:GitHub

    小结

    • 本文提供cesium后期处理完整 Cesium.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Cesium.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
http://www.cnnetsun.cn/news/3024450.html

相关文章:

  • UPX脱壳实战:从自动化工具到手动逆向的完整指南
  • 【亲测】HiBit Uninstaller:彻底卸载流氓软件的神器(附官网安装包)
  • Arduino ESP32离线安装包制作与部署全攻略
  • 女性肠道养护与全维度养生科普,莱香发酵膳食辅助调理知识分享
  • 5分钟学会无损视频剪辑:LosslessCut零画质损失完整指南
  • 路由---页面切换
  • 100个RPG Maker MV插件:零代码打造专业级游戏体验
  • 大厂Agent架构我拆了三遍,发现一人公司只需要3个文件(附模板)
  • 源头厂家优势凸显!无锡百瑞德TIG热丝堆焊设备厂家实力解读
  • 电动赛车BMS系统设计与LTC6813应用实践
  • 用友NC psnImage/download接口SQL注入漏洞复现与防御分析
  • 2026不想996?这些外企、券商的技术岗校招正在偷偷抢人
  • 2026年国内GEO培训机构双师资深度拆解:为什么双讲师实战授课,落地成功率远超单理论讲师体系
  • 智能车竞赛光电组电调系统优化实践
  • 深度解析OpenSpeedy:重新定义游戏时间操控的技术革命
  • 如何修复“您的 IP 地址已被封禁”的网络错误?
  • 市面上专业的CD3E膜蛋白供应商口碑
  • 智慧转型AI与AR的革命
  • 【教程】Altera Reset Release IP 的介绍与使用举例
  • IP-guard Webserver远程命令执行漏洞应急响应实战复盘
  • 如何诊断和修复Steam Achievement Manager成就数据加载异常问题
  • 亚马逊QA怎么做?Review留评与点赞运营技巧全面解析
  • 如何用Python三分钟搞定A股行情数据获取?mootdx技术深度解析
  • C++部署比Python再快15%,VLM推理的最后一公里
  • 山东诺亚创生带你了解人体“万能维修工”干细胞
  • 3分钟搞定抖音直播数据采集:零基础也能玩转的弹幕抓取神器
  • iOS OC 项目集成 C++ 算法库完整指南
  • PCB走线S21插损:从-1dB到-6dB,信号到底衰减了多少?
  • AI多模型统一调度如何破局?2026六大API中转与聚合平台技术横评与选型解析
  • 原神月之八版本时间 可以用手机远程玩原神吗