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

إضافة fragment_depth في WGSL

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

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

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

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

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

نتوجّه بالشكر إلى المساهم الخارجي إغناسيو كاستانيو من spark.js على تطوير هذه الميزة والمواصفات ومجموعة اختبارات التوافق (CTS).

الفضاءات اللونية srgb-linear وdisplay-p3-linear

من خلال إضافة الفضاءات اللونية المحدّدة مسبقًا "srgb-linear" و "display-p3-linear"، يمكن الآن لسياق لوحة WebGPU عرض الصور مباشرةً في فضاءات لونية خطية ذات نطاق موسّع لإتاحة الشاشات ذات النطاق الواسع. تحافظ هذه الفضاءات اللونية على علاقة خطية بين قيم البكسل والسطوع المادي. وهذا يجعلها مثالية لعرض الإضاءة المادية في الألعاب بالإضافة إلى مهام المعالجة المكانية مثل مكافحة التعرج والاستيفاء والإهلاك. يمكنك الاطّلاع على الهدف من الشحن ونموذج الجسيمات (النطاق العالي الديناميكية) في طلب الدمج رقم 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 بت أو علامة محاذاة، مع توفير معدل نقل البيانات في الذاكرة. راجِع المواصفات PR 6491.

دعم f16 على Linux لـ NVIDIA

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

تحديثات Dawn

يمكنك الآن طلب البحث عن معرّف LUID الخاص بـ DXGIAdapter الأساسي لمحوّل GPU معيّن باستخدام بنية WGPUAdapterPropertiesD3D. يُرجى الاطّلاع على المشكلة chromium:562849566.

يغطي هذا بعض النقاط البارزة الرئيسية. اطّلِع على قائمة عمليات الإرسال الشاملة.

الميزات الجديدة في WebGPU

قائمة بكل ما تم تناوله في سلسلة الميزات الجديدة في WebGPU.

الإصداران 155 و156 من Chrome

الإصداران 153 و154 من Chrome

الإصداران 151 و152 من Chrome

الإصداران 149 و150 من Chrome

الإصداران 147 و148 من Chrome

الإصدار 146 من Chrome

الإصدار 145 من Chrome

Chrome 144

الإصدار 143 من Chrome

الإصدار 142 من Chrome

الإصدار 141 من Chrome

الإصدار 140 من Chrome

Chrome 139

الإصدار 138 من Chrome

الإصدار 137 من Chrome

الإصدار 136 من Chrome

الإصدار 135 من Chrome

الإصدار 134 من Chrome

الإصدار 133 من Chrome

الإصدار 132 من Chrome

الإصدار 131 من Chrome

Chrome 130

Chrome 129

الإصدار 128 من Chrome

الإصدار 127 من Chrome

الإصدار 126 من Chrome

Chrome 125

الإصدار 124 من Chrome

Chrome 123

الإصدار 122 من Chrome

Chrome 121

الإصدار 120 من Chrome

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

الإصدار 113 من Chrome