Yang Baru di WebGPU (Chrome 155-156)

Ekstensi fragment_depth WGSL

Dalam proses rendering yang intensif secara geometri, pengoptimalan Z awal adalah sahabat terbaik developer. Teknologi ini memberikan peningkatan performa yang sangat besar dengan memungkinkan GPU menghapus piksel tersembunyi sebelum menjalankan shader fragmen yang mahal. Jika kedalaman yang di-rasterisasi gagal dalam pengujian kedalaman, GPU akan melewati shader fragmen sepenuhnya, asalkan shader tidak memiliki efek samping lainnya.

Jika Anda ingin membaca cara hardware menangani hal ini, MJP memiliki tulisan yang sangat bagus tentang When Does Early-Z Have to be Disabled?.

Meskipun manipulasi kedalaman kustom berguna, melakukannya di shader fragmen Anda akan menimbulkan biaya tersembunyi. Menulis ke @builtin(frag_depth) di dalam shader fragmen biasanya memaksa driver menonaktifkan pengoptimalan Z awal ini untuk seluruh panggilan gambar. Hal ini terjadi karena heuristik driver tidak dapat menjamin bahwa kedalaman output yang dihitung shader cocok dengan kedalaman yang diinterpolasi oleh rasterizer.

Untuk mengatasi penurunan performa ini, ekstensi WGSL fragment_depth memungkinkan Anda menentukan nama mode kedalaman less atau greater pada @builtin(frag_depth) untuk menyatakan secara eksplisit bagaimana kedalaman yang ditulis dibandingkan dengan kedalaman yang diinterpolasi, sehingga memungkinkan GPU menerapkan pengoptimalan Z awal dengan aman.

Ekstensi bahasa ini dapat dideteksi fiturnya di JavaScript menggunakan navigator.gpu.wgslLanguageFeatures. Sebaiknya gunakan direktif requires untuk menandakan potensi tidak portabel dengan requires fragment_depth; di bagian atas kode shader WGSL Anda. Lihat contoh dan niat untuk mengirimkan berikut.

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

Kompresi tekstur tidak selaras

Fitur GPU "texture-compression-unaligned" memungkinkan pembuatan tekstur terkompresi dengan dimensi yang bukan kelipatan bilangan bulat dari ukuran blok (seperti 4x4 untuk format BC, ETC2, dan ASTC). Sebelumnya, WebGPU secara ketat mewajibkan ukuran tekstur selaras dengan batas blok ini. Dengan menghilangkan kebutuhan untuk mengisi atau menskalakan tekstur agar sesuai dengan penyesuaian blok, fitur ini mempertahankan kualitas kompresi asli tanpa menimbulkan distorsi penskalaan. Lihat niat untuk mengirimkan.

Cuplikan kode berikut memeriksa apakah adaptor mendukung kompresi tekstur yang tidak selaras dan, jika tersedia, meminta perangkat yang memilikinya.

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

Terima kasih banyak kepada kontributor eksternal Ignacio Castaño dari spark.js yang telah mendorong pengembangan fitur, spesifikasi, dan CTS ini.

Ruang warna srgb-linear dan display-p3-linear

Dengan penambahan ruang warna bawaan "srgb-linear" dan "display-p3-linear", konteks kanvas WebGPU kini dapat merender langsung ke ruang warna linear rentang luas untuk mendukung tampilan gamut luas. Ruang warna ini mempertahankan hubungan linear antara nilai piksel dan luminansi fisik. Hal ini menjadikannya ideal untuk rendering cahaya fisik dalam game serta tugas pemrosesan spasial seperti anti-aliasing, interpolasi, dan decimation. Lihat niat untuk mengirimkan dan PR #574 contoh Partikel (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",
});

Format verteks snorm10-10-10-2 tambahan

Format verteks "snorm10-10-10-2" adalah format 32-bit yang dikemas dan menyimpan empat nilai yang dinormalisasi dan ditandatangani: tiga komponen 10-bit (r, g, b) dan satu komponen 2-bit (a). Dengan format ini, Anda dapat menyimpan atribut secara efisien, seperti vektor normal 3D dengan skalar 2-bit tambahan, atau tanda perataan sambil menghemat bandwidth memori. Lihat PR spesifikasi 6491.

Dukungan f16 di Linux untuk NVIDIA

Fitur "shader-f16" opsional, yang memberikan dukungan untuk nilai floating point 16-bit di WGSL, kini didukung di Linux untuk driver GPU NVIDIA terbaru. Lihat masalah chromium:42251215.

Info terbaru Dawn

Anda kini dapat membuat kueri LUID DXGIAdapter pokok untuk adaptor GPU tertentu menggunakan struct WGPUAdapterPropertiesD3D. Lihat masalah chromium:562849566.

Bagian ini mencakup beberapa sorotan utama. Lihat daftar commit yang lengkap.

Yang Baru di WebGPU

Daftar semua hal yang telah dibahas dalam seri Yang Baru di 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