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 + Fabric source 字段 直接在 fabric 对象里写 需要复用、多材质组合
Appearance 手写 fragmentShaderSource 先 new 再挂 uniforms 快速特效、单个 Primitive 即用即扔

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


五、小结与预告

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

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

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

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

相关推荐
2601_9628601517 小时前
AI生成3D模型后还能继续编辑、贴图和绑定吗?从网格、材质到自动绑骨的处理流程
人工智能·3d·贴图
用户831348593069821 小时前
Cesium实现动态流动火烧云晚霞效果(可用slider调整火烧云浓度)
vue.js·webgl·cesium
IT爱学堂1 天前
Three.js可视化企业实战WEBGL课,2023年全新WEB 3D THREEJS技术
前端·javascript·webgl
破竹151 天前
OpenGL ES调试汇总
图形渲染·着色器
云飞云共享云桌面2 天前
智能装备工厂研发团队如何利用单台服务器承载 10 路 SolidWorks 并发?
运维·服务器·3d·自动化·制造
cuicuiniu5212 天前
3D图纸交付格式不对怎么办?如何快速进行3D格式转换?
3d·cad·cad看图·cad看图王
云飞云共享云桌面2 天前
机械企业三维设计优化:一台高性能 SolidWorks 服务器满足 10 人建模需求
运维·服务器·3d·自动化·负载均衡
智商偏低2 天前
attribute 与 uniform 本质区别(WebGL)
webgl
玖玥拾2 天前
Unity3D RPG 入门项目(十一)主角完整战斗、怪物自动刷新、四大类型技能系统
游戏·3d·unity·游戏引擎
CBX3 天前
Cesium 入门实战:GeoJSON 数据加载与地区边界可视化
cesium