CustomShader

new Cesium.CustomShader(options)

ModelCesium3DTileset 一起使用的用户定义 GLSL 着色器。

如果使用纹理统一变量,必须进行额外的资源管理:

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

有关更详细的文档,请参阅 自定义着色器指南

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 用户定义统一变量的字典。键是出现在 GLSL 代码中的统一变量名称。值是描述统一变量类型和初始值的对象
varyings Object.<string, VaryingType> optional 用于声明着色器中使用的额外 GLSL 变量的字典。键是将出现在 GLSL 代码中的变量名称。值是变量的数据类型。对于每个变量,声明将自动添加到着色器顶部。调用者负责在顶点着色器中赋值并在片段着色器中使用该值。
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 使用
透明度模式,决定自定义着色器如何应用。如果值为 CustomShaderTransulcencyMode.OPAQUE 或 CustomShaderTransulcencyMode.TRANSLUCENT,自定义着色器 将覆盖模型材质的设置。如果值为 CustomShaderTransulcencyMode.INHERIT, 自定义着色器将根据图元材质设置渲染为不透明或半透明。
Default Value: CustomShaderTranslucencyMode.INHERIT
用户声明的额外统一变量。

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)

更新着色器中声明的统一变量的值
Name Type Description
uniformName string 统一变量的 GLSL 名称。必须与构造函数中声明的统一变量之一匹配
value boolean | number | Cartesian2 | Cartesian3 | Cartesian4 | Matrix2 | Matrix3 | Matrix4 | string | Resource | TextureUniform 统一变量的新值
Need help? The fastest way to get answers is from the community and team on the Cesium Forum.