首页
/ CesiumGS中自定义材质与外观的实践指南

CesiumGS中自定义材质与外观的实践指南

2025-05-17 01:13:00作者:薛曦旖Francesca

概述

在三维地理可视化领域,CesiumGS作为一款强大的开源JavaScript库,为开发者提供了丰富的功能来创建高性能的地理空间应用。其中,Material(材质)和MaterialAppearance(材质外观)系统是Cesium中实现自定义渲染效果的核心机制。本文将深入探讨如何通过这两个类实现GLSL着色器注入,为Primitive(图元)添加自定义视觉效果。

核心概念解析

1. Material系统

Material是Cesium中定义物体表面视觉特性的核心类,它通过Fabric规范来配置材质属性。Fabric规范允许开发者:

  • 定义材质类型(type)
  • 设置统一变量(uniforms)
  • 编写GLSL着色代码(source)
  • 配置其他材质参数(如translucent等)

2. MaterialAppearance类

MaterialAppearance继承自Appearance,专门用于处理材质化的外观表现。它提供了:

  • 顶点着色器和片段着色器的自定义能力
  • 材质与几何体的绑定机制
  • 光照和渲染状态的控制

实践案例:动态变色立方体

下面我们通过一个完整的示例,展示如何创建一个随时间动态变色的立方体。

1. 几何体创建

首先创建基础的立方体几何体:

const boxGeometry = Cesium.BoxGeometry.fromDimensions({
    dimensions: new Cesium.Cartesian3(25000.0, 25000.0, 25000.0)
});

const boxInstance = new Cesium.GeometryInstance({
    geometry: boxGeometry,
    modelMatrix: Cesium.Transforms.eastNorthUpToFixedFrame(
        Cesium.Cartesian3.fromDegrees(113, 33, 1250)
    ),
    attributes: {
        color: Cesium.ColorGeometryInstanceAttribute.fromColor(
            Cesium.Color.WHITE
        )
    }
});

2. 自定义材质实现

创建自定义材质,定义随时间变化的颜色效果:

const customMaterial = new Cesium.Material({
    translucent: false,
    fabric: {
        type: 'CustomBoxShader',
        uniforms: {
            time: 0.0,
        },
        source: `
            uniform float time;
            czm_material czm_getMaterial(czm_materialInput materialInput) {
                czm_material material = czm_getDefaultMaterial(materialInput);
                material.diffuse = vec3(1.0, 1.0, 0.0); 
                material.alpha = 1.0;
                return material;
            }`
    }
});

3. 材质外观配置

通过MaterialAppearance实现更复杂的着色器控制:

const appearance = new Cesium.MaterialAppearance({
    material: customMaterial,
    flat: false,
    faceForward: true,
    translucent: true,
    closed: true,
    vertexShaderSource: `
        in vec3 position3DHigh;
        in vec3 position3DLow;
        in vec3 normal;
        in vec2 st;
        in float batchId;
        out vec3 v_positionEC;
        out vec3 v_normalEC;
        out vec2 v_st;
        uniform float testAppUniform;
        void main() {
            vec4 p = czm_computePosition();
            v_positionEC = (czm_modelViewRelativeToEye * p).xyz * testAppUniform; 
            v_normalEC = czm_normal * normal; 
            v_st = st;
            gl_Position = czm_modelViewProjectionRelativeToEye * p;
        }`,
    fragmentShaderSource: `
        in vec3 v_positionEC;
        in vec3 v_normalEC;
        in vec2 v_st;
        uniform vec4 testAppColorUniform;
        void main() {
            vec3 positionToEyeEC = -v_positionEC;
            vec3 normalEC = normalize(v_normalEC);
            #ifdef FACE_FORWARD
                normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC);
            #endif
            czm_materialInput materialInput;
            materialInput.normalEC = normalEC;
            materialInput.positionToEyeEC = positionToEyeEC;
            materialInput.st = v_st;
            czm_material material = czm_getMaterial(materialInput);
            #ifdef FLAT
                out_FragColor = vec4(material.diffuse + material.emission, material.alpha);
            #else
                out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC);
            #endif
            out_FragColor.rgb = out_FragColor.rgb * testAppColorUniform.rgb; 
            out_FragColor.a = testAppColorUniform.a; 
        }`,
    materialCacheKey: "my-box-material-appearance"
});

4. 动画效果实现

通过requestAnimationFrame实现动态效果:

function animate() {
    customMaterial.uniforms.time++;
    const t = customMaterial.un
登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
22
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
136
1.89 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
8
0
金融AI编程实战金融AI编程实战
为非计算机科班出身 (例如财经类高校金融学院) 同学量身定制,新手友好,让学生以亲身实践开源开发的方式,学会使用计算机自动化自己的科研/创新工作。案例以量化投资为主线,涉及 Bash、Python、SQL、BI、AI 等全技术栈,培养面向未来的数智化人才 (如数据工程师、数据分析师、数据科学家、数据决策者、量化投资人)。
Jupyter Notebook
71
63
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
344
1.28 K
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
918
550
PaddleOCRPaddleOCR
飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)
Python
46
1
easy-eseasy-es
Elasticsearch 国内Top1 elasticsearch搜索引擎框架es ORM框架,索引全自动智能托管,如丝般顺滑,与Mybatis-plus一致的API,屏蔽语言差异,开发者只需要会MySQL语法即可完成对Es的相关操作,零额外学习成本.底层采用RestHighLevelClient,兼具低码,易用,易拓展等特性,支持es独有的高亮,权重,分词,Geo,嵌套,父子类型等功能...
Java
36
8
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
193
273
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
59
16