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, maliyetli parça gölgelendiricileri çalıştırmadan önce gizli pikselleri silmesine olanak tanıyarak performansı önemli ölçüde artırır. Rasterleştirilmiş bir derinlik, derinlik testinde başarısız olursa GPU, gölgelendiricinin başka yan etkileri olmaması koşuluyla parça gölgelendiriciyi tamamen atlar.

Donanımın bu işlemi nasıl gerçekleştirdiğini öğrenmek istiyorsanız MJP'nin When Does Early-Z Have to be Disabled? (Early-Z Ne Zaman Devre Dışı Bırakılmalıdır?) başlıklı mükemmel makalesini okuyabilirsiniz.

Özel derinlik manipülasyonu faydalı olsa da bunu parça gölgelendiricinizde yapmanın gizli bir bedeli vardır. Parça gölgelendirici içinde @builtin(frag_depth) değerine yazma işlemi, genellikle sürücüleri tüm çekim çağrısı için bu erken Z optimizasyonlarını devre dışı bırakmaya zorlar. Bunun nedeni, sürücü sezgisel yöntemlerinin, gölgelendiricinin hesaplanan çıkış derinliğinin rasterleştirici tarafından enterpolasyon yapılan derinlikle eşleştiğini garanti edememesidir.

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

Bu dil uzantısı, navigator.gpu.wgslLanguageFeatures kullanılarak JavaScript'te özellik 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 (gönderme niyeti) bölümüne 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ırma hizalanmamış

<p>"texture-compression-unaligned" GPU özelliği, boyutları blok boyutunun tam sayı katları olmayan (BC, ETC2 ve ASTC biçimleri için 4x4 gibi) sıkıştırılmış dokuların oluşturulmasını sağlar. Daha önce WebGPU, doku boyutlarının bu blok sınırlarıyla tam olarak eşleşmesini gerektiriyordu. Bu özellik, dokuları blok hizalamalarına uyacak şekilde doldurma veya ölçeklendirme ihtiyacını ortadan kaldırarak ölçeklendirme bozulması olmadan orijinal sıkıştırma doğruluğunu korur. Gönderim niyeti bölümüne bakın.

Aşağıdaki kod snippet'i, adaptörün hizalanmamış doku sıkıştırmayı destekleyip desteklemediğini kontrol eder ve varsa 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ğin, spesifikasyonun ve CTS çalışmasının geliştirilmesine katkıda bulunan spark.js'den harici katkıda bulunan Ignacio Castaño'ya çok teşekkür ederiz.

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

"srgb-linear" ve "display-p3-linear" önceden tanımlanmış renk alanlarının eklenmesiyle WebGPU tuval bağlamı, geniş gamutlu ekranları desteklemek için artık doğrudan genişletilmiş aralıklı doğrusal renk alanlarında oluşturulabilir. Bu renk alanları, piksel değerleri ile fiziksel parlaklık arasında doğrusal bir ilişki sağlar. Bu sayede, oyunlarda fiziksel ışık oluşturma ve kenar yumuşatma, enterpolasyon ve desimasyon gibi uzamsal işleme görevleri için idealdir. Gönderim amacını ve Parçacıklar (HDR) örnek PR #574'ü inceleyin.

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 işaretli normalleştirilmiş değer içeren paketlenmiş 32 bitlik bir biçimdir: üç adet 10 bitlik bileşen (r, g, b) ve bir adet 2 bitlik bileşen (a). Bu biçim sayesinde, bellek bant genişliğinden tasarruf ederken ekstra 2 bitlik skaler içeren 3D normal vektörler veya hizalama işareti gibi özellikleri verimli bir şekilde depolayabilirsiniz. PR 6491 spesifikasyonuna 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 son NVIDIA GPU sürücüleri için Linux'ta destekleniyor. chromium:42251215 sorununa bakın.

Dawn ile ilgili güncellemeler

Artık WGPUAdapterPropertiesD3D yapısını kullanarak belirli bir GPU adaptörü için temel DXGIAdapter'ın LUID'sini sorgulayabilirsiniz. chromium:562849566 sorununa bakın.

Bu, öne çıkan konulardan bazılarını kapsar. İşlemelerin kapsamlı listesine göz atın.

WebGPU'daki yenilikler

WebGPU'daki yenilikler serisinde ele alınan her şeyin 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