WebGPU'daki Yenilikler (Chrome 155-156)

WGSL fragment_depth uzantısı

Geometri yoğunluklu oluşturma geçişlerinde, erken Z optimizasyonları geliştiricilerin en iyi dostudur. GPU'nun pahalı parça gölgelendiricileri çalıştırmadan önce gizli pikselleri atmasına izin vererek büyük bir performans artışı sağlarlar. Rasterleştirilmiş bir derinlik, derinlik testini geçemezse GPU, gölgelendiricinin başka yan etkileri olmaması koşuluyla parça gölgelendiriciyi tamamen atlar.

Donanımın bu durumu nasıl ele aldığını öğrenmek isterseniz MJP'nin When Does Early-Z Have to be Disabled? (Erken Z Ne Zaman Devre Dışı Bırakılmalıdır?) başlıklı mükemmel makalesini inceleyebilirsiniz.

Özel derinlik manipülasyonu yararlı olsa da bunu parça gölgelendiricinizde yapmak gizli bir maliyetle birlikte gelir. Bir parça gölgelendiricinin içinde @builtin(frag_depth)'ya yazmak genellikle sürücüleri, bu erken Z optimizasyonlarını tüm çizim çağrısı için devre dışı bırakmaya zorlar. Bunun nedeni, sürücü sezgisinin, gölgelendiricinin hesaplanan çıkış derinliğinin rasterleştirici tarafından enterpolasyon yapılan derinlikle eşleşmesini garanti edememesidir.

Bu performans cezasını gidermek için WGSL uzantısı fragment_depth, @builtin(frag_depth) üzerinde less veya greater derinlik modu adı belirtmenize olanak tanır. Böylece, yazılan derinliğin enterpolasyonlu derinlikle nasıl karşılaştırıldığı açıkça belirtilir ve GPU'nun erken Z optimizasyonlarını güvenli bir şekilde uygulaması sağlanır.

Bu dil uzantısı, navigator.gpu.wgslLanguageFeatures kullanılarak JavaScript'te özellik olarak algılanabilir. WGSL gölgelendirici kodunuzun en üstünde requires fragment_depth; ile taşınabilirlik dışı olma olasılığını belirtmek için requires-directive kullanmanız önerilir. Aşağıdaki örneğe ve intent to ship'e (gönderime hazırlık) bakın.

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

Doku sıkıştırması hizalanmamış

"texture-compression-unaligned" GPU özelliği, blok boyutunun tam sayı katları olmayan boyutlara (ör. BC, ETC2 ve ASTC biçimleri için 4x4) sahip sıkıştırılmış dokular oluşturulmasına olanak tanır. Daha önce WebGPU, doku boyutlarının bu blok sınırlarıyla kesinlikle uyumlu olmasını gerektiriyordu. Bu özellik, dokuların blok hizalamalarına uyacak şekilde doldurulması veya ölçeklendirilmesi ihtiyacını ortadan kaldırarak ölçeklendirme distorsiyonu olmadan orijinal sıkıştırma doğruluğunu korur. Gönderme amacı başlıklı makaleyi inceleyin.

Aşağıdaki kod snippet'i, adaptörün hizalanmamış doku sıkıştırmayı destekleyip desteklemediğini kontrol eder ve destekliyorsa bu özelliği içeren bir cihaz ister.

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

Bu özelliği geliştiren harici katkıda bulunan Ignacio Castaño'ya çok teşekkür ederiz.

srgb-linear ve display-p3-linear renk alanları

"srgb-linear" ve "display-p3-linear" önceden tanımlanmış renk alanlarının eklenmesiyle WebGPU tuval bağlamı artık geniş gamlı ekranları desteklemek için doğrudan geniş aralıklı doğrusal renk alanlarına işleyebilir. Bu renk alanları, piksel değerleri ile fiziksel parlaklık arasında doğrusal bir ilişki sürdürür. Bu nedenle, oyunlarda fiziksel ışık oluşturma ve uzamsal işleme görevleri (ör. kenar yumuşatma, enterpolasyon ve azaltma) için idealdirler. Gönderme amacı ve Parçacıklar (HDR) örnek PR #574'e bakın.

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

Ek snorm10-10-10-2 köşe biçimi

"snorm10-10-10-2" köşe biçimi, dört imzalı normalleştirilmiş değeri tutan sıkıştırılmış 32 bitlik bir biçimdir: üç 10 bitlik bileşen (r, g, b) ve bir 2 bitlik bileşen (a). Bu biçimle, bellek bant genişliğinden tasarruf ederken 3D normal vektörler gibi özellikleri ek bir 2 bitlik skaler veya hizalama işaretiyle verimli bir şekilde saklayabilirsiniz. Spec PR 6491'e bakın.

NVIDIA için Linux'ta f16 desteği

WGSL'de 16 bit kayan nokta değerleri için destek sağlayan isteğe bağlı "shader-f16" özelliği artık Linux'ta en yeni NVIDIA GPU sürücülerinde destekleniyor. chromium:42251215 sorununa bakın.

Dawn ile ilgili güncellemeler

Artık WGPUAdapterPropertiesD3D yapısını kullanarak belirli bir GPU bağdaştırıcısı için temel DXGIAdapter'ın LUID'sini sorgulayabilirsiniz. chromium:562849566 sorununa bakın.

Bu bölümde, öne çıkan bazı önemli noktalar ele alınmaktadır. Kapsamlı commit listesine göz atın.

WebGPU'daki yenilikler

WebGPU'daki Yenilikler serisinde ele alınan tüm konuların listesi.

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