Odległości klipów w WGSL
Odległości klipów umożliwiają ograniczenie objętości klipów prymitywów za pomocą zdefiniowanych przez użytkownika półprzestrzeni 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.
- Dodatnia odległość oznacza, że wierzchołek znajduje się wewnątrz półprzestrzeni klipu (strony, którą chcesz zachować).
- Ujemna odległość oznacza, że wierzchołek znajduje się poza połową przestrzeni klipu (po stronie, którą 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 canvas za pomocą metody GPUCanvasContext getConfiguration()
. Zawiera użytkowników device
, format
, usage
, viewFormats
, colorSpace
, toneMapping
i alphaMode
. Jest to przydatne na przykład do sprawdzenia, czy przeglądarka obsługuje płótno HDR, jak pokazano w próbce cząsteczek (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 kanału 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ę wszystkich aktywnych wywołańvalue
w podgrupie.subgroupInclusiveMul(value)
: zwraca mnożnik skanowania z uwzględnieniem wszystkich aktywnych wywołańvalue
w podgrupie.
Eksperymentalna obsługa wielokrotnego rysowania pośredniego
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ąstek, 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ę „Unsafe WebGPU Support” (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 bufor GPU z wykorzystaniem GPUBufferUsage.INDIRECT
, aby przechowywać wywołania draw. Możesz go później używać w nowych metodach multiDrawIndirect()
i multiDrawIndexedIndirect()
GPURenderPassEncoder, aby wydawać wywołania draw w ramach passu 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 Metal i Direct3D. Gdy ścisła matematyka jest wyłączona, kompilator może optymalizować shadery, 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ń GPUAdapter requestAdapterInfo()
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. Sprawdź intencję usunięcia.
Aktualizacje świtu
Plik wykonywalny tint_benchmark
mierzy koszt przetłumaczenia shaderów z WGSL na każdy język backendu. Aby dowiedzieć się więcej, zapoznaj się z nową dokumentacją.
Obejmuje to tylko niektóre najważniejsze informacje. Zapoznaj się z pełną listą commitów.
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()
- Punkty i linie nie mogą mieć ustawienia głębi
- Funkcje wbudowane w skanowanie z uwzględnieniem wszystkich grup
- Dodanie eksperymentalnej obsługi pośrednich metod wielokrokowego rysowania
- Opcja kompilacji modułu shadera: ścisła matematyka
- Usuwanie metody requestAdapterInfo() klasy GPUAdapter
- Aktualizacje dotyczące Dawn
Chrome 130
- Mieszanie dwóch źródeł
- Skrócenie czasu kompilacji shaderów na Metalu
- Wycofanie metody requestAdapterInfo() klasy GPUAdapter
- Aktualizacje dotyczące Dawn
Chrome 129
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 preventDefault
- WGSL interpoluje próbkowanie najpierw i potem
- Aktualizacje dotyczące Dawn
Chrome 127
- Doświadczalna obsługa OpenGL ES na Androidzie
- Atrybut informacji o GPUAdapter
- Ulepszenia interoperacyjności 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
- Aktualizacje dotyczące Dawn
Chrome 124
- Tekstury tylko do odczytu i do odczytu i zapisu
- Obsługa pracowników i współużytkowników
- 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ększenie zasięgu dzięki trybowi zgodności (funkcja w trakcie tworzenia)
- Zwiększenie limitu maxVertexAttributes
- Aktualizacje dotyczące Dawn
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 shaderów
- 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
- Format wierzchołka unorm10-10-10-2
- Format tekstury rgb10a2uint
- Aktualizacje dotyczące Dawn
Chrome 118
- Obsługa HTMLImageElement i ImageData w
copyExternalImageToTexture()
- Dodatkowa obsługa tekstury pamięci tylko do odczytu i z możliwością zapisu
- Aktualizacje dotyczące Dawn
Chrome 117
- Nieustawienie bufora wierzchołka
- Cofnij grupę wiązania
- Błędy w przypadku tworzenia asynchronicznego potoku, gdy urządzenie jest utracone
- Aktualizacje dotyczące tworzenia modułów shaderów SPIR-V
- Ułatwienie pracy programistom
- Skuteczne wykorzystanie pamięci podręcznej dzięki automatycznie generowanemu układowi
- Aktualizacje dotyczące Dawn
Chrome 116
- Integracja z WebCodecs
- Utracone urządzenie zwrócone przez GPUAdapter
requestDevice()
- Utrzymanie płynnego odtwarzania filmu, jeśli wywołana zostanie funkcja
importExternalTexture()
- Zgodność ze specyfikacją
- Ułatwienie pracy programistom
- Aktualizacje dotyczące Dawn
Chrome 115
- Obsługiwane rozszerzenia językowe WGSL
- Wstępna obsługa Direct3D 11
- Uzyskaj oddzielny procesor graficzny domyślnie na zasilaniu z sieci
- Ułatwienie pracy programistom
- Aktualizacje dotyczące Dawn
Chrome 114
- Optymalizacja kodu JavaScript
- getCurrentTexture() na nieskonfigurowanym płótnie powoduje błąd InvalidStateError
- Aktualizacje WGSL
- Aktualizacje dotyczące Dawn