ویژگی‌های جدید WebGPU (Chrome 155-156)

افزونه WGSL fragment_depth

در گذر رندرینگ با هندسه فشرده، بهینه‌سازی‌های Z اولیه بهترین دوست توسعه‌دهندگان است. این ویژگی با اجازه دادن به GPU برای کنار گذاشتن پیکسل‌های پنهان قبل‌از اجرای سایه‌زن‌های قطعه گران‌قیمت، عملکرد را به‌طور چشمگیری افزایش می‌دهد. اگر عمق شطرنجی‌شده در آزمون عمق ناموفق باشد، GPU به‌طور کامل از سایه‌زن قطعه صرف‌نظر می‌کند، به‌شرطی که سایه‌زن اثرات جانبی دیگری نداشته باشد.

اگر می‌خواهید درباره نحوه مدیریت سخت‌افزار این موضوع بیشتر بدانید، MJP مقاله‌ای عالی درباره چه زمانی باید Early-Z غیرفعال شود؟ نوشته است.

اگرچه دستکاری عمق سفارشی مفید است، اما انجام آن در سایه‌زن تکه‌تکه هزینه پنهانی دارد. نوشتن در @builtin(frag_depth) درون سایه‌زن تکه‌تکه معمولاً درایورها را مجبور می‌کند این بهینه‌سازی‌های Z اولیه را برای کل فراخوانی رسم غیرفعال کنند. این اتفاق به این دلیل رخ می‌دهد که اکتشافات راننده نمی‌تواند تضمین کند که عمق برونداد محاسبه‌شده سایه‌زن با عمق میان‌یابی‌شده توسط شطرنجی‌کننده مطابقت دارد.

برای رفع این جریمه عملکرد، افزونه WGSL fragment_depth به شما امکان می‌دهد نام حالت عمق less یا greater را در @builtin(frag_depth) مشخص کنید تا به‌طور صریح بیان کنید که عمق نوشته‌شده چگونه با عمق درونیابی‌شده مقایسه می‌شود و به GPU امکان می‌دهد بهینه‌سازی‌های Z اولیه را به‌طور ایمن اعمال کند.

این افزونه زبان را می‌توان بااستفاده از navigator.gpu.wgslLanguageFeatures در جاوا اسکریپت تشخیص ویژگی داد. توصیه می‌شود از یک دستور requires برای نشان دادن احتمال غیرقابل انتقال بودن با requires fragment_depth; در بالای کد سایه‌زن WGSL خود استفاده کنید. مثال زیر و قصد ارسال را ببینید.

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

فشرده‌سازی بافت ناهم‌تراز

ویژگی GPU «texture-compression-unaligned» امکان ایجاد بافت‌های فشرده با ابعادی که مضرب صحیح اندازه بلوک نیستند (مانند ۴x۴ برای قالب‌های BC،‏ ETC2، و ASTC) را فراهم می‌کند. قبلاً، WebGPU به‌طور دقیق نیاز داشت که اندازه‌های بافت با این مرزهای بلوک هم‌تراز باشند. با حذف نیاز به پر کردن یا مقیاس‌بندی بافت‌ها برای تطبیق با ترازهای بلوک، این ویژگی وفاداری فشرده‌سازی اصلی را حفظ می‌کند بدون اینکه اعوجاج مقیاس‌بندی ایجاد کند. هدف ارسال را ببینید.

تکه کد زیر بررسی می‌کند که آیا آداپتور از فشرده‌سازی بافت ناهم‌تراز پشتیبانی می‌کند یا نه و درصورت دردسترس بودن، دستگاهی با آن درخواست می‌کند.

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

از همیار خارجی Ignacio Castaño به‌خاطر پیشبرد این ویژگی بسیار سپاس‌گزاریم!

فضاهای رنگی srgb-linear و display-p3-linear

با افزودن فضاهای رنگی ازپیش تعریف‌شده «srgb-linear» و «display-p3-linear»، بافت بوم WebGPU اکنون می‌تواند مستقیماً در فضاهای رنگی خطی با محدوده گسترده رندر کند تا از نمایشگرهای با گستره رنگی وسیع پشتیبانی کند. این فضاهای رنگی رابطه خطی بین مقادیر پیکسل و روشنایی فیزیکی را حفظ می‌کنند. این امر آن‌ها را برای رندرینگ نور فیزیکی در بازی‌ها و همچنین وظایف پردازش فضایی مانند ضدعلی‌گرایی، میان‌یابی و کاهش تراکم ایده‌آل می‌کند. به قصد ارسال و نمونه ذرات (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",
});

قالب رأس snorm10-10-10-2 اضافی

قالب رأس «snorm10-10-10-2» قالبی فشرده ۳۲ بیتی است که چهار مقدار نرمال‌سازی‌شده علامت‌دار را دربرمی‌گیرد: سه مؤلفه ۱۰ بیتی (r, g, b) و یک مؤلفه ۲ بیتی (a). با این قالب، می‌توانید مشخصه‌ها را به‌طور کارآمد ذخیره کنید، مثلاً بردارهای نرمال سه‌بعدی با یک اسکالر ۲ بیتی اضافی یا پرچم تراز کردن، و درعین‌حال پهنای باند حافظه را ذخیره کنید. spec PR 6491 را ببینید.

پشتیبانی f16 در Linux برای NVIDIA

ویژگی اختیاری «shader-f16» که از مقادیر ممیز شناور ۱۶ بیتی در WGSL پشتیبانی می‌کند، اکنون در Linux برای درایورهای جدید GPU NVIDIA پشتیبانی می‌شود. issue chromium:42251215 را ببینید.

به‌روزرسانی‌های سپیده‌دم

اکنون می‌توانید بااستفاده از ساختار WGPUAdapterPropertiesD3D، LUID مربوط به DXGIAdapter زیربنایی را برای آداپتور GPU معینی پُرسمان کنید. issue chromium:562849566 را ببینید.

این ویدیو برخی‌از نکات برجسته کلیدی را پوشش می‌دهد. فهرست کامل تعهدات را بررسی کنید.

ویژگی‌های جدید WebGPU

فهرستی از همه مواردی که در مجموعه ویژگی‌های جدید WebGPU پوشش داده شده است.

‫۱۵۵-۱۵۶ Chrome

‫۱۵۳-۱۵۴ Chrome

Chrome 151-152

‫۱۴۹-۱۵۰ Chrome

‫۱۴۷-۱۴۸ Chrome

‫۱۴۶ Chrome

‫Chrome 145

‫۱۴۴ Chrome

‫۱۴۳ Chrome

‫۱۴۲ Chrome

Chrome 141

‫۱۴۰ Chrome

Chrome 139

‫Chrome 138

Chrome 137

‫Chrome 136

‫۱۳۵ Chrome

‫۱۳۴ Chrome

‫Chrome 133

‫۱۳۲ Chrome

‫۱۳۱ Chrome

‫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