CustomShader

new Cesium.CustomShader(options)

用户定义的 GLSL 着色器也与 Model 一起使用 为 Cesium3DTileset

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

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

See the Custom Shader Guide for more detailed documentation.

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 用户定义的 uniform 的字典。key 是将出现在 GLSL 代码中的统一名称。该值是描述 uniform 类型和初始值的对象
varyings Object.<string, VaryingType> optional 用于声明着色器中使用的其他 GLSL 变体的字典。关键是将出现在 GLSL 代码中的不同名称。该值是 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 使用
半透明模式,用于确定如何应用自定义着色器。如果值为 CustomShaderTransulcencyMode.OPAQUE 或 CustomShaderTransulcencyMode.TRANSLUCENT,自定义着色器 将覆盖模型材质的设置。如果值为 CustomShaderTransulcencyMode.INHERIT,则 自定义着色器将渲染为 Opaque 或 Translucent,具体取决于图元的材质设置。
Default Value: CustomShaderTranslucencyMode.INHERIT
用户声明的额外制服。

readonly varyings : Object.<string, VaryingType>

用户声明的其他变化。 这由 CustomShaderPipelineStage 使用

readonly vertexShaderText : string

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

Methods

setUniform(uniformName, value)

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