Obcinanie odległości w WGSL
Odległości przycinania pozwalają ograniczyć objętość 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órym 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 wszystkich aktywnych wywołańvalue
s w podgrupie.subgroupInclusiveMul(value)
: Zwraca iloczyn skanowania wszystkich aktywnych wywołańvalue
s w podgrupie.
Eksperymentalna obsługa rysowania pośredniego z wieloma wywołaniami
Funkcja rysowania pośredniego z wieloma wywołaniami umożliwia wydawanie wielu wywołań rysowania za pomocą jednego polecenia GPU. Jest to szczególnie przydatne w sytuacjach, w których trzeba renderować dużą liczbę obiektów, np. w przypadku systemów cząsteczek, 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 przepustki 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 cieniowania ścisłe obliczenia
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 Co nowego w WebGPU.
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
- Zezwalaj 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
- Usunięcie obsługi typów tekstur z możliwością filtrowania zmiennoprzecinkowego jako mieszalnych
- Aktualizacje dotyczące Dawn
Chrome 133
- Dodatkowe formaty wierzchołków unorm8x4-bgra i 1-component
- Zezwalaj na żądanie nieznanych limitów z niezdefiniowaną wartością
- Zmiany w regułach wyrównywania 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
- Opcja kompilacji modułu cieniowania strict math
- 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 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 obliczeń 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 powiązania grupy
- Wyciszanie błędów podczas asynchronicznego tworzenia potoku, gdy urządzenie zostanie utracone
- Aktualizacje dotyczące tworzenia modułów 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 po podłączeniu do zasilania sieciowego
- Poprawianie komfortu pracy programistów
- Aktualizacje dotyczące Dawn
Chrome 114
- Optymalizacja JavaScript
- getCurrentTexture() w nieskonfigurowanym elemencie canvas zgłasza błąd InvalidStateError
- Aktualizacje WGSL
- Aktualizacje dotyczące Dawn