موارد جدید در WebGPU (Chrome 131)

فرانسوا بوفور
François Beaufort

فواصل برش در WGSL

فواصل برش به شما این امکان را می‌دهد که حجم برش اولیه را با نیم‌فاصله‌های تعریف‌شده توسط کاربر در خروجی مرحله رأس محدود کنید. تعریف صفحات برش خودتان، کنترل بیشتری بر آنچه در صحنه‌های WebGPU شما قابل مشاهده است، می‌دهد. این تکنیک به‌ویژه برای برنامه‌هایی مانند نرم‌افزار CAD مفید است، جایی که کنترل دقیق بر تجسم بسیار مهم است.

وقتی ویژگی "clip-distances" در یک GPUAdapter موجود است، از یک GPUDevice با این ویژگی درخواست کنید تا پشتیبانی از فواصل کلیپ در WGSL را دریافت کند، و این افزونه را به طور صریح در کد WGSL خود با enable clip_distances; فعال کنید. پس از فعال شدن، می‌توانید از آرایه داخلی clip_distances در سایه‌زن رأس خود استفاده کنید. این آرایه فواصل را تا یک صفحه کلیپ تعریف شده توسط کاربر نگه می‌دارد:

  • فاصله برش ۰ به این معنی است که رأس روی صفحه قرار دارد.
  • فاصله مثبت به این معنی است که رأس درون نیم‌فضای کلیپ (همان طرفی که می‌خواهید نگه دارید) قرار دارد.
  • فاصله منفی به این معنی است که رأس خارج از نیم‌فضای کلیپ (ضلعی که می‌خواهید حذف کنید) قرار دارد.

به قطعه کد زیر، ورودی 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() به همراه یک دیکشنری پیکربندی، متد getConfiguration() به شما امکان می‌دهد پیکربندی زمینه بوم (canvas context) را بررسی کنید. این شامل اعضای device ، format ، usage ، viewFormats ، colorSpace ، toneMapping و alphaMode است. این تابع برای کارهایی مانند بررسی پشتیبانی مرورگر از بوم HDR، همانطور که در نمونه Particles (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 مراجعه کنید.

توابع داخلی اسکن فراگیر برای زیرگروه‌ها

به عنوان بخشی از آزمایش زیرگروه‌ها ، توابع داخلی زیرگروه زیر در شماره ۳۶۱۳۳۰۱۶۰ اضافه شده‌اند:

  • subgroupInclusiveAdd(value) : جمع اسکن فراگیر همه value فراخوانی‌های فعال s در سراسر زیرگروه را برمی‌گرداند.
  • subgroupInclusiveMul(value) : ضرب اسکن فراگیر همه value فراخوانی‌های فعال s در زیرگروه را برمی‌گرداند.

پشتیبانی آزمایشی از چند ترسیم غیرمستقیم

ویژگی multi-draw indirect GPU به شما امکان می‌دهد چندین فراخوانی draw را با یک دستور GPU واحد صادر کنید. این امر به ویژه در موقعیت‌هایی که تعداد زیادی از اشیاء نیاز به رندر شدن دارند، مانند سیستم‌های ذرات، نمونه‌سازی و صحنه‌های بزرگ، مفید است. متدهای drawIndirect() و drawIndexedIndirect() GPURenderPassEncoder فقط می‌توانند یک فراخوانی draw را در یک زمان از یک ناحیه خاص از بافر GPU صادر کنند.

تا زمانی که این ویژگی آزمایشی استاندارد شود، پرچم «پشتیبانی از Unsafe WebGPU» را در chrome://flags/#enable-unsafe-webgpu فعال کنید تا در کروم در دسترس قرار گیرد.

با استفاده از ویژگی GPU غیر استاندارد "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 Developer Features" در 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

متد ناهمزمان (asynchronous requestAdapterInfo() در GPUAdapter زائد است، زیرا شما می‌توانید GPUAdapterInfo را به صورت همزمان با استفاده از ویژگی info GPUAdapter دریافت کنید. از این رو، متد غیر استاندارد requestAdapterInfo() در GPUAdapter اکنون حذف شده است. به intent مربوط به remove مراجعه کنید.

به‌روزرسانی‌های سپیده‌دم

فایل اجرایی tint_benchmark هزینه ترجمه شیدرها از WGSL به هر زبان backend را اندازه‌گیری می‌کند. برای کسب اطلاعات بیشتر در مورد آن، مستندات جدید را بررسی کنید.

این فقط برخی از نکات برجسته کلیدی را پوشش می‌دهد. لیست جامع کامیت‌ها را بررسی کنید.

ویژگی‌های جدید WebGPU

فهرستی از تمام مواردی که در مجموعه «ویژگی‌های جدید WebGPU» پوشش داده شده است.

کروم ۱۴۲

کروم ۱۴۱

کروم ۱۴۰

کروم ۱۳۹

کروم ۱۳۸

کروم ۱۳۷

کروم ۱۳۶

کروم ۱۳۵

کروم ۱۳۴

کروم ۱۳۳

کروم ۱۳۲

کروم ۱۳۱

کروم ۱۳۰

کروم ۱۲۹

کروم ۱۲۸

کروم ۱۲۷

کروم ۱۲۶

کروم ۱۲۵

کروم ۱۲۴

کروم ۱۲۳

کروم ۱۲۲

کروم ۱۲۱

کروم ۱۲۰

کروم ۱۱۹

کروم ۱۱۸

کروم ۱۱۷

کروم ۱۱۶

کروم ۱۱۵

کروم ۱۱۴

کروم ۱۱۳