WebGL学习-czm_getMaterial详解

czm_getMaterial 详解

czm_getMaterial 是 Cesium 渲染引擎中材质系统的核心函数,专门用于从片元着色器(Fragment Shader)中获取当前几何体的材质属性(如颜色、纹理、透明度、高光等),是 Cesium 自定义材质/着色器开发的高频API。

一、核心作用

Cesium 的材质渲染基于「材质对象 + 着色器」的组合模式:

  • 材质对象(Material)定义了颜色、纹理、参数等数据;
  • czm_getMaterial 作为着色器内置函数,负责将这些数据传递到片元着色器中,供片元级别的颜色计算、纹理采样等操作使用。
二、基本用法

czm_getMaterial 必须在 Cesium 的片元着色器中调用,返回一个 czm_material 结构体(Cesium 预定义的材质数据结构)。

1. 最简示例(自定义纯色材质)

以下是一个完整的自定义材质示例,通过 czm_getMaterial 获取材质并修改片元颜色:

glsl 复制代码
// Cesium 片元着色器(Fragment Shader)
void main() {
    // 1. 获取当前材质(核心调用)
    czm_material material = czm_getMaterial(vec4(1.0)); // 参数为默认片元颜色(rgba)
    
    // 2. 使用材质属性计算最终颜色
    // material.diffuse:漫反射颜色(材质的基础颜色)
    // material.alpha:透明度
    gl_FragColor = vec4(material.diffuse, material.alpha);
}
2. 结合纹理的示例

如果材质包含纹理,czm_getMaterial 会自动关联纹理采样结果:

glsl 复制代码
void main() {
    // 获取材质(包含纹理数据)
    czm_material material = czm_getMaterial(gl_FragColor);
    
    // 采样纹理(material.diffuse 已包含纹理颜色)
    vec3 finalColor = material.diffuse * material.emission; // 漫反射 + 自发光
    gl_FragColor = vec4(finalColor, material.alpha);
}
三、czm_material 结构体(返回值)

czm_getMaterial 返回的 czm_material 包含以下核心属性(常用):

属性名 类型 说明
diffuse vec3 漫反射颜色(基础颜色/纹理采样结果)
specular vec3 高光颜色
shininess float 高光强度(值越大,高光区域越小)
alpha float 透明度(0=完全透明,1=完全不透明)
emission vec3 自发光颜色(不受光照影响)
normal vec3 法线向量(用于法线贴图/凹凸效果)
四、实际开发场景(自定义材质)

以下是完整的 Cesium 代码示例,通过 czm_getMaterial 实现自定义渐变材质:

javascript 复制代码
// 初始化Cesium Viewer
const viewer = new Cesium.Viewer("cesiumContainer", {
  terrainProvider: Cesium.createWorldTerrain(),
});

// 定义自定义材质的着色器源码
const customMaterialSource = `
  uniform vec3 colorStart;
  uniform vec3 colorEnd;
  
  czm_material czm_getMaterial(czm_materialInput materialInput) {
    // 初始化材质
    czm_material material = czm_getDefaultMaterial(materialInput);
    
    // 基于片元的纹理坐标(v_textureCoordinates)实现渐变
    float t = materialInput.st.t; // 取纹理坐标的t分量(0~1)
    material.diffuse = mix(colorStart, colorEnd, t); // 颜色插值
    material.alpha = 0.8; // 设置透明度
    
    return material;
  }
`;

// 创建自定义材质
const customMaterial = new Cesium.Material({
  fabric: {
    type: "CustomGradient",
    uniforms: {
      colorStart: Cesium.Color.RED.rgb, // 渐变起始色(红)
      colorEnd: Cesium.Color.BLUE.rgb,  // 渐变结束色(蓝)
    },
    source: customMaterialSource, // 着色器源码
  },
});

// 创建一个矩形几何体并应用自定义材质
viewer.entities.add({
  rectangle: {
    coordinates: Cesium.Rectangle.fromDegrees(100, 30, 120, 40), // 经纬度范围
    material: customMaterial, // 应用自定义材质
    height: 10000, // 高度(10km)
  },
});

// 视角定位到几何体
viewer.camera.flyTo({
  destination: Cesium.Cartesian3.fromDegrees(110, 35, 200000),
});
五、注意事项
  1. czm_getMaterial 只能在 Cesium 的片元着色器中调用,顶点着色器中不可用;
  2. 调用时通常需要先通过 czm_getDefaultMaterial(materialInput) 初始化默认材质,再修改属性;
  3. 材质输入参数 materialInput 包含片元的纹理坐标(st)、法线(normalEC)等关键数据,可用于复杂计算;
  4. 自定义材质时,需遵循 Cesium 的 fabric 材质规范(通过 uniforms 传递外部参数)。

总结

  1. czm_getMaterial 是 Cesium 片元着色器中获取材质属性的核心函数,返回包含漫反射、高光、透明度等的 czm_material 结构体;
  2. 核心用途是将 Cesium 材质对象的参数传递到着色器,实现自定义颜色、纹理、渐变等视觉效果;
  3. 开发时需结合 czm_getDefaultMaterial 初始化材质,并通过 materialInput 获取片元的纹理坐标、法线等数据实现复杂逻辑。
相关推荐
程序猿乐锅11 小时前
【Tilas|第三篇】多表SQL语句
数据库·经验分享·笔记·学习·mysql
徐某人..11 小时前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
AOwhisky11 小时前
Kubernetes 学习笔记:集群管理、命名空间与 Pod 基础
linux·运维·笔记·学习·云原生·kubernetes
光影少年12 小时前
大屏页面,一次多个请求,请求加密导致 点击 全局时间选择器 时出现卡顿咋解决(面板收起会延迟1~2秒)
前端·javascript·vue.js·学习·前端框架·echarts·reactjs
sakiko_13 小时前
UIKit学习笔记2-组件嵌套、滚动视图等
笔记·学习·objective-c·swift·uikit
知识分享小能手13 小时前
R语言入门学习教程,从入门到精通,R语言类别比较数据可视化- 完整知识点与案例代码(4)
学习·信息可视化·r语言
蛋白界小百灵14 小时前
纳米抗体技术全解析:从文库构建到亲和力成熟的关键策略
经验分享·科技·学习·健康医疗·业界资讯·卡梅德生物
我是发哥哈14 小时前
主流AI框架生产环境性能对比:5大关键维度深度评测
大数据·人工智能·学习·机器学习·ai·chatgpt·ai-native
nashane14 小时前
HarmonyOS 6学习:RCP远场通信流式返回实战——告别“一次性”数据阻塞
学习·华为·harmonyos
for_ever_love__14 小时前
UI学习:UITableView的基本操作及折叠cell
学习·ui·ios