GPUDevice: createShaderModule() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

GPUDevice 接口的 createShaderModule() 方法可以根据 WGSL 源代码字符串创建一个 GPUShaderModule

语法

js
createShaderModule(descriptor)

参数

描述符(descriptor)

包含以下属性的对象:

code

一个表示着色器模块的 WGSL 源代码的字符串。

hints 可选

一系列记录类型,结构为 ("string", compilationHint)。它们表现得像 有序映射。在每种情况下,"string" 是用于标识或选择记录的键,而 compilationHint 是一个 GPUPipelineLayout 对象实例或 "auto" 的枚举值。

hints 的目的是尽早提供有关管道布局的信息,以提高性能。其理念是最大限度地增加 createShaderModule() 可以一次性完成的编译量,而不是在多次调用 GPUDevice.createComputePipeline()GPUDevice.createRenderPipeline() 时重复编译。

注意: 不同的实现可能会以不同的方式处理 hints,包括可能完全忽略它们。提供提示并不保证在所有浏览器/系统上都能提高着色器编译性能。

label 可选

一个字符串,提供可用于识别对象的标签,例如在 GPUError 消息或控制台警告中。

sourceMap 可选

一个源映射定义,用于提供如源代码语言调试之类的开发者工具集成。源映射中的 WGSL 名称(标识符)应遵循 WGSL 标识符比较 中定义的规则。如果定义了源映射,它可能被解释为 source-map-v3 格式

注意: 不同的实现可能会以不同的方式处理 sourceMap,包括可能完全忽略它们。

返回值

一个 GPUShaderModule 对象实例。

验证

在调用 createShaderModule() 时必须满足以下条件,否则将生成 GPUValidationError 并返回一个无效的 GPUShaderModule 对象。

  • 如果您的着色器的 WGSL 代码使用了半精度浮点类型 f16,它在顶部包含 enable f16;,并且关联的 GPUDevice 是使用 shader-f16 功能启用的。

示例

在我们的 基本渲染演示 中,我们的着色器模块是使用以下代码创建的:

js
const shaders = `
struct VertexOut {
  @builtin(position) position : vec4f,
  @location(0) color : vec4f
}

@vertex
fn vertex_main(@location(0) position: vec4f,
               @location(1) color: vec4f) -> VertexOut
{
  var output : VertexOut;
  output.position = position;
  output.color = color;
  return output;
}

@fragment
fn fragment_main(fragData: VertexOut) -> @location(0) vec4f
{
  return fragData.color;
}
`;

async function init() {
  if (!navigator.gpu) {
    throw Error("WebGPU not supported.");
  }

  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) {
    throw Error("Couldn't request WebGPU adapter.");
  }

  const device = await adapter.requestDevice();

  // …
  // later on

  const shaderModule = device.createShaderModule({
    code: shaders,
  });

  // …
}

规范

规范
WebGPU
# dom-gpudevice-createshadermodule

浏览器兼容性

另见