الميزات الجديدة في WebGPU (Chrome 119)

François Beaufort
François Beaufort

مواد زخرفية عائمة قابلة للفلترة بسعة 32 بت

تُستخدَم مواد العرض ذات النقطة العائمة بسعة 32 بت لتخزين البيانات العالية الدقة، مثل الصور ذات النطاق العالي الديناميكية وخرائط العمق. وهي مهمة بشكل خاص لوحدات معالجة الرسومات المستخدمة في الألعاب المتطورة والتطبيقات الاحترافية.

يصف خيار "إتاحة استخدام مواد النسيج التي تتضمّن أعدادًا كسرية بدقة 32 بت وقابلة للفلترة" قدرة وحدة معالجة الرسومات على فلترة مواد النسيج التي تتضمّن أعدادًا كسرية بدقة 32 بت. وهذا يعني أنّ وحدة معالجة الرسومات يمكنها تلطيف حواف مواد النسيج ذات النقطة العائمة، ما يجعلها تبدو أقل تعرُّجًا. وهو مشابه للإضافات "OES_texture_float_linear" في WebGL.

لا تتوافق بعض وحدات معالجة الرسومات مع استخدام مواد النسيج التي تتضمّن أعدادًا عائمة بسعة 32 بت وقابلة للفلترة. عندما تكون ميزة "float32-filterable" متاحة في GPUAdapter، يمكنك الآن طلب GPUDevice يتضمّن هذه الميزة وفلترة مواد النسيج باستخدام تنسيقات "r32float" و"rg32float" و "rgba32float". اطّلِع على المثال التالي والمشكلة dawn:1664.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-filterable")) {
  throw new Error("Filterable 32-bit float textures support is not available");
}
// Explicitly request filterable 32-bit float textures support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-filterable"],
});

// Create a sampler with linear filtering.
const sampler = device.createSampler({
  magFilter: "linear",
});

// Create a texture with rgba32float format.
const texture = device.createTexture({
  size: [100, 100],
  format: "rgba32float",
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});

// Write data to texture, create a bindgroup with sampler and texture and
// send the appropriate commands to the GPU....

تنسيق رؤوس unorm10-10-10-2

تمت إضافة تنسيق قمة جديد يُسمى "unorm10-10-10-2"، ويُعرف أيضًا باسم "rgb10a2"، إلى مواصفات WebGPU. وتتكوّن من قيمة واحدة مُجمَّعة بسعة 32 بت مع أربع قيم صحيحة غير موقَّعة تم تسويتها، وهي مُرتَّبة على النحو التالي: 10 بت و10 بت و10 بت و2 بت. اطّلِع على المثال التالي والإصدار dawn:2044.

// Define the layout of vertex attribute data with unorm10-10-10-2 format.
const buffers = [
  {
    arrayStride: 0,
    attributes: [
      { format: "unorm10-10-10-2", offset: 0, shaderLocation: 0 },
    ],
  },
];

// Describe the vertex shader entry point and its input buffer layouts.
const vertex = {
  module: myVertexShaderModule,
  entryPoint: "main",
  buffers,
};

// Pass vertex to device.createRenderPipeline() and
// use vec4<f32> type in WGSL shader code to manipulate data.

تنسيق الزخرفة rgb10a2uint

تمت إضافة تنسيق جديد للّوحة يُسمى "rgb10a2uint" إلى مواصفات WebGPU. يتألّف من تنسيق بكسل مُجمَّع بسعة 32 بت مع أربعة مكوّنات عددية غير موقَّعة: الأحمر بسعة 10 بت والأخضر بسعة 10 بت والأزرق بسعة 10 بت وقناة ألفا بسعة 2 بت. يُرجى الاطّلاع على المثال التالي وإصدار سمة dawn:1936.

// Create a texture with rgb10a2uint format.
const texture = device.createTexture({
  size: [100, 100],
  format: "rgb10a2uint",
  usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
});

// Write data to texture, create a bindgroup with texture and
// send the appropriate commands to the GPU....

آخر الأخبار من Dawn

تتيح طلبات البحث عن الطوابع الزمنية لتطبيقات WebGPU قياس الوقت الذي تستغرقه أوامر وحدة معالجة الرسومات بدقة (وصولاً إلى نانو ثانية). تم تعديل شكل واجهة برمجة التطبيقات لتسجيل طلبات البحث عن الطوابع الزمنية في بداية التصاريح ونهايتها بما يتوافق مع مواصفات WebGPU. اطّلِع على المثال التالي وissue dawn:1800.

// Create a timestamp query set that will store the timestamp values.
wgpu::QuerySetDescriptor querySetDescriptor = {
    .count = 2,
    .type = wgpu::QueryType::Timestamp};
wgpu::QuerySet querySet = device.CreateQuerySet(&querySetDescriptor);

wgpu::RenderPassTimestampWrites timestampWrites = {
    .querySet = querySet,
    .beginningOfPassWriteIndex = 0,
    .endOfPassWriteIndex = 1};
wgpu::ComputePassDescriptor pass{.timestampWrites = &timestampWrites};

// Write the queue timestamp into beginningOfPassWriteIndex and
// endOfPassWriteIndex of myQuerySet respectively before and after the pass
// commands execute.
myEncoder.BeginComputePass(&pass);

يتناول هذا فقط بعض النقاط الرئيسية. يمكنك الاطّلاع على قائمة الالتزامات الشاملة.

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

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

Chrome 131

Chrome 130

الإصدار 129 من Chrome

الإصدار 128 من Chrome

الإصدار 127 من Chrome

الإصدار 126 من Chrome

الإصدار 125 من Chrome

الإصدار 124 من Chrome

Chrome 123

Chrome 122

الإصدار 121 من Chrome

الإصدار 120 من Chrome

الإصدار 119 من Chrome

الإصدار 118 من Chrome

Chrome 117

Chrome 116

الإصدار 115 من Chrome

الإصدار 114 من Chrome

Chrome 113