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

François Beaufort
François Beaufort

التوافق مع النطاق العالي الديناميكية (HDR) في وضع "تطابق الألوان على لوحة العرض"

تتوفّر خيارات محدودة لمطوّري الويب لعرض محتوى HDR، إذ يعتمدون بشكل أساسي على العنصرَين <img> و<video>. ومع ذلك، يظل عنصر <canvas> محصورًا في محتوى النطاق الديناميكي العادي (SDR). يتطلّب إنشاء محتوى بنطاق عالي الديناميكية (HDR) ديناميكي ضمن لوحة عرض ترميز محتواه كصورة بنطاق عالي الديناميكية قبل عرضه (للاطّلاع على مثال، راجِع هذا العرض التوضيحي).

تتيح المَعلمة الجديدة GPUCanvasToneMappingMode في إعدادات لوحة العرض WebGPU الآن لواجهة برمجة التطبيقات WebGPU رسم ألوان أكثر سطوعًا من الأبيض (#FFFFFF)، وذلك من خلال الأوضاع التالية:

  • "standard": يقتصر السلوك التلقائي على نطاق SDR للشاشة. يتم تحقيق هذا الوضع من خلال حصر جميع قيم الألوان في مساحة ألوان الشاشة على الفاصل الزمني [0, 1].

  • "extended": تتيح استخدام النطاق الكامل للشاشة المتوافق مع HDR. يطابق هذا الوضع "standard" في نطاق [0, 1] من الشاشة. يتم تثبيت أو عرض النطاق الديناميكي الموسّع للشاشة ولكن ليس [0, 1].

يوضّح مقتطف الرمز التالي كيفية ضبط لوحة عرض بنطاق ديناميكي عالٍ.

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",
  toneMapping: { mode: "extended" },
});

يمكنك استكشاف تقنية HDR باستخدام WebGPU من خلال الاطّلاع على نموذج الجسيمات (HDR) ومثال WebGPU HDR، والاطّلاع على إدخال chromestatus.

كمبيوتر محمول مزوّد بشاشة HDR تعرض صورة نابضة بالحياة
عينة "الجسيمات" (نطاق عالي الديناميكية) معروضة على شاشة نطاق عالي الديناميكية

توفير المزيد من المجموعات الفرعية

بعد الإعلان عن تجربة المجموعات الفرعية، أصبحت وظائف المجموعات الفرعية المضمّنة متاحة للاستخدام في كل من برامج التظليل الحسابية وبرامج تظليل الأجزاء. لم تعُد مقتصرة على برامج التظليل الحسابية فقط. اطّلِع على المشكلة 354738715.

يُرجى العِلم أنّ القيمة المضمّنة subgroup_size تتضمّن أخطاء حاليًا في برامج تظليل الأجزاء. تجنَّبها في الوقت الحالي.

بالإضافة إلى ذلك، تمت إضافة دوال مضمّنة لمجموعة فرعية على النحو التالي:

  • subgroupAdd(value): تعرض هذه السمة مجموع جميع عمليات الاستدعاء النشطة value في المجموعة الفرعية.
  • subgroupExclusiveAdd(value): تعرض مجموع عمليات الفحص الحصرية لجميع عمليات الاستدعاء النشطة values في المجموعة الفرعية.
  • subgroupMul(value): تعرض ناتج ضرب جميع عمليات الاستدعاء النشطة value في المجموعة الفرعية.
  • subgroupExclusiveMul(value): تعرض هذه السمة حاصل ضرب عمليات البحث الحصرية لجميع عمليات الاستدعاء النشطة value في المجموعة الفرعية.

  • subgroupAnd(value): تعرض عملية AND الثنائية لجميع عمليات الاستدعاء النشطة value على مستوى المجموعة الفرعية.
  • subgroupOr(value): تعرض هذه السمة قيمة OR الثنائية لجميع عمليات الاستدعاء النشطة values في المجموعة الفرعية.
  • subgroupXor(value): تعرض هذه السمة قيمة XOR الثنائية لجميع عمليات الاستدعاء النشطة values في المجموعة الفرعية.

  • subgroupMin(value): تعرض الحدّ الأدنى لجميع عمليات الاستدعاء النشطة values في المجموعة الفرعية.
  • subgroupMax(value): تعرض الحد الأقصى لقيمة جميع عمليات الاستدعاء النشطة value في المجموعة الفرعية.

  • subgroupAll(value): تعرض القيمة "صحيح" إذا كانت قيمة value صحيحة لجميع عمليات الاستدعاء النشطة في المجموعة الفرعية.
  • subgroupAny(value): تعرض القيمة "صحيح" إذا كانت قيمة value صحيحة لأي استدعاء نشط في المجموعة الفرعية.

  • subgroupElect(): تعرض القيمة "صحيح" إذا كان هذا الاستدعاء يتضمّن أدنى قيمة subgroup_invocation_id بين الاستدعاءات النشطة في المجموعة الفرعية.
  • subgroupBroadcastFirst(value): يبث value من الاستدعاء النشط الذي يتضمّن أقل قيمة subgroup_invocation_id في المجموعة الفرعية إلى جميع الاستدعاءات النشطة الأخرى.

  • subgroupShuffle(value, id): تعرض هذه السمة value من عملية الاستدعاء النشطة التي تتطابق فيها subgroup_invocation_id مع id.
  • subgroupShuffleXor(value, mask): تعرض هذه السمة value من عملية الاستدعاء النشطة التي تتطابق فيها subgroup_invocation_id مع subgroup_invocation_id ^ mask. يجب أن يكون mask موحّدًا بشكل ديناميكي.
  • subgroupShuffleUp(value, delta): تعرض هذه السمة value من عملية الاستدعاء النشطة التي تتطابق فيها subgroup_invocation_id مع subgroup_invocation_id - delta.
  • subgroupShuffleDown(value, delta): تعرض هذه السمة value من عملية الاستدعاء النشطة التي تتطابق فيها subgroup_invocation_id مع subgroup_invocation_id + delta.

  • quadBroadcast(value, id): بث value من طلب الاستدعاء الرباعي الذي يكون معرّفه مساويًا id. يجب أن يكون id تعبيرًا ثابتًا.
  • quadSwapX(value): يبدّل value بين عمليات الاستدعاء في الرباعي في الاتجاه X.
  • quadSwapY(value): يبدّل value بين عمليات الاستدعاء في الرباعي في الاتجاه Y.
  • quadSwapDiagonal(value): تبدّل value بين عمليات الاستدعاء في المربّع قطريًا.

إشعارات الفجر

يتضمّن البنية wgpu::PrimitiveState الآن إعدادات التحكّم في قص العمق مباشرةً، ما يلغي الحاجة إلى بنية wgpu::PrimitiveDepthClipControl منفصلة. لمزيد من المعلومات، اطّلِع على مقتطف الرمز التالي وطلب السحب webgpu-headers.

// Before
wgpu::PrimitiveState primitive = {};
wgpu::PrimitiveDepthClipControl depthClipControl;
depthClipControl.unclippedDepth = true;
primitive.nextInChain = &depthClipControl;
// Now
wgpu::PrimitiveState primitive = {};
primitive.unclippedDepth = true;

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

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

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

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