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

بعد استدعاء GPUCanvasContext configure() باستخدام قاموس إعدادات، تتيح لك طريقة GPUCanvasContext getConfiguration() التحقّق من إعدادات سياق لوحة الرسم. ويشمل 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): تعرض مجموع عمليات البحث الشاملة لجميع عمليات الاستدعاء النشطة values في المجموعة الفرعية.
  • subgroupInclusiveMul(value): تعرض هذه السمة ناتج ضرب عمليات البحث الشاملة النشطة value في المجموعة الفرعية.

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

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

إلى أن يتم توحيد هذه الميزة التجريبية، فعِّل الميزة التجريبية "Unsafe WebGPU Support" على 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();

Shader module compilation option strict math

تمت إضافة خيار المطوّرين المنطقي 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 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