Cesium自定义着色器:分量修改与完全赋值

书接上文:

依照前面自定义着色器模式分为完全替换材质和修改原始材质,在举例是使用的分别是

ini 复制代码
material.diffuse = vec3(1.0, 0.0, 0.0);

material.diffuse.r += 0.3;

二者有啥区别:

这里就涉及整个向量单个分量概念

一、完全赋值-整个向量

  1. material.diffuse = vec3(1.0, 0.0, 0.0);
scss 复制代码
// 直接覆盖整个漫反射颜色
material.diffuse = vec3(1.0, 0.0, 0.0); // 纯红色
  • 无论原始颜色是什么,现在都变成纯红色
  • RGB三个通道全部被覆盖
  • 丢失所有原始颜色信息

二、分量修改

  1. material.diffuse.r += 0.3;
arduino 复制代码
// 只修改红色分量,其他分量保持不变
material.diffuse.r += 0.3; // 红色分量增加0.3
  • 只修改红色通道
  • 绿色和蓝色通道保持原始值
  • 保留原始颜色的基础上进行调整

三、两种写法可以相互转换:

ini 复制代码
// 分量修改等价于:
material.diffuse = vec3(
    material.diffuse.r + 0.3,  // 红色增加
    material.diffuse.g,        // 绿色不变
    material.diffuse.b         // 蓝色不变
);

// 完全赋值可以看作:
material.diffuse.r = 1.0;
material.diffuse.g = 0.0; 
material.diffuse.b = 0.0;

四、使用场景对比

(一) 完全赋值适合:

scss 复制代码
// 1. 创建全新的颜色效果
material.diffuse = vec3(sin(u_time), 0.5, 0.8);

// 2. 程序化生成的材质
material.diffuse = calculateProceduralColor();

// 3. 完全替换原始纹理

(二) 分量修改适合:

当使用 MODIFY_MATERIAL 模式时,分量修改特别有用:

arduino 复制代码
// 1. 颜色校正
material.diffuse.r *= 1.2;  // 增强红色
material.diffuse.g -= 0.1;  // 减少绿色

// 2. 添加色调
material.diffuse.r += 0.1;  // 添加红色调

// 3. 亮度调整(同时修改所有分量)
material.diffuse.rgb += 0.2; // 整体变亮

所以,如果你想要把白膜的颜色改成蓝绿色,只需要设置成完全赋值即可

ini 复制代码
   let customShader = new Cesium.CustomShader({
    
    mode: Cesium.CustomShaderMode.REPLACE_MATERIAL, //替换材质
    //片元着色器
    fragmentShaderText: `
      void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material){
        material.diffuse = vec3(0.0, 1.0, 0.5);
        material.alpha = 0.3;
      
      }
    `,
})

效果

五、总结

特性 完全赋值 分量修改
操作对象 整个向量 单个分量
原始数据 完全丢失 部分保留
使用场景 创建新材质 调整现有材质
模式偏好 REPLACE_MATERIAL MODIFY_MATERIAL

简单记法:

  • = → 替换全部
  • .r/.g/.b → 修改部分
相关推荐
mCell6 小时前
Lua 编程入门:从基础语法到元表
javascript·算法·lua
伟大的兔神6 小时前
我做了一个本地优先的 AI 图片工作台:Loomora v1.0.0 正式发布
前端·javascript·vue.js
fangzhanpeng1689 小时前
(前端)2.js变量作用域样例
开发语言·前端·javascript
码艺-Alimjan11 小时前
Vue项目源码备份最佳实践:无视node_modules,打包体积仅2MB
前端·javascript·vue.js
xixiaoyunya12 小时前
JavaScript 异步编程全解析:从回调地狱到 async/await 的演进之路
开发语言·javascript·ecmascript
张元清12 小时前
React useScrollLock Hook:为弹窗锁住页面滚动 (2026)
javascript·react.js
Sayai12 小时前
【无标题】ECharts 实现日志量异常检测:基线 ±Kσ 基带 + 灵敏度切换(Vue2 实战)
前端·javascript·echarts
默_笙13 小时前
💌 为了把"主题色"传给孙子组件,我翻了五层楼——直到遇见了 useContext
前端·javascript
小KK_14 小时前
JS 事件循环从小白视角入门:宏任务、微任务与 async/await 一网打尽
前端·javascript
kisshyshy15 小时前
从 useRef 到 Web Worker:理解 React 可变对象与浏览器多线程
前端·javascript·react.js