cesium中如何添加自定义材质,编写shader

cesium中如何添加自定义材质,编写shader

cesium中提供了接口,让我们开发者在cesium中编写底层的shader着色器代码,达到一些酷炫的效果

Cesium.Material._materialCache.addMaterial('RectFlayLightMaterial', {
	fabric: {
		type: ,
		uniforms: {
            uTime: 0
        },
        source: `czm_material czm_getMaterial(czm_materialInput materialInput){
			czm_material material = czm_getDefaultMaterial(materialInput);
			return material;
		}`
	}
})

最简单的模板就是这样,source是glsl的源代码,这里定义了一个函数czm_getMaterial,在后续的代码中会调用这个czm_getMaterial函数,这个函数返回了一个材质,我们只有将这个material,的一些属性进行修改即可。
例如:

diffuse
alpha

至于这些属性表示什么意思,需要查看cesium对这块的文档说明

例如这样的修改

Cesium.Material._materialCache.addMaterial("RectFlayLightMaterial", {
        fabric: {
          type: "RectFlayLightMaterial",
          uniforms: {
            uTime: 0
          },
          source: `
          czm_material czm_getMaterial(czm_materialInput materialInput)
        {
            czm_material material = czm_getDefaultMaterial(materialInput);
            material.diffuse = vec3(1.0, 0.0, 0.0);
            material.alpha = uTime;
            vec2 st = materialInput.st;
            // 获取当前帧数,1@秒内变化从@-1:
            float time = fract(czm_frameNumber / (60.0*10.0));
            time = time * (1. + .1);
            // 平滑过渡函数
            // smoothstep(edge, edge1, value);
            // 参数1:边缘0,==8,
            // 参数2边缘1,==10,
            // 参数3当前值,==7 ,result = @
            // 参数3:当前值,==9 ,result = @.5
            // 参数3:当前值,==10 ,result = 1
            float alpha = smoothstep(time-0.1,time, st.s) * step(-time,-st.s);
            // 设置材质的透明度
            alpha += 0.05;
            material.alpha = alpha;
            material.diffuse = vec3(0.7, 0.6, 1.0);
            return material;
        }
      `
        },
      });

忘了说一点,这个Cesium.Material._materialCache.addMaterial要在一个类中编写

class RectFlayLightMaterial {
    constructor(name) {
      this.name = name;
      this.definitionChanged = new Cesium.Event();
      Cesium.Material._materialCache.addMaterial("RectFlayLightMaterial", {
        fabric: {
          type: "RectFlayLightMaterial",
          uniforms: {
            uTime: 0
          },
          source: `
          czm_material czm_getMaterial(czm_materialInput materialInput)
        {
            czm_material material = czm_getDefaultMaterial(materialInput);
            material.diffuse = vec3(1.0, 0.0, 0.0);
            material.alpha = uTime;
            vec2 st = materialInput.st;
            // 获取当前帧数,1@秒内变化从@-1:
            float time = fract(czm_frameNumber / (60.0*10.0));
            time = time * (1. + .1);
            // 平滑过渡函数
            // smoothstep(edge, edge1, value);
            // 参数1:边缘0,==8,
            // 参数2边缘1,==10,
            // 参数3当前值,==7 ,result = @
            // 参数3:当前值,==9 ,result = @.5
            // 参数3:当前值,==10 ,result = 1
            float alpha = smoothstep(time-0.1,time, st.s) * step(-time,-st.s);
            // 设置材质的透明度
            alpha += 0.05;
            material.alpha = alpha;
            material.diffuse = vec3(0.7, 0.6, 1.0);
            return material;
        }
      `
        },
      });
    }
    getType() {
      // 返回材质类型
      return "RectFlayLightMaterial";
    }
    equals(other) {
        // 判断两个材质是否相等
        return (other instanceof RectFlayLightMaterial && this.name == other.name)
    }
    getValue(time, result) {
      // result 是着色器的unifrom
      // console.log(result, 'result')
      let t = performance.now() / 1000;
      t = t % 1;
      result.uTime = t;
      return result;
    }

至于你想实现怎样的效果,完全是看你对webgl,glsl,图形学的了解有多少

在这里插入图片描述
在这里插入图片描述
例如这样的效果的实现

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cesium,可以通过自定义shader来创建自定义材质。具体步骤如下: 1. 创建一个新的着色器程序 首先,需要创建一个新的着色器程序,其包含自定义的顶点着色器和片元着色器。这可以通过CesiumShaderProgram类来实现,如下所示: var myShaderProgram = new Cesium.ShaderProgram({ vertexShaderSource: '...', // 自定义的顶点着色器代码 fragmentShaderSource: '...' // 自定义的片元着色器代码 }); 2. 创建一个新的材质 接下来,需要使用刚刚创建的着色器程序来创建一个新的材质。这可以通过Cesium的Material类来实现,如下所示: var myMaterial = new Cesium.Material({ fabric: { type: 'Custom', uniforms: { // 自定义uniform变量 }, source: myShaderProgram } }); 在这个例子,我们在材质的“fabric”属性指定了自定义类型,并将着色器程序作为源代码传递。 3. 将新材质应用于对象 最后,可以将新材质应用于Cesium场景的对象。这可以通过设置对象的“material”属性来实现,如下所示: myEntity.material = myMaterial; 在这个例子,我们将自定义材质应用于名为“myEntity”的实体对象。 需要注意的是,在自定义材质时,需要自己编写完整的顶点和片元着色器代码,并定义所有必要的uniform变量。 Cesium提供了一些内置的uniform变量,如czm_modelViewProjection、czm_sunDirection等,可以在着色器代码使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值