Obcinanie odległości w WGSL
Odległości przycinania umożliwiają ograniczenie objętości przycinania elementów pierwotnych za pomocą zdefiniowanych przez użytkownika półprzestrzeni w danych wyjściowych etapu wierzchołków. Zdefiniowanie własnych płaszczyzn odcinania zapewnia 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 precyzyjna kontrola wizualizacji ma kluczowe znaczenie.
Gdy funkcja "clip-distances" jest dostępna w obiekcie GPUAdapter, poproś o obiekt GPUDevice z tą funkcją, aby uzyskać obsługę odległości przycinania w WGSL, i wyraźnie włącz to rozszerzenie w kodzie WGSL za pomocą enable clip_distances;. Po włączeniu możesz użyć wbudowanej tablicy clip_distances w programie cieniowania wierzchołków. Ta tablica zawiera odległości do zdefiniowanej przez użytkownika płaszczyzny odcinania:
- Odległość przycinania 0 oznacza, że wierzchołek leży na płaszczyźnie.
- Dodatnia odległość oznacza, że wierzchołek znajduje się w półprzestrzeni przycinania (po stronie, którą chcesz zachować).
- Ujemna odległość oznacza, że wierzchołek znajduje się poza przestrzenią przycinania (po stronie, którą chcesz odrzucić).
Zobacz ten fragment kodu, wpis na stronie chromestatus i zgłoszenie 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()
Gdy wywołasz GPUCanvasContext configure() ze słownikiem konfiguracji, metoda GPUCanvasContext getConfiguration() umożliwi Ci sprawdzenie konfiguracji kontekstu płótna. Obejmuje ona device, format, usage, viewFormats, colorSpace, toneMapping i alphaMode. Jest to przydatne w przypadku zadań takich jak sprawdzanie, czy przeglądarka obsługuje obszar rysowania HDR, jak pokazano w przykładzie Particles (HDR). Zobacz ten fragment kodu, wpis w chromestatus i zgłoszenie 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.
}
Prymitywy punktowe i liniowe nie mogą mieć odchylenia głębi.
Zgodnie z wcześniejszym ogłoszeniem specyfikacja WebGPU powoduje teraz błąd weryfikacji, gdy wartości depthBias, depthBiasSlopeScale i depthBiasClamp są ustawione na wartość inną niż zero, a topologia potoku renderowania jest typu linia lub punkt. Zobacz problem 352567424.
Wbudowane funkcje skanowania obejmującego podgrupy
W ramach eksperymentowania z podgrupami w zgłoszeniu 361330160 dodaliśmy te wbudowane funkcje podgrup:
subgroupInclusiveAdd(value): zwraca sumę skanowania obejmującego wszystkie aktywne wywołaniavalues w podgrupie.subgroupInclusiveMul(value): Zwraca iloczyn skanowania wszystkich aktywnych wywołańvalues w podgrupie.
Eksperymentalna obsługa rysowania pośredniego z wieloma wywołaniami
Funkcja rysowania pośredniego na wielu buforach umożliwia wydawanie wielu wywołań rysowania za pomocą jednego polecenia GPU. Jest to szczególnie przydatne w sytuacjach, w których trzeba wyrenderować dużą liczbę obiektów, np. w przypadku systemów cząsteczkowych, instancjonowania i dużych scen. Metody drawIndirect() i drawIndexedIndirect() interfejsu GPURenderPassEncoder mogą w danym momencie wywoływać tylko jedno wywołanie rysowania z określonego regionu bufora GPU.
Dopóki ta eksperymentalna funkcja nie zostanie znormalizowana, włącz flagę „Unsafe WebGPU Support” (Niebezpieczna obsługa WebGPU) na stronie chrome://flags/#enable-unsafe-webgpu, aby była dostępna w Chrome.
Gdy w obiekcie GPUAdapter dostępna jest "chromium-experimental-multi-draw-indirect"niestandardowa funkcja GPU, poproś o obiekt GPUDevice z tą funkcją. Następnie utwórz obiekt GPUBuffer z użyciem GPUBufferUsage.INDIRECT, aby przechowywać wywołania rysowania. Możesz go później użyć w nowych metodach multiDrawIndirect() i multiDrawIndexedIndirect() GPURenderPassEncoder, aby wywoływać rysowanie w ramach procesu renderowania. Zapoznaj się z tym fragmentem kodu i problemem 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 strict math
Do interfejsu GPUShaderModuleDescriptor dodano opcję logiczną strictMath, która umożliwia włączanie i wyłączanie ścisłych obliczeń podczas kompilacji modułu cieniowania. Jest ona dostępna za flagą „Funkcje programistyczne WebGPU” na stronie chrome://flags/#enable-webgpu-developer-features, co oznacza, że jest przeznaczona tylko do użytku podczas programowania. Zobacz problem 42241455.
Ta opcja jest obecnie obsługiwana w przypadku interfejsów Metal i Direct3D. Gdy ścisłe obliczenia matematyczne są wyłączone, kompilator może optymalizować shadery przez:
- Ignorowanie możliwości wystąpienia wartości NaN i Infinity.
- Traktowanie –0 jako +0.
- Zastąpienie dzielenia szybszym mnożeniem przez odwrotność.
- Zmiana kolejności działań na podstawie własności łączności i rozdzielności.
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 });
Usunięcie metody GPUAdapter requestAdapterInfo()
Asynchroniczna metoda GPUAdapter requestAdapterInfo() jest zbędna, ponieważ informacje GPUAdapterInfo można już uzyskać synchronicznie za pomocą atrybutu GPUAdapter info. Dlatego niestandardowa metoda GPUAdapter requestAdapterInfo() została usunięta. Zobacz zamiar usunięcia.
Aktualizacje o świcie
Plik wykonywalny tint_benchmark mierzy koszt tłumaczenia shaderów z WGSL na każdy język backendu. Więcej informacji znajdziesz w nowej dokumentacji.
Obejmuje to tylko niektóre z najważniejszych informacji. Zapoznaj się z pełną listą zatwierdzeń.
Nowości w WebGPU
Lista wszystkich tematów omówionych w serii Nowości w WebGPU.
Chrome 142
- Rozszerzone możliwości obsługi formatów tekstur
- Indeks typu pierwotnego w WGSL
- Aktualizacje dotyczące Dawn
Chrome 141
- Tint IR completed
- Analiza zakresu liczb całkowitych w kompilatorze WGSL
- Aktualizacja SPIR-V 1.4 dla backendu Vulkan
- Aktualizacje dotyczące Dawn
Chrome 140
- Żądania dotyczące urządzeń wykorzystują adapter
- Skrót do używania tekstury w miejscu, w którym używany jest widok tekstury
- Funkcja WGSL textureSampleLevel obsługuje tekstury 1D
- Wycofanie użycia tekstury pamięci tylko do odczytu bgra8unorm
- Usunięcie atrybutu GPUAdapter isFallbackAdapter
- Aktualizacje dotyczące Dawn
Chrome 139
- Obsługa tekstur 3D w przypadku formatów skompresowanych BC i ASTC
- Nowa funkcja „core-features-and-limits”
- Testowanie wersji próbnej trybu zgodności WebGPU
- Aktualizacje dotyczące Dawn
Chrome 138
- Skrót do używania bufora jako zasobu wiążącego
- Zmiany wymagań dotyczących rozmiaru buforów mapowanych podczas tworzenia
- Raport o architekturze najnowszych układów GPU
- Wycofanie atrybutu GPUAdapter isFallbackAdapter
- Aktualizacje dotyczące Dawn
Chrome 137
- Używanie widoku tekstury do wiązania externalTexture
- Kopiowanie buforów bez określania przesunięć i rozmiaru
- WGSL workgroupUniformLoad using pointer to atomic
- Atrybut powerPreference interfejsu GPUAdapterInfo
- Usunięcie atrybutu compatibilityMode z interfejsu GPURequestAdapterOptions
- Aktualizacje dotyczące Dawn
Chrome 136
- Atrybut GPUAdapterInfo isFallbackAdapter
- Krótszy czas kompilacji shaderów w D3D12
- Zapisywanie i kopiowanie obrazów z płótna
- Ograniczenia trybu zgodności pomiaru wzrostu
- Aktualizacje dotyczące Dawn
Chrome 135
- Zezwalanie na tworzenie układu potoku z układem grupy wiązań o wartości null
- Zezwalaj na wykraczanie obszarów widoku poza granice docelowych obszarów renderowania
- Łatwiejszy dostęp do eksperymentalnego trybu zgodności na Androidzie
- Usuwanie limitu maxInterStageShaderComponents
- Aktualizacje dotyczące Dawn
Chrome 134
- Ulepszanie zadań systemów uczących się za pomocą podgrup
- Usuwanie obsługi typów tekstur z możliwością filtrowania zmiennoprzecinkowego jako mieszanych
- Aktualizacje dotyczące Dawn
Chrome 133
- Dodatkowe formaty wierzchołków unorm8x4-bgra i 1-składnikowe
- Zezwalanie na żądanie nieznanych limitów z niezdefiniowaną wartością
- Zmiany w regułach wyrównania WGSL
- Wzrost wydajności WGSL dzięki odrzucaniu
- Używanie parametru VideoFrame displaySize w przypadku tekstur zewnętrznych
- Obsługa obrazów o orientacji innej niż domyślna za pomocą funkcji copyExternalImageToTexture
- Poprawianie komfortu pracy programistów
- Włączanie trybu zgodności za pomocą parametru featureLevel
- Usuwanie funkcji eksperymentalnych podgrup
- Wycofanie limitu maxInterStageShaderComponents
- Aktualizacje dotyczące Dawn
Chrome 132
- Korzystanie z widoku tekstury
- Mieszanie tekstur zmiennoprzecinkowych 32-bitowych
- Atrybut adapterInfo interfejsu GPUDevice
- Konfigurowanie kontekstu elementu canvas w nieprawidłowym formacie powoduje błąd JavaScriptu
- Ograniczenia dotyczące próbkowania tekstur
- Eksperymentowanie z rozszerzonymi podgrupami
- Poprawianie komfortu pracy programistów
- Eksperymentalna obsługa 16-bitowych znormalizowanych formatów tekstur
- Aktualizacje dotyczące Dawn
Chrome 131
- Obcinanie odległości w WGSL
- GPUCanvasContext getConfiguration()
- Elementy pierwotne punktów i linii nie mogą mieć odchylenia głębi
- Wbudowane funkcje skanowania obejmującego podgrupy
- Eksperymentalna obsługa rysowania pośredniego w wielu wywołaniach
- Opcja kompilacji modułu cieniowania ścisła matematyka
- Usunięcie metody GPUAdapter requestAdapterInfo()
- Aktualizacje dotyczące Dawn
Chrome 130
- Miksowanie z 2 źródeł
- Krótszy czas kompilacji cieniowania w Metal
- Wycofanie metody GPUAdapter requestAdapterInfo()
- Aktualizacje dotyczące Dawn
Chrome 129
- Obsługa HDR w trybie mapowania tonów na płótnie
- Rozszerzona obsługa podgrup
- Aktualizacje dotyczące Dawn
Chrome 128
- Eksperymentowanie z podgrupami
- Wycofanie ustawiania odchylenia głębi dla linii i punktów
- Ukrywanie ostrzeżenia Narzędzi deweloperskich o nieprzechwyconym błędzie, jeśli użyto metody preventDefault
- WGSL interpolate sampling first and either
- Aktualizacje dotyczące Dawn
Chrome 127
- Eksperymentalna obsługa OpenGL ES na Androidzie
- Atrybut informacji GPUAdapter
- Ulepszenia interoperacyjności WebAssembly
- Poprawione błędy kodera poleceń
- Aktualizacje dotyczące Dawn
Chrome 126
- Zwiększanie limitu maxTextureArrayLayers
- Optymalizacja przesyłania bufora na potrzeby backendu Vulkan
- Ulepszenia czasu kompilacji cieniowania
- Przesłane bufory poleceń muszą być unikalne
- Aktualizacje dotyczące Dawn
Chrome 125
- Podgrupy (funkcja w trakcie opracowywania)
- Renderowanie do wycinka tekstury 3D
- Aktualizacje dotyczące Dawn
Chrome 124
- Tekstury pamięci tylko do odczytu i do odczytu i zapisu
- Obsługa pracowników usługowych i współdzielonych
- 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
- Uproszczona składnia dereferencji typów złożonych w WGSL
- Oddzielny stan tylko do odczytu dla aspektów szablonu i głębi
- Aktualizacje dotyczące Dawn
Chrome 122
- Zwiększanie zasięgu dzięki trybowi zgodności (funkcja w trakcie opracowywania)
- Zwiększanie limitu maxVertexAttributes
- Aktualizacje dotyczące Dawn
Chrome 121
- Obsługa WebGPU na Androidzie
- Używanie DXC zamiast FXC do kompilacji cieniowania w systemie Windows
- Zapytania o sygnatury czasowe w przypadku operacji obliczeniowych i renderowania
- Domyślne punkty wejścia do modułów cieniowania
- Obsługa przestrzeni kolorów display-p3 jako przestrzeni kolorów GPUExternalTexture
- Informacje o obszarach pamięci
- Aktualizacje dotyczące Dawn
Chrome 120
- Obsługa 16-bitowych wartości zmiennoprzecinkowych w WGSL
- Przekraczaj granice
- Zmiany stanu bufora głębi i szablonu
- Aktualizacje informacji o adapterze
- Kwantyzacja zapytań dotyczących sygnatur czasowych
- Funkcje wiosennych porządków
Chrome 119
- Filtrowane tekstury zmiennoprzecinkowe 32-bitowe
- unorm10-10-10-2 vertex format
- Format tekstury rgb10a2uint
- Aktualizacje dotyczące Dawn
Chrome 118
- Obsługa elementów HTMLImageElement i ImageData w
copyExternalImageToTexture() - Eksperymentalna obsługa tekstur pamięci do odczytu i zapisu oraz tylko do odczytu
- Aktualizacje dotyczące Dawn
Chrome 117
- Usuwanie bufora wierzchołków
- Usuwanie grupy powiązań
- Wyciszanie błędów podczas asynchronicznego tworzenia potoku, gdy urządzenie zostanie utracone
- Aktualizacje tworzenia modułu cieniowania SPIR-V
- Poprawianie komfortu pracy programistów
- Buforowanie potoków z automatycznie generowanym układem
- Aktualizacje dotyczące Dawn
Chrome 116
- Integracja WebCodecs
- Zwrócono utracone urządzenie przez GPUAdapter
requestDevice() - Zapewnij płynne odtwarzanie wideo, jeśli wywoływana jest funkcja
importExternalTexture() - Zgodność ze specyfikacją
- Poprawianie komfortu pracy programistów
- Aktualizacje dotyczące Dawn
Chrome 115
- Obsługiwane rozszerzenia języka WGSL
- Eksperymentalna obsługa Direct3D 11
- Domyślne korzystanie z osobnego procesora graficznego przy zasilaniu z sieci
- Poprawianie komfortu pracy programistów
- Aktualizacje dotyczące Dawn
Chrome 114
- Optymalizacja JavaScriptu
- getCurrentTexture() w przypadku nieskonfigurowanego elementu canvas zgłasza błąd InvalidStateError
- Aktualizacje WGSL
- Aktualizacje dotyczące Dawn