Nowości w WebGPU (Chrome 155–156)

Rozszerzenie WGSL fragment_depth

W przypadku przejść renderowania wymagających dużej ilości geometrii optymalizacje wczesnego Z są bardzo przydatne dla deweloperów. Zapewniają one ogromny wzrost wydajności, ponieważ umożliwiają GPU odrzucanie ukrytych pikseli przed uruchomieniem kosztownych shaderów fragmentów. Jeśli rasteryzowana głębia nie przejdzie testu głębi, procesor graficzny całkowicie pominie cieniowanie fragmentów, pod warunkiem że nie ma ono innych efektów ubocznych.

Jeśli chcesz dowiedzieć się więcej o tym, jak sprzęt sobie z tym radzi, MJP przygotował świetny artykuł na temat kiedy należy wyłączyć wczesne Z.

Niestandardowe manipulowanie głębią jest przydatne, ale wykonywanie go w programie cieniującym fragmenty wiąże się z ukrytym kosztem. Zapisywanie w @builtin(frag_depth) w shaderze fragmentów zwykle zmusza sterowniki do wyłączenia tych optymalizacji wczesnego Z dla całego wywołania rysowania. Dzieje się tak, ponieważ heurystyka sterownika nie może zagwarantować, że obliczona głębia wyjściowa shadera będzie zgodna z głębią interpolowaną przez rasteryzator.

Aby uniknąć tego spadku wydajności, rozszerzenie WGSL fragment_depth umożliwia określenie nazwy trybu głębi less lub greater w funkcji @builtin(frag_depth), aby wyraźnie określić, jak zapisana głębia ma się do interpolowanej głębi. Dzięki temu procesor graficzny może bezpiecznie stosować optymalizacje wczesnego Z.

To rozszerzenie języka można wykryć w JavaScript za pomocą funkcji navigator.gpu.wgslLanguageFeatures. Zalecamy użycie dyrektywy requires, aby zasygnalizować potencjalną nieprzenośność za pomocą znaku requires fragment_depth; na początku kodu shadera WGSL. Zapoznaj się z tym przykładem i intencją wysyłki.

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;
  }`,
});

Niezgodna kompresja tekstury

Funkcja GPU „texture-compression-unaligned” umożliwia tworzenie skompresowanych tekstur o wymiarach, które nie są wielokrotnością rozmiaru bloku (np. 4x4 w przypadku formatów BC, ETC2 i ASTC). Wcześniej WebGPU wymagało, aby rozmiary tekstur były zgodne z tymi granicami bloków. Dzięki wyeliminowaniu konieczności uzupełniania lub skalowania tekstur w celu dopasowania ich do wyrównania bloków ta funkcja zachowuje oryginalną wierność kompresji bez wprowadzania zniekształceń związanych ze skalowaniem. Zapoznaj się z zamiarem wysyłki.

Poniższy fragment kodu sprawdza, czy adapter obsługuje nieuporządkowaną kompresję tekstur, a jeśli tak, wysyła żądanie 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ółpracownikowi Ignacio Castaño za wprowadzenie tej funkcji.

przestrzenie kolorów srgb-linear i display-p3-linear;

Dzięki dodaniu wstępnie zdefiniowanych przestrzeni kolorów „srgb-linear” i „display-p3-linear” kontekst płótna WebGPU może teraz renderować bezpośrednio w liniowych przestrzeniach kolorów o rozszerzonym zakresie, aby obsługiwać wyświetlacze o szerokiej gamie kolorów. Te przestrzenie kolorów zachowują liniową zależność między wartościami pikseli a luminancją fizyczną. Dzięki temu idealnie nadają się do renderowania światła w grach, a także do zadań związanych z przetwarzaniem przestrzennym, takich jak wygładzanie krawędzi, interpolacja i decymacja. Zapoznaj się z informacją o planowanym wdrożeniu i przykładowym żądaniem pull request dotyczącym cząsteczek (HDR) nr 574.

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łka snorm10-10-10-2

Format wierzchołka „snorm10-10-10-2” to spakowany 32-bitowy format zawierający 4 podpisane znormalizowane wartości: 3 10-bitowe komponenty (r, g, b) i 1 2-bitowy komponent (a). Ten format umożliwia wydajne przechowywanie atrybutów, takich jak 3-wymiarowe wektory normalne z dodatkowym 2-bitowym skalarem lub flaga wyrównania, przy jednoczesnym oszczędzaniu przepustowości pamięci. Zobacz specyfikację PR 6491.

Obsługa f16 w systemie Linux w przypadku kart 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 issue chromium:42251215.

Aktualizacje Dawn

Za pomocą struktury WGPUAdapterPropertiesD3D możesz teraz wysyłać zapytania o identyfikator LUID bazowego obiektu DXGIAdapter dla danego adaptera GPU. Zobacz issue chromium:562849566.

Obejmuje to najważniejsze aspekty. 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

Chrome 153–154

Chrome 151–152

Chrome 149-150

Chrome 147–148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113