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

افزونه fragment_depth در WGSL

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

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

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

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

این افزونه زبان را می‌توان بااستفاده از navigator.gpu.wgslLanguageFeatures در جاوا اسکریپت شناسایی کرد. توصیه می‌شود از دستورالعمل requires-directive برای نشان دادن احتمال عدم‌قابلیت انتقال با 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;
  }`,
});

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

ویژگی واحد پردازش گرافیکی «texture-compression-unaligned» امکان ایجاد بافت‌های فشرده با ابعادی را فراهم می‌کند که مضرب‌های صحیح اندازه بلوک نیستند (مانند ۴×۴ برای قالب‌های 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 از spark.js برای پیشبرد این ویژگی، مشخصات، و کار CTS بسیار سپاس‌گزاریم!

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

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

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

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

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

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

به‌روزرسانی‌های Dawn

اکنون می‌توانید بااستفاده از ساختار WGPUAdapterPropertiesD3D، شناسه منحصربه‌فرد محلی (LUID) مربوط به DXGIAdapter زیربنایی را برای یک آداپتور GPU مشخص پُرسمان کنید. مشکل chromium:562849566 را ببینید.

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

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

فهرستی از همه مواردی که در مجموعه جدیدترین‌های 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