الميزات الجديدة في WebGPU (الإصدار 155-156 من Chrome)

إضافة WGSL fragment_depth

في عمليات العرض التي تتطلّب الكثير من الأشكال الهندسية، تكون تحسينات Early-Z هي الأفضل للمطوّرين. وهي توفّر تحسينًا كبيرًا في الأداء من خلال السماح لوحدة معالجة الرسومات (GPU) بتجاهل وحدات البكسل المخفية قبل تشغيل برامج تظليل الأجزاء المكلفة. إذا لم يجتَز عمق مرسَمل اختبار العمق، ستتخطّى وحدة معالجة الرسومات برنامج تظليل الأجزاء بالكامل، شرط ألا يكون لبرنامج التظليل آثار جانبية أخرى.

إذا أردت معرفة المزيد عن طريقة تعامل الأجهزة مع هذه المشكلة، يمكنك الاطّلاع على مقالة MJP الممتازة حول متى يجب إيقاف ميزة Early-Z؟.

على الرغم من أنّ تعديل العمق المخصّص مفيد، إلا أنّ تنفيذه في برنامج تظليل الأجزاء يفرض ضريبة خفية. تؤدي الكتابة إلى @builtin(frag_depth) داخل أداة تظليل الأجزاء عادةً إلى إجبار برامج التشغيل على إيقاف تحسينات Z المبكرة هذه لطلب الرسم بأكمله. يحدث ذلك لأنّ إرشادات السائق لا يمكنها ضمان تطابق عمق الناتج المحسوب من خلال برنامج التظليل مع العمق الذي تم استيفاؤه بواسطة برنامج التحويل إلى صورة نقطية.

لحلّ مشكلة انخفاض الأداء هذه، تتيح لك إضافة WGSL fragment_depth تحديد اسم وضع العمق less أو greater في @builtin(frag_depth) لتوضيح كيفية مقارنة العمق المكتوب بالعمق المستكمَل، ما يتيح لوحدة معالجة الرسومات تطبيق تحسينات early-Z بأمان.

يمكن رصد توفّر إضافة اللغة هذه في JavaScript باستخدام 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;
  }`,
});

ضغط غير متوافق مع نسيج الصورة

تتيح ميزة وحدة معالجة الرسومات "texture-compression-unaligned" إنشاء مواد عرض مضغوطة بأبعاد ليست مضاعفات صحيحة لحجم الكتلة (مثل 4x4 لتنسيقات 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"],
});

نشكر المساهم الخارجي إغناسيو كاستانيو على جهوده في تطوير هذه الميزة.

مساحتا الألوان srgb-linear وdisplay-p3-linear

من خلال إضافة مساحتَي الألوان المحدّدتين مسبقًا "srgb-linear" و "display-p3-linear"، يمكن الآن عرض سياق لوحة العرض WebGPU مباشرةً في مساحات الألوان الخطية ذات النطاق الموسّع لتتوافق مع شاشات الألوان ذات التدرّج اللوني الواسع. تحافظ مساحات الألوان هذه على علاقة خطية بين قيم البكسل والسطوع الفعلي. وهذا يجعلها مثالية لعرض الضوء المادي في الألعاب، بالإضافة إلى مهام المعالجة المكانية، مثل التنعيم والتقريب والتقليل. يمكنك الاطّلاع على نية الشحن وعينة الجزيئات (HDR) في طلب السحب رقم 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" هو تنسيق مضغوط بحجم 32 بت يتضمّن أربع قيم عادية موقّعة: ثلاثة مكوّنات بحجم 10 بت (r, g, b) ومكوّن واحد بحجم 2 بت (a). باستخدام هذا التنسيق، يمكنك تخزين السمات بكفاءة، مثل متّجهات عادية ثلاثية الأبعاد مع عدد قياسي إضافي بحجم 2 بت أو علامة محاذاة مع توفير نطاق ترددي للذاكرة. راجِع مواصفات طلب السحب 6491.

f16 support on Linux for NVIDIA

تتوفّر الآن على Linux ميزة "shader-f16" الاختيارية التي تتيح استخدام قيم الفاصلة العائمة ذات 16 بت في WGSL، وذلك لأحدث برامج تشغيل وحدات معالجة الرسومات من NVIDIA. راجِع المشكلة chromium:42251215.

تعديلات الفجر

يمكنك الآن طلب البحث عن المعرّف الفريد محليًا (LUID) الخاص بـ DXGIAdapter الأساسي لمحوّل وحدة معالجة الرسومات (GPU) معيّن باستخدام بنية WGPUAdapterPropertiesD3D. راجِع المشكلة 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