CustomShader

new Cesium.CustomShader(options)

用户定义的 GLSL 着色器,适用于 Model 以及 Cesium3DTileset

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

  • 每帧必须调用 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 半透明模式,决定自定义着色器将如何应用。如果值为 CustomShaderTranslucencyMode.OPAQUE 或 CustomShaderTranslucencyMode.TRANSLUCENT,自定义着色器将覆盖模型材质的设置。如果值为 CustomShaderTranslucencyMode.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

此功能使用的是 3D Tiles 规范的一部分,该规范尚未最终确定,并可能在没有 Cesium 标准弃用政策的情况下发生更改。

Members

readonly fragmentShaderText : string

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

readonly varyings : Object.<string, VaryingType>

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

readonly vertexShaderText : string

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

Methods

setUniform(uniformName, value)

更新着色器中声明的 uniform 的值。
Name Type Description
uniformName string uniform 的 GLSL 名称。必须与构造函数中声明的 uniforms 之一匹配。
value boolean | number | Cartesian2 | Cartesian3 | Cartesian4 | Matrix2 | Matrix3 | Matrix4 | string | Resource | TextureUniform uniform 的新值。
需要帮助?获得答案的最快方法是来自社区和团队 Cesium Forum.