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

瀏覽器相容性

另見