Nowości w WebGPU (Chrome 131)

François Beaufort
François Beaufort

Odległości klipów w WGSL

Odległości przypięć pozwalają ograniczyć głośność klipu elementów głównych za pomocą zdefiniowanych przez użytkownika pół spacji na wyjściu etapu wierzchołka. Definiowanie własnych płaszczyzn przycinania daje większą kontrolę nad tym, co jest widoczne w scenach WebGPU. Ta technika jest szczególnie przydatna w przypadku aplikacji takich jak oprogramowanie CAD, w których przypadku dokładna kontrola wizualizacji jest kluczowa.

Gdy funkcja "clip-distances" jest dostępna w GPUAdapter, poproś o GPUDevice z tą funkcją, aby uzyskać obsługę odległości odcięcia w WGSL, i wyraźnie włącz to rozszerzenie w kodzie WGSL za pomocą enable clip_distances;. Po włączeniu możesz używać w shaderze wierzchołkowym wbudowanego tablicowego clip_distances. Ta tablica zawiera odległości od zdefiniowanej przez użytkownika płaszczyzny przycinania:

  • Odległość odcięcia 0 oznacza, że wierzchołek leży na płaszczyźnie.
  • Odległość dodatnia oznacza, że wierzchołek znajduje się wewnątrz odstępu w połowie klipu (boku, który chcesz zachować).
  • Odległość ujemna oznacza, że wierzchołek znajduje się poza połową przestrzeni klipu (bokem, który chcesz odrzucić).

Zapoznaj się z podanym niżej fragmentem kodu, artykułem na stronie chromestatus oraz problemem 358408571.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("clip-distances")) {
  throw new Error("Clip distances support is not available");
}
// Explicitly request clip distances support.
const device = await adapter.requestDevice({
  requiredFeatures: ["clip-distances"],
});

const vertexShaderModule = device.createShaderModule({ code: `
  enable clip_distances;

  struct VertexOut {
    @builtin(clip_distances) my_clip_distances : array<f32, 1>,
    @builtin(position) my_position : vec4f,
  }
  @vertex fn main() -> VertexOut {
    var output : VertexOut;
    output.my_clip_distances[0] = 1;
    output.my_position = vec4f(0, 0, 0, 1);
    return output;
  }
`,
});

// Send the appropriate commands to the GPU...

GPUCanvasContext getConfiguration()

Po wywołaniu metody GPUCanvasContext configure() z słownikiem konfiguracji możesz sprawdzić konfigurację kontekstu obrazu za pomocą metody GPUCanvasContext getConfiguration(). Zawiera użytkowników device, format, usage, viewFormats, colorSpace, toneMappingalphaMode. Jest to przydatne w przypadku takich zadań jak sprawdzanie, czy przeglądarka obsługuje kanwy HDR, jak pokazano w próbce cząstek (HDR). Zobacz poniższy fragment kodu, artykuł na stronie chromestatus oraz problem 370109829.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");

// Configure the canvas for HDR.
context.configure({
  device,
  format: "rgba16float",
  toneMapping: { mode: "extended" },
});

const configuration = context.getConfiguration();
if (configuration.toneMapping.mode === "extended") {
  // The browser supports HDR canvas.
  // Warning! The user still needs a HDR display to enjoy HDR content.
}

Pierwiastki punktowe i liniowe nie mogą mieć ustawienia głębokości.

Zgodnie z poprzednimi informacjami specyfikacja WebGPU powoduje, że ustawianie wartości depthBias, depthBiasSlopeScaledepthBiasClamp na niezerową, gdy topologia dla potoku renderowania jest typu linia lub punkt, powoduje błąd walidacji. Zobacz problem 352567424.

Wbudowane funkcje skanowania z uwzględnieniem podgrup

W ramach eksperymentu dotyczącego podgrupproblemie 361330160 dodano te wbudowane funkcje podgrupy:

  • subgroupInclusiveAdd(value): zwraca sumę skanowania wszystkich aktywnych wywołań value w całej podgrupie.
  • subgroupInclusiveMul(value): zwraca mnożnik skanowania z uwzględnieniem wszystkich aktywnych wywołań value w podgrupie.

Eksperymentalna obsługa wielu rysowań pośrednich

Funkcja pośredniego procesora graficznego dotycząca wielu rysowań umożliwia wysyłanie wielu wywołań rysowania za pomocą jednego polecenia GPU. Jest to szczególnie przydatne w sytuacjach, gdy trzeba renderować dużą liczbę obiektów, np. systemów cząsteczkowych, instancjonowania i dużych scen. Metody drawIndirect()drawIndexedIndirect() klasy GPURenderPassEncoder mogą wywołać tylko jedno wywołanie funkcji draw w danym momencie z określonego obszaru bufora GPU.

Dopóki ta funkcja eksperymentalna nie zostanie ujednolicona, włącz flagę „Niebezpieczne wsparcie WebGPU” na stronie chrome://flags/#enable-unsafe-webgpu, aby udostępnić ją w Chrome.

Jeśli w GPUAdapter jest dostępna niestandardowa funkcja GPU "chromium-experimental-multi-draw-indirect", zażądaj urządzenia GPU z tą funkcją. Następnie utwórz GPUBuffer z wykorzystaniem GPUBufferUsage.INDIRECT do przechowywania wywołań renderowania. Możesz go później używać w nowych metodach multiDrawIndirect()multiDrawIndexedIndirect() GPURenderPassEncoder, aby wydawać wywołania rysowania wewnątrz przejść renderowania. Zobacz poniższy fragment kodu i problem 356461286.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-multi-draw-indirect")) {
  throw new Error("Experimental multi-draw indirect support is not available");
}
// Explicitly request experimental multi-draw indirect support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-multi-draw-indirect"],
});

// Draw call have vertexCount, instanceCount, firstVertex, and firstInstance parameters.
const drawData = new Uint32Array([
  3, 1, 0, 0, // First draw call
  3, 1, 3, 0, // Second draw call
]);
// Create a buffer to store the draw calls.
const drawBuffer = device.createBuffer({
  size: drawData.byteLength,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(drawBuffer, 0, drawData);

// Create a render pipeline, a vertex buffer, and a render pass encoder...

// Inside a render pass, issue the draw calls.
myPassEncoder.setPipeline(myPipeline);
myPassEncoder.setVertexBuffer(0, myVertexBuffer);
myPassEncoder.multiDrawIndirect(drawBuffer, /*offset=*/ 0, /*maxDrawCount=*/ 2);
myPassEncoder.end();

Opcja kompilacji modułu shadera ścisła matematyka

Do pliku GPUShaderModuleDescriptor dodano logiczną opcję strictMath, która umożliwia włączanie i wyłączanie ścisłej matematyki podczas kompilacji modułu shadera. Jest ona dostępna za pomocą flagi „WebGPU Developer Features” (Funkcje dla programistów WebGPU) w chrome://flags/#enable-webgpu-developer-features, co oznacza, że jest to funkcja przeznaczona tylko do użytku podczas tworzenia. Zobacz problem 42241455.

Ta opcja jest obecnie obsługiwana w przypadku Metal i Direct3D. Gdy funkcja ścisła matematyka jest wyłączona, kompilator może optymalizować moduły do cieniowania, wykonując te czynności:

  • Ignorowanie możliwości wystąpienia wartości NaN i nieskończoności.
  • Uważanie -0 za +0.
  • Zastąpienie dzielenia szybszym mnożeniem przez odwrotną wartość.
  • przestawianie operacji na podstawie właściwości asocjacyjnych i rozpościelnych;
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `
  // Examines the bit pattern of the floating-point number to
  // determine if it represents a NaN according to the IEEE 754 standard.
  fn isNan(x : f32) -> bool {
    bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
    bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
    return ones_exp && non_zero_sig;
  }
  // ...
`;

// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });

Usuń metodę requestAdapterInfo() interfejsu GPUAdapter

Metoda niesynchroniczna GPUAdapter requestAdapterInfo() jest zbędna, ponieważ informacje o GPUAdapter możesz już uzyskać synchronicznie za pomocą atrybutu GPUAdapter info. Dlatego niestandardowa metoda GPUAdapter requestAdapterInfo() została teraz usunięta. Zobacz zamiar usunięcia.

Aktualizacje o świcie

Plik wykonywalny tint_benchmark mierzy koszt przetłumaczenia shaderów z WGSL na każdy język backendu. Więcej informacji na ten temat znajdziesz w nowej dokumentacji.

Obejmuje to tylko niektóre najważniejsze informacje. Zobacz pełną listę zatwierdzeń.

Co nowego w WebGPU

Lista wszystkich tematów omawianych w cyklu Co nowego w WebGPU.

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113