CustomShader

new Cesium.CustomShader(options)

一个用户定义的 GLSL 着色器,与 Model 以及 Cesium3DTileset 一起使用。

如果使用纹理 uniforms,则必须进行额外的资源管理:

  • 必须每帧调用 update 函数。当 自定义着色器被传递给 ModelCesium3DTileset 时,此步骤会自动处理
  • CustomShader#destroy 必须在自定义着色器 不再需要时调用,以正确清理 GPU 资源。应用程序 负责调用此方法。

有关更详细的文档,请参阅 Custom Shader Guide

Name Type Description
options object 包含以下选项的对象:
Name Type Default Description
mode CustomShaderMode CustomShaderMode.MODIFY_MATERIAL optional 自定义着色器模式,决定自定义着色器代码如何插入到片元着色器中。
lightingModel LightingModel optional 光照模型(例如 PBR 或未光照)。如果存在,它会覆盖模型的默认光照。
translucencyMode CustomShaderTranslucencyMode CustomShaderTranslucencyMode.INHERIT optional 半透明模式,决定自定义着色器如何应用。如果值为 CustomShaderTransulcencyMode.OPAQUE 或 CustomShaderTransulcencyMode.TRANSLUCENT,自定义着色器将覆盖模型材质的设置。如果值为 CustomShaderTransulcencyMode.INHERIT,自定义着色器将根据图元的材质设置渲染为不透明或半透明。
uniforms Object.<string, UniformSpecifier> optional 用于用户定义 uniforms 的字典。键是将在 GLSL 代码中出现的 uniform 名称。值是一个描述 uniform 类型和初始值的对象
varyings Object.<string, VaryingType> optional 用于声明着色器中使用的附加 GLSL varyings 的字典。键是将出现在 GLSL 代码中的 varying 名称。值是 varying 的数据类型。对于每个 varying,其声明将自动添加到着色器顶部。调用者负责在顶点着色器中为其赋值并在片元着色器中使用该值。
vertexShaderText string optional 作为 GLSL 代码字符串的自定义顶点着色器。它必须包含一个名为 vertexMain 的 GLSL 函数。有关预期的签名,请参阅示例。如果未指定,计算的顶点着色器将跳过自定义顶点着色器步骤。
fragmentShaderText string optional 作为 GLSL 代码字符串的自定义片元着色器。它必须包含一个名为 fragmentMain 的 GLSL 函数。有关预期的签名,请参阅示例。如果未指定,计算的片元着色器将跳过自定义片元着色器步骤。
Example:
const customShader = new CustomShader({
  uniforms: {
    u_colorIndex: {
      type: Cesium.UniformType.FLOAT,
      value: 1.0
    },
    u_normalMap: {
      type: Cesium.UniformType.SAMPLER_2D,
      value: new Cesium.TextureUniform({
        url: "http://example.com/normal.png"
      })
    }
  },
  varyings: {
    v_selectedColor: Cesium.VaryingType.VEC3
  },
  vertexShaderText: `
  void vertexMain(VertexInput vsInput, inout czm_modelVertexOutput vsOutput) {
    v_selectedColor = mix(vsInput.attributes.color_0, vsInput.attributes.color_1, u_colorIndex);
    vsOutput.positionMC += 0.1 * vsInput.attributes.normal;
  }
  `,
  fragmentShaderText: `
  void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {
    material.normal = texture(u_normalMap, fsInput.attributes.texCoord_0);
    material.diffuse = v_selectedColor;
  }
  `
});
Experimental

This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy.

Members

readonly fragmentShaderText : string

为片元着色器定义的用户 GLSL 代码
使用自定义着色器时采用的光照模型。 这由 CustomShaderPipelineStage 使用
决定自定义着色器如何与整体 片元着色器交互的值。这由 CustomShaderPipelineStage 使用
半透明模式,决定自定义着色器如何应用。如果值为 CustomShaderTransulcencyMode.OPAQUE 或 CustomShaderTransulcencyMode.TRANSLUCENT,自定义着色器 将覆盖模型材质的设置。如果值为CustomShaderTransulcencyMode.INHERIT, 自定义着色器将根据图元的材质设置渲染为不透明或半透明。
Default Value: CustomShaderTranslucencyMode.INHERIT
用户声明的附加 uniforms。

readonly varyings : Object.<string, VaryingType>

用户声明的附加 varyings。 这由 CustomShaderPipelineStage 使用

readonly vertexShaderText : string

为顶点着色器定义的用户 GLSL 代码

Methods

销毁此对象持有的 WebGL 资源。销毁对象可以实现 WebGL 资源的确定性 释放,而不是依赖垃圾回收器来销毁此对象。

一旦对象被销毁,就不应再使用它;调用除 isDestroyed 之外的任何函数都将导致 DeveloperError 异常。因此, 应像示例中那样将返回值(undefined)赋给该对象。
Throws:
Example:
customShader = customShader && customShader.destroy();
See:
如果此对象已销毁则返回 true,否则返回 false。

如果此对象已销毁,则不应再使用它;调用除 isDestroyed 之外的任何函数都将导致 DeveloperError 异常。
Returns:
如果此对象已销毁则为 True,否则为 false。
See:

setUniform(uniformName, value)

更新着色器中声明的 uniform 的值
Name Type Description
uniformName string uniform 的 GLSL 名称。它必须与构造函数中声明的某个 uniform 相匹配
value boolean | number | Cartesian2 | Cartesian3 | Cartesian4 | Matrix2 | Matrix3 | Matrix4 | string | Resource | TextureUniform uniform 的新值。
需要帮助?获取答案的最快方式是在 Cesium 论坛 上向社区和团队提问。.