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

Cesium快速入门24:Appearance编写着色器修改外观

上一节课,我们只在Material里写着色器;今天把“魔爪”伸到Appearance——直接重写片元着色器,一样能让像素跳舞,而且套路更简单、更暴力。


一、Appearance 也能“手写着色器”

EllipsoidSurfaceAppearance本质上就是“官方帮你拼好”的顶点 + 片元代码。
只要你在构造参数里塞入自己的fragmentShaderSource,Cesium 会原封不动采用,不会再帮你插材质函数。
想纯色、想渐变、想动画,全由你一句话决定。


二、最小 DEMO:把 UV 当颜色

下面代码里,我们把v_st(也就是 UV)直接画成红绿渐变,连材质都不引:

const ellipsoidAppearance = new Cesium.EllipsoidSurfaceAppearance({ // material: rawMaterial, // 注释掉,完全不用 fragmentShaderSource: ` varying vec3 v_positionMC; varying vec3 v_positionEC; varying vec2 v_st; // 官方帮你传进来的 UV void main() { // 把 UV 的 x、y 当颜色,再补一个 1.0 给蓝色通道 gl_FragColor = vec4(v_st, 1.0, 1.0); } ` });

运行效果:矩形瞬间变成“红→绿”色卡,证明我们已完全接管像素。


三、想动画?先解决“怎么传 uniform”

在 Material 里写uniforms很顺手,可在 Appearance 里写fragmentShaderSource时,构造函数里并没有 uniforms 字段
正确姿势:

  1. 先 new 出对象;

  2. 再动态挂uniforms属性;

  3. 外部用 GSAP / requestAnimationFrame 随便改。

代码示范:

/* 1. new 对象 */ const ellipsoidAppearance = new Cesium.EllipsoidSurfaceAppearance({ fragmentShaderSource: ` varying vec2 v_st; uniform float uTime; // 外部传进来的时间 void main() { float strength = sin(v_st.x * 10.0 + uTime) * 0.5 + 0.5; // 0~1 呼吸 gl_FragColor = vec4(strength, 0.0, 0.0, 1.0); } ` }); /* 2. 事后挂 uniform 初始值 */ ellipsoidAppearance.uniforms = { uTime: 0.0 }; /* 3. GSAP 让它永远动 */ gsap.to(ellipsoidAppearance.uniforms, { uTime: 1.0, // 从 0 跑到 1 duration: 2.0, // 单程两秒 repeat: -1, // 无限循环 ease: 'linear' });

运行效果:红色条纹左右“呼吸”移动,像一条缓慢扫描的激光带。


四、两种“写着色器”路线对比

路线入口传 uniforms适合场景
Material + Fabricsource字段直接在 fabric 对象里写需要复用、多材质组合
Appearance 手写fragmentShaderSource先 new 再挂 uniforms快速特效、单个 Primitive 即用即扔

两条路都能改像素,谁方便用谁。


五、小结与预告

  • Appearance 可以直接fragmentShaderSource = '...',完全不用 Material。

  • uniforms 要“事后挂”,再用 GSAP 或帧循环去改。

  • 顶点着色器传来的v_stv_positionEC等 varying 变量,想怎么用就怎么用。

下节课,我们在这块“会呼吸的红布”上加圆遮罩、调透明度,一条完整的“雷达扫描圈”就成型了。

http://www.cnnetsun.cn/news/94933.html

相关文章:

  • vue3中computed计算属性和方法的区别
  • LobeChat国际社区动态:全球开发者共同维护
  • 基于STM32的水质检测系统设计与实现
  • Radm1n1ster CN
  • 重构智慧书-第18条:实力与实干
  • 读捍卫隐私08智能出行
  • 媒体专访实录:LobeChat创始人谈开源初心
  • 小喵播放器 1.1.2| 一款支持视频超分的播放器,支持网页视频以及B站番剧
  • LobeChat待办事项提取与提醒功能实现
  • LobeChat会话管理机制揭秘:让每一次对话都井然有序
  • JS利用分片技术实现大文件分块上传的性能优化?
  • HTML5配合AES加密实现大文件分块传输安全?
  • NPP 热带森林:墨西哥查梅拉,1982-1995 年,R1
  • WordPress粘贴微信公众号内容自动排版
  • 毕设 stm32与深度学习口罩佩戴检测系统(源码+硬件+论文)
  • 手机端AIDE安卓音乐播放器软件代码
  • 如何在 Windows 11/10 中启用IE浏览器?恢复 Internet Explorer 一键搞定,就这么简单!
  • Scholar Inbox 订阅最新学术进展至邮箱
  • D.二分查找-二分答案-求最小——1283. 使结果不超过阈值的最小除数
  • A.每日一题——3562. 折扣价交易股票的最大利润
  • 圣默思 Teledyne DalsaFilr SWIR相机
  • Go 语言结构
  • JavaScript for 循环详解
  • 5步搞定SillyTavern版本升级:告别烦恼的完整指南
  • 猫头虎AI开源分享:如何批量获取稀土掘金社区文章阅读量暨文章阅读量数据批量提取解决方案
  • DBO-RBF多变量回归预测 优化宽度+中心值+连接权值 (多输入单输出)Matlab代码
  • 亲测!WordPress网站接入聚合登录实践
  • 15、Mozilla模板系统:功能、构建与应用实践
  • Ofd2Pdf完整使用教程:5分钟掌握OFD转PDF的终极技巧
  • 毕业论文操作全流程:以营销类选题为例