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
, toneMapping
i alphaMode
. 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
, depthBiasSlopeScale
i depthBiasClamp
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 podgrup w problemie 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()
i 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()
i 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
- Odcinki odległości w WGSL
- GPUCanvasContext getConfiguration(),
- Elementy podstawowe punktowe i liniowe nie mogą mieć efektu głębi
- Wbudowane funkcje skanowania uwzględniającego dla podgrup
- Dodanie eksperymentalnej obsługi pośredniego rysowania wielokrotnego
- Opcja kompilacji modułu shadera: ścisłe obliczenia matematyczne
- Usuwanie interfejsu GPUAdapter requestAdapterInfo()
- Informacje o świcie
Chrome 130
- Mieszanie dwóch źródeł
- Skrócenie czasu kompilacji shaderów na Metalu
- Wycofanie metody requestAdapterInfo() klasy GPUAdapter
- Informacje o świcie
Chrome 129
- Obsługa HDR w trybie mapowania tonalnego obszaru roboczego
- Rozszerzona obsługa podgrup
- Aktualizacje dotyczące Dawn
Chrome 128
- Eksperymentowanie z podgrupami
- Wycofanie obsługi ustawiania głębi dla linii i punktów
- Ukrywanie ostrzeżenia DevTools o nieuwzględnionym błędzie, jeśli wywołano funkcję preventDefault
- WGSL interpoluje próbkowanie najpierw i potem
- Informacje o świcie
Chrome 127
- Doświadczalna obsługa OpenGL ES na Androidzie
- Atrybut informacji o GPUAdapter
- Ulepszenia współpracy WebAssembly
- Poprawione błędy kodowania poleceń
- Aktualizacje dotyczące Dawn
Chrome 126
- Zwiększenie limitu maxTextureArrayLayers
- Optymalizacja przesyłania bufora dla backendu Vulkana
- Ulepszenia dotyczące czasu kompilacji shaderów
- Przesłane bufory poleceń muszą być unikalne
- Aktualizacje dotyczące Dawn
Chrome 125
- Podgrupy (funkcja w trakcie tworzenia)
- Renderowanie na potrzeby wycinka tekstury 3D
- Informacje o świcie
Chrome 124
- Tekstury pamięci masowej przeznaczone tylko do odczytu oraz do odczytu i zapisu
- Obsługa pracowników usług i pracowników wspólnych
- Nowe atrybuty informacji o adapterze
- Poprawki błędów.
- Aktualizacje dotyczące Dawn
Chrome 123
- Obsługa wbudowanych funkcji DP4a w WGSL
- Parametry wskaźnika bez ograniczeń w WGSL
- Składnia cukrowa do odwoływania się do elementów złożonych w WGSL
- Oddzielny stan tylko do odczytu dla stempli i aspektów głębi
- Aktualizacje dotyczące Dawn
Chrome 122
- Zwiększanie zasięgu dzięki trybowi zgodności (funkcja w fazie opracowywania)
- Zwiększanie limitu maxVertexAttributes
- Informacje o świcie
Chrome 121
- Obsługa WebGPU na Androidzie
- Używanie DXC zamiast FXC do kompilowania shaderów w systemie Windows
- Zapytania o sygnatury czasowe w przelotach obliczeniowych i renderowania
- Domyślne punkty wejścia do modułów cieniowania
- Obsługa przestrzeni barw display-p3 jako przestrzeni barw GPUExternalTexture
- Informacje o kupach pamięci
- Aktualizacje dotyczące Dawn
Chrome 120
- Obsługa 16-bitowych wartości zmiennoprzecinkowych w WGSL
- Przekraczanie limitów
- Zmiany stanu głębi cieniowania
- Aktualizacje informacji o adapterze
- Kwantyzacja zapytań dotyczących sygnatury czasowej
- Funkcje wiosenne porządki
Chrome 119
- Filtrowane tekstury 32-bitowe zmiennoprzecinkowe
- Format wierzchołka unorm10-10-10-2
- Format tekstury rgb10a2uint
- Aktualizacje dotyczące Dawn
Chrome 118
- Obsługa HTMLImageElement i ImageData w
copyExternalImageToTexture()
- Eksperymentalna obsługa tekstury pamięci masowej tylko do odczytu i do odczytu i zapisu
- Informacje o świcie
Chrome 117
- Bufor wierzchołka nieustawiony
- Nieskonfigurowana grupa powiązań
- Wyciszaj błędy tworzenia potoku asynchronicznego w przypadku utraty urządzenia
- Aktualizacje dotyczące tworzenia modułów shaderów SPIR-V
- Ułatwienie pracy programistom
- Przetwarzanie za pomocą przepływów z automatycznie wygenerowanym układem
- Aktualizacje dotyczące Dawn
Chrome 116
- Integracja z WebCodecs
- Urządzenie zgubione zwrócone przez GPUAdapter
requestDevice()
- Odtwarzaj płynnie, gdy wywoływany jest
importExternalTexture()
- Zgodność ze specyfikacją
- Ułatwienie pracy programistom
- Aktualizacje dotyczące Dawn
Chrome 115
- Obsługiwane rozszerzenia języka WGSL
- Wstępna obsługa Direct3D 11
- Uzyskaj oddzielny procesor graficzny domyślnie na zasilaniu z sieci
- Polepszanie wrażeń programistów
- Informacje o świcie
Chrome 114
- Optymalizacja kodu JavaScript
- getCurrentTexture() na nieskonfigurowanym płótnie powoduje błąd InvalidStateError
- Aktualizacje WGSL
- Aktualizacje dotyczące Dawn