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

François Beaufort
François Beaufort

مسافات القطع في WGSL

تتيح لك مسافات القطع تقييد حجم قطع العناصر الأساسية باستخدام أنصاف مساحات يحدّدها المستخدم في ناتج مرحلة الرأس. يمنحك تحديد مستويات القطع الخاصة بك تحكّمًا أكبر في العناصر المرئية في مشاهد WebGPU. تُعدّ هذه التقنية مفيدة بشكل خاص للتطبيقات، مثل برامج التصميم بمساعدة الكمبيوتر (CAD)، حيث يكون التحكّم الدقيق في التصور أمرًا بالغ الأهمية.

عندما تتوفّر ميزة "clip-distances" في GPUAdapter، اطلب GPUDevice باستخدام هذه الميزة للحصول على دعم لمسافات القص في WGSL، وفعِّل هذه الإضافة بشكلٍ صريح في رمز WGSL باستخدام enable clip_distances;. بعد تفعيلها، يمكنك استخدام مصفوفة clip_distances المضمّنة في أداة تظليل الرؤوس. تحتوي هذه المصفوفة على مسافات إلى مستوى قص يحدّده المستخدم:

  • تعني مسافة القطع 0 أنّ الرأس يقع على المستوى.
  • تعني المسافة الموجبة أنّ الرأس يقع داخل نصف مساحة القطع (الجانب الذي تريد الاحتفاظ به).
  • تعني المسافة السلبية أنّ الرأس يقع خارج نصف مساحة المقطع (الجانب الذي تريد تجاهله).

راجِع المقتطف التالي وإدخال chromestatus والمشكلة 358408571.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("clip-distances")) {
  throw new Error("Clip distances support is not available");
}
// Explicitly request clip distances support.
const device = await adapter.requestDevice({
  requiredFeatures: ["clip-distances"],
});

const vertexShaderModule = device.createShaderModule({ code: `
  enable clip_distances;

  struct VertexOut {
    @builtin(clip_distances) my_clip_distances : array<f32, 1>,
    @builtin(position) my_position : vec4f,
  }
  @vertex fn main() -> VertexOut {
    var output : VertexOut;
    output.my_clip_distances[0] = 1;
    output.my_position = vec4f(0, 0, 0, 1);
    return output;
  }
`,
});

// Send the appropriate commands to the GPU...

‫GPUCanvasContext getConfiguration()

بعد استدعاء configure() GPUCanvasContext باستخدام قاموس إعدادات، يتيح لك الإجراء getConfiguration() في GPUCanvasContext التحقّق من إعدادات سياق لوحة الرسم. ويشمل device وformat وusage وviewFormats وcolorSpace وtoneMapping وalphaMode أعضاء. يفيد ذلك في مهام مثل التحقّق مما إذا كان المتصفّح يتيح استخدام لوحة الرسم بنطاق HDR، كما هو موضّح في نموذج الجزيئات (HDR). راجِع المقتطف التالي وإدخال chromestatus والمشكلة 370109829.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");

// Configure the canvas for HDR.
context.configure({
  device,
  format: "rgba16float",
  toneMapping: { mode: "extended" },
});

const configuration = context.getConfiguration();
if (configuration.toneMapping.mode === "extended") {
  // The browser supports HDR canvas.
  // Warning! The user still needs a HDR display to enjoy HDR content.
}

يجب ألا تحتوي عناصر النقاط والخطوط الأساسية على انحياز العمق

كما أعلنّا سابقًا، يتيح الآن مواصفات WebGPU إمكانية ضبط depthBias وdepthBiasSlopeScale وdepthBiasClamp على قيمة غير صفرية عندما تكون طوبولوجيا مسار العرض من النوع خط أو نقطة، ما يؤدي إلى حدوث خطأ في التحقّق من الصحة. يمكنك الاطّلاع على المشكلة 352567424.

وظائف مدمَجة للمسح الشامل للمجموعات الفرعية

في إطار تجربة المجموعات الفرعية، تمت إضافة وظائف المجموعات الفرعية المضمّنة التالية في الإصدار 361330160:

  • ‫subgroupInclusiveAdd(value): تعرض هذه السمة مجموع عمليات الفحص الشاملة لجميع عمليات الاستدعاء النشطة value في المجموعة الفرعية.
  • ‫subgroupInclusiveMul(value): تعرض هذه السمة حاصل ضرب عمليات المسح الشامل لجميع عمليات الاستدعاء النشطة value في المجموعة الفرعية.

إتاحة ميزة "الرسم غير المباشر المتعدّد" التجريبية

تتيح لك ميزة "الرسم غير المباشر المتعدد" في وحدة معالجة الرسومات إصدار طلبات رسم متعددة باستخدام أمر واحد من وحدة معالجة الرسومات. ويكون هذا الإعداد مفيدًا بشكل خاص في الحالات التي يجب فيها عرض عدد كبير من العناصر، مثل أنظمة الجسيمات والنسخ المتطابق والمشاهد الكبيرة. لا يمكن لطريقتَي drawIndirect() وdrawIndexedIndirect() GPURenderPassEncoder إصدار طلب رسم واحد فقط في كل مرة من منطقة معيّنة في مخزن مؤقت لوحدة معالجة الرسومات.

إلى أن يتم توحيد هذه الميزة التجريبية، فعِّل الميزة التجريبية "تفعيل WebGPU غير الآمن" على chrome://flags/#enable-unsafe-webgpu لإتاحتها في Chrome.

عند توفّر ميزة "chromium-experimental-multi-draw-indirect" غير العادية لوحدة معالجة الرسومات في GPUAdapter، اطلب GPUDevice باستخدام هذه الميزة. بعد ذلك، أنشِئ GPUBuffer مع إذن الاستخدام GPUBufferUsage.INDIRECT لتخزين طلبات الرسم. يمكنك استخدامها لاحقًا في طريقتَي multiDrawIndirect() وmultiDrawIndexedIndirect() الجديدتَين في GPURenderPassEncoder لإصدار طلبات رسم داخل عملية عرض. راجِع المقتطف التالي والمشكلة 356461286.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-multi-draw-indirect")) {
  throw new Error("Experimental multi-draw indirect support is not available");
}
// Explicitly request experimental multi-draw indirect support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-multi-draw-indirect"],
});

// Draw call have vertexCount, instanceCount, firstVertex, and firstInstance parameters.
const drawData = new Uint32Array([
  3, 1, 0, 0, // First draw call
  3, 1, 3, 0, // Second draw call
]);
// Create a buffer to store the draw calls.
const drawBuffer = device.createBuffer({
  size: drawData.byteLength,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(drawBuffer, 0, drawData);

// Create a render pipeline, a vertex buffer, and a render pass encoder...

// Inside a render pass, issue the draw calls.
myPassEncoder.setPipeline(myPipeline);
myPassEncoder.setVertexBuffer(0, myVertexBuffer);
myPassEncoder.multiDrawIndirect(drawBuffer, /*offset=*/ 0, /*maxDrawCount=*/ 2);
myPassEncoder.end();

خيار تجميع وحدة التظليل الرياضي الصارم

تمت إضافة خيار المطوّرين المنطقي strictMath إلى GPUShaderModuleDescriptor للسماح لك بتفعيل أو إيقاف العمليات الحسابية الدقيقة أثناء تجميع وحدة تظليل. تتوفّر هذه الميزة خلف علامة "ميزات مطوّري WebGPU" في chrome://flags/#enable-webgpu-developer-features، ما يعني أنّها ميزة مخصّصة للاستخدام أثناء التطوير فقط. يمكنك الاطّلاع على المشكلة 42241455.

يتوافق هذا الخيار حاليًا مع Metal وDirect3D. عند إيقاف وضع "الرياضيات الدقيقة"، قد يحسّن المترجم برامج التظليل من خلال:

  • تجاهل إمكانية ظهور القيم NaN وInfinity
  • التعامل مع القيمة -0 على أنّها +0
  • استبدال القسمة بعملية ضرب أسرع بالمقلوب
  • إعادة ترتيب العمليات الحسابية استنادًا إلى الخصائص التجميعية والتوزيعية
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `
  // Examines the bit pattern of the floating-point number to
  // determine if it represents a NaN according to the IEEE 754 standard.
  fn isNan(x : f32) -> bool {
    bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
    bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
    return ones_exp && non_zero_sig;
  }
  // ...
`;

// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });

إزالة طريقة requestAdapterInfo() في GPUAdapter

الطريقة غير المتزامنة requestAdapterInfo() في GPUAdapter غير ضرورية، إذ يمكنك الحصول على GPUAdapterInfo بشكل متزامن باستخدام السمة info في GPUAdapter. وبالتالي، تمت الآن إزالة طريقة requestAdapterInfo() غير العادية في GPUAdapter. الاطّلاع على نية الإزالة

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

يقيس الملف التنفيذي tint_benchmark تكلفة ترجمة برامج التظليل من WGSL إلى كل لغة خلفية. يمكنك الاطّلاع على المستندات الجديدة لمعرفة المزيد عن هذه الميزة.

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

الميزات الجديدة في 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