Rozszerzenie fragment_depth w WGSL
W przypadku renderowania z dużą ilością geometrii optymalizacje early-Z są najlepszym przyjacielem deweloperów. Zapewniają one ogromny wzrost wydajności, umożliwiając GPU odrzucanie ukrytych pikseli przed uruchomieniem kosztownych fragmentów kodu cieniowania. Jeśli zrasteryzowana głębia nie przejdzie testu głębi, GPU całkowicie pomija cieniowanie fragmentów, pod warunkiem że cieniowanie nie ma innych efektów ubocznych.
Jeśli chcesz dowiedzieć się, jak sprzęt radzi sobie z tym problemem, przeczytaj doskonały artykuł MJP na temat tego, kiedy należy wyłączyć Early-Z.
Chociaż niestandardowe manipulowanie głębią jest przydatne, robienie tego w programie do cieniowania fragmentów wiąże się z ukrytym kosztem. Zapisywanie w @builtin(frag_depth) w programie do cieniowania fragmentów zwykle wymusza na sterownikach wyłączenie optymalizacji early-Z dla całego wywołania rysowania. Dzieje się tak, ponieważ heurystyka sterownika nie może zagwarantować, że obliczona głębokość wyjściowa cieniowania jest zgodna z głębokością interpolowaną przez rasteryzator.
Aby rozwiązać ten problem, rozszerzenie WGSL fragment_depth umożliwia określenie nazwy trybu głębi less lub greater w @builtin(frag_depth), aby wyraźnie określić, jak zapisana głębia ma się do głębi interpolowanej. Dzięki temu GPU może bezpiecznie stosować optymalizacje early-Z.
To rozszerzenie języka można wykryć w języku JavaScript za pomocą navigator.gpu.wgslLanguageFeatures. Zalecamy użycie dyrektywy requires, aby zasygnalizować możliwość braku przenośności z requires fragment_depth; na początku kodu cieniowania WGSL. Zobacz ten przykład i zamiar wdrożenia.
if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
throw new Error(`WGSL fragment depth is not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires fragment_depth;
@fragment
fn main() -> @builtin(frag_depth, less) f32 {
// Explicitly states that the output fragment depth is less than early-Z depth,
// allowing the GPU to safely preserve early-Z optimizations.
return 0.0f;
}`,
});
Niewyrównana kompresja tekstur
Funkcja GPU „texture-compression-unaligned” umożliwia tworzenie skompresowanych tekstur o wymiarach, które nie są wielokrotnościami liczb całkowitych rozmiaru bloku (np. 4 x 4 w przypadku formatów BC, ETC2 i ASTC). Wcześniej WebGPU wymagał, aby rozmiary tekstur były ściśle dopasowane do tych granic bloków. Dzięki temu, że nie trzeba uzupełniać ani skalować tekstur, aby dopasować je do wyrównania bloków, ta funkcja zachowuje oryginalną wierność kompresji bez wprowadzania zniekształceń skalowania. Zobacz zamiar wysłania.
Poniższy fragment kodu sprawdza, czy adapter obsługuje niespójną kompresję tekstur, i jeśli jest dostępna, żąda urządzenia z tą funkcją.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("texture-compression-unaligned")) {
throw new Error("Texture compression unaligned support is not available");
}
// Explicitly request texture compression unaligned support.
const device = await adapter.requestDevice({
requiredFeatures: ["texture-compression-unaligned"],
});
Dziękujemy zewnętrznemu współtwórcy Ignacio Castaño z zespołu spark.js za pracę nad tą funkcją, specyfikacją i zestawem testów zgodności.
Przestrzenie barw srgb-linear i display-p3-linear
Dzięki dodaniu wstępnie zdefiniowanych przestrzeni barw „srgb-linear” i „display-p3-linear” kontekst obszaru roboczego WebGPU może teraz renderować bezpośrednio w linearnych przestrzeniach barw o rozszerzonym zakresie, aby obsługiwać wyświetlacze o szerokiej gamie kolorów. Te przestrzenie barw zachowują liniową zależność między wartościami pikseli a luminancją fizyczną. Dzięki temu idealnie nadają się do renderowania fizycznego światła w grach, a także do zadań związanych z przetwarzaniem przestrzennym, takich jak antyaliasing, interpolacja i dziesiątkowanie. Zobacz zamiar udostępnienia i przykładową prośbę o pociągnięcie nr 574 dotyczącą cząsteczek (HDR).
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");
context.configure({
device,
format: "rgba16float",
colorSpace: "display-p3-linear",
});
Dodatkowy format wierzchołków snorm10-10-10-2
Format wierzchołka „snorm10-10-10-2” to spakowany format 32-bitowy zawierający 4 znormalizowane wartości ze znakiem: 3 komponenty 10-bitowe (r, g, b) i 1 komponent 2-bitowy (a). Dzięki temu formatowi możesz efektywnie przechowywać atrybuty, takie jak wektory normalne 3D z dodatkowym 2-bitowym skalarem lub flagą wyrównania, oszczędzając przy tym przepustowość pamięci. Zobacz specyfikację PR 6491.
Obsługa f16 w systemie Linux w przypadku NVIDIA
Opcjonalna funkcja „shader-f16”, która zapewnia obsługę 16-bitowych wartości zmiennoprzecinkowych w WGSL, jest teraz obsługiwana w systemie Linux w przypadku najnowszych sterowników GPU NVIDIA. Zobacz problem chromium:42251215.
Aktualizacje Dawn
Teraz możesz wysłać zapytanie o identyfikator LUID podstawowego adaptera DXGIAdapter dla danego adaptera GPU, używając struktury WGPUAdapterPropertiesD3D. Zobacz problem chromium:562849566.
Oto kilka najważniejszych informacji. Zapoznaj się z pełną listą zatwierdzeń.
Co nowego w WebGPU
Lista wszystkich tematów omówionych w serii Nowości w WebGPU.
Chrome 155–156
- Rozszerzenie fragment_depth w WGSL
- Niedopasowana kompresja tekstur
- Przestrzenie barw srgb-linear i display-p3-linear
- Dodatkowy format wierzchołków snorm10-10-10-2
- Obsługa f16 w systemie Linux w przypadku kart NVIDIA
- Aktualizacje Dawn
Chrome 153–154
- Rozszerzenie buffer_view w WGSL
- Rozszerzenie WGSL swizzle_assignment
- Aktualizacje rozszerzenia WGSL
- Aktualizacje Dawn
Chrome 151–152
- Kontrola rozmiaru podgrupy
- OperationError w przypadku niepowodzenia walidacji setImmediates
- Aktualizacje Dawn
Chrome 149–150
Chrome 147–148
Chrome 146
- Obsługa trybu zgodności WebGPU w OpenGL ES 3.1
- Załączniki tymczasowe
- Rozszerzenie WGSL texture_and_sampler_let
- Aktualizacje Dawn
Chrome 145
- Rozszerzenie WGSL subgroup_uniformity
- Eksperymentalne synchroniczne mapowanie bufora w procesach roboczych
- Aktualizacje Dawn
Chrome 144
- Rozszerzenie WGSL subgroup_id
- Rozszerzenie uniform_buffer_standard_layout w WGSL
- WebGPU na Linuksie
- Szybsze metody writeBuffer i writeTexture
- Aktualizacje Dawn
Chrome 143
- Swizzle komponentu tekstury
- Usunięcie użycia tekstury pamięci masowej bgra8unorm tylko do odczytu
- Aktualizacje Dawn
Chrome 142
Chrome 141
- Zakończono IR barwy
- Analiza zakresu liczb całkowitych w kompilatorze WGSL
- Aktualizacja SPIR-V 1.4 dla backendu Vulkan
- Aktualizacje Dawn
Chrome 140
- Urządzenie żąda adaptera do wykorzystania
- Skrót do używania tekstury tam, gdzie używany jest widok tekstury
- WGSL textureSampleLevel obsługuje tekstury 1D
- Wycofanie użycia tekstury pamięci masowej bgra8unorm tylko do odczytu
- Usunięcie atrybutu GPUAdapter isFallbackAdapter
- Aktualizacje Dawn
Chrome 139
- Obsługa tekstur 3D w przypadku formatów skompresowanych BC i ASTC
- Nowa funkcja „core-features-and-limits”
- Testowanie origin w trybie zgodności WebGPU
- Aktualizacje Dawn
Chrome 138
- Skrót do używania bufora jako zasobu wiązania
- Zmiany wymagań dotyczących rozmiaru buforów mapowanych podczas tworzenia
- Raport dotyczący architektury najnowszych GPU
- Wycofanie atrybutu GPUAdapter isFallbackAdapter
- Aktualizacje Dawn
Chrome 137
- Używanie widoku tekstury do wiązania externalTexture
- Kopiowanie buforów bez określania przesunięć i rozmiaru
- WGSL workgroupUniformLoad przy użyciu wskaźnika do operacji niepodzielnej
- Atrybut GPUAdapterInfo powerPreference
- Usunięcie atrybutu compatibilityMode z GPURequestAdapterOptions
- Aktualizacje Dawn
Chrome 136
- Atrybut GPUAdapterInfo isFallbackAdapter
- Skrócenie czasu kompilacji shaderów w D3D12
- Zapisywanie i kopiowanie obrazów z obszaru roboczego
- Ograniczenia trybu zgodności wzrostu
- Aktualizacje Dawn
Chrome 135
- Zezwalanie na tworzenie układu potoku z pustym układem grupy powiązań
- Zezwalaj na rozszerzanie widocznych obszarów poza granice obiektów docelowych renderowania
- Łatwiejszy dostęp do eksperymentalnego trybu zgodności na Androidzie
- Usunięcie limitu maxInterStageShaderComponents
- Aktualizacje 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 możliwych do mieszania
- Aktualizacje Dawn
Chrome 133
- Dodatkowe formaty unorm8x4-bgra i 1-składnikowe formaty wierzchołków
- Zezwalanie na żądanie nieznanych limitów z niezdefiniowaną wartością
- Zmiany w regułach wyrównania WGSL
- Wzrost wydajności WGSL dzięki discard
- Używanie displaySize interfejsu VideoFrame w przypadku tekstur zewnętrznych
- Obsługa obrazów o orientacji innej niż domyślna za pomocą copyExternalImageToTexture
- Ulepszanie środowiska dewelopera
- Włączanie trybu zgodności za pomocą parametru featureLevel
- Czyszczenie funkcji eksperymentalnych podgrup
- Wycofanie limitu maxInterStageShaderComponents
- Aktualizacje Dawn
Chrome 132
- Wykorzystanie widoku tekstury
- Mieszanie 32-bitowych tekstur zmiennoprzecinkowych
- Atrybut adapterInfo interfejsu GPUDevice
- Konfigurowanie kontekstu obszaru roboczego z nieprawidłowym formatem powoduje błąd JavaScriptu
- Ograniczenia dotyczące próbkowania filtrowania tekstur
- Rozszerzone eksperymenty z podgrupami
- Ulepszanie środowiska dewelopera
- Eksperymentalna obsługa 16-bitowych znormalizowanych formatów tekstur
- Aktualizacje Dawn
Chrome 131
- Odległości przycinania w WGSL
- GPUCanvasContext getConfiguration()
- Elementy podstawowe punktów i linii nie mogą mieć przesunięcia głębi
- Wbudowane funkcje skanowania inkluzywnego dla podgrup
- Eksperymentalna obsługa wielokrotnego rysowania pośredniego
- Opcja kompilacji modułu cieniującego: ścisła matematyka
- Usunięcie GPUAdapter requestAdapterInfo()
- Aktualizacje Dawn
Chrome 130
- Mieszanie z 2 źródeł
- Skrócenie czasu kompilacji cieniowania w Metal
- Wycofanie metody GPUAdapter requestAdapterInfo()
- Aktualizacje Dawn
Chrome 129
- Obsługa HDR z trybem mapowania tonów obszaru roboczego
- Rozszerzona obsługa podgrup
- Aktualizacje Dawn
Chrome 128
- Eksperymentowanie z podgrupami
- Wycofanie ustawienia przesunięcia głębi dla linii i punktów
- Ukrywanie ostrzeżenia Narzędzi deweloperskich o nieprzechwyconym błędzie, jeśli wywołano preventDefault
- WGSL interpolate sampling first and either
- Aktualizacje Dawn
Chrome 127
- Eksperymentalna obsługa OpenGL ES na Androidzie
- Atrybut info GPUAdapter
- Ulepszenia interoperacyjności WebAssembly
- Ulepszone błędy kodera poleceń
- Aktualizacje Dawn
Chrome 126
- Zwiększenie limitu maxTextureArrayLayers
- Optymalizacja przesyłania bufora dla backendu Vulkan
- Skrócenie czasu kompilacji shaderów
- Przesłane bufory poleceń muszą być unikalne
- Aktualizacje Dawn
Chrome 125
Chrome 124
- Tekstury pamięci masowej tylko do odczytu oraz do odczytu i zapisu
- Obsługa skryptów service worker i shared worker
- Nowe atrybuty informacji o adapterze
- Poprawki błędów
- Aktualizacje Dawn
Chrome 123
- Obsługa funkcji wbudowanych DP4a w WGSL
- Nieograniczone parametry wskaźników w WGSL
- Lukier składniowy do wyłuskiwania elementów wieloskładnikowych w WGSL
- Oddzielny stan tylko do odczytu dla aspektów szablonu i głębi
- Aktualizacje Dawn
Chrome 122
- Zwiększanie zasięgu dzięki trybowi zgodności (funkcja w trakcie opracowywania)
- Zwiększenie limitu maxVertexAttributes
- Aktualizacje Dawn
Chrome 121
- Obsługa WebGPU na Androidzie
- Używanie DXC zamiast FXC do kompilacji programów do cieniowania w systemie Windows
- Zapytania o sygnatury czasowe w przebiegach obliczeń i renderowania
- Domyślne punkty wejścia do modułów cieniowania
- Obsługa display-p3 jako przestrzeni barw GPUExternalTexture
- Informacje o stertach pamięci
- Aktualizacje Dawn
Chrome 120
- Obsługa 16-bitowej reprezentacji zmiennoprzecinkowej w WGSL
- Przekraczaj granice
- Zmiany stanu bufora głębokości i bufora szablonowego
- Aktualizacje informacji o adapterze
- Kwantyzacja zapytań dotyczących sygnatur czasowych
- Funkcje wiosennych porządków
Chrome 119
- Tekstury 32-bitowe zmiennoprzecinkowe z możliwością filtrowania
- Format wierzchołków unorm10-10-10-2
- Format tekstury rgb10a2uint
- Aktualizacje Dawn
Chrome 118
- Obsługa HTMLImageElement i ImageData w
copyExternalImageToTexture() - Eksperymentalna obsługa tekstur pamięci masowej do odczytu i zapisu oraz tylko do odczytu
- Aktualizacje Dawn
Chrome 117
- Usuń ustawienie bufora wierzchołków
- Usuwanie grupy powiązań
- Ignorowanie błędów asynchronicznego tworzenia potoku w przypadku utraty urządzenia
- Aktualizacje tworzenia modułu cieniowania SPIR-V
- Ulepszanie środowiska dewelopera
- Potoki buforowania z automatycznie generowanym układem
- Aktualizacje Dawn
Chrome 116
- Integracja z WebCodecs
- Utracone urządzenie zwrócone przez GPUAdapter
requestDevice() - Płynne odtwarzanie filmu po wywołaniu metody
importExternalTexture() - Zgodność ze specyfikacją
- Ulepszanie środowiska dewelopera
- Aktualizacje Dawn
Chrome 115
- Obsługiwane rozszerzenia języka WGSL
- Eksperymentalna obsługa Direct3D 11
- Domyślne używanie dedykowanej karty graficznej przy zasilaniu sieciowym
- Ulepszanie środowiska dewelopera
- Aktualizacje Dawn
Chrome 114
- Optymalizacja kodu JavaScript
- getCurrentTexture() na nieskonfigurowanym elemencie canvas zwraca błąd InvalidStateError
- Aktualizacje WGSL
- Aktualizacje Dawn