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 → 修改部分
相关推荐
Ai-_Man1 小时前
您您这可以把Grok的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑
liangshanbo12152 小时前
JavaScript 异步核心主线
javascript·事件循环·异步操作
传人once3 小时前
悬停旋转放大和位移效果如何写
javascript·css·动画
默_笙4 小时前
🍔 中间件不只是打日志:四个钩子、一次短路,和自带的工具
前端·javascript
Dovis(誓平步青云)5 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
xieter6 小时前
【技术精选】TypeScript 高级类型体操:条件类型与模板字面量深度剖析 (2026-10-06)
javascript
ss2736 小时前
AI全栈实战 | 3.3-02 Python 并发:有 GIL 为什么还用多线程,asyncio 和 JS 事件循环同源不同味
开发语言·javascript·python
CappuccinoRose7 小时前
输入事件进阶
前端·javascript·输入事件
500849 小时前
React Native for OpenHarmony 实战:三方库 react-native-url-polyfill 的鸿蒙化适配指南
javascript·react native·react.js·性能优化·electron·harmonyos
米多科技9 小时前
让 AI 走进我的 3D 世界:一个 MCP server 的完整实现
javascript