ویژگی‌های جدید WebGPU (Chrome 131)

François Beaufort
François Beaufort

فاصله‌های کلیپ در WGSL

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

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

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

تکه‌کد زیر، ورودی chromestatus، و مسئله ۳۵۸۴۰۸۵۷۱ را ببینید.

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، و مشکل ۳۷۰۱۰۹۸۲۹ را ببینید.

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 را روی مقدار غیرصفر در شرایطی که توپولوژی خط لوله رندر از نوع خط یا نقطه باشد، به‌عنوان خطای اعتبارسنجی درنظر می‌گیرد. مسئله ۳۵۲۵۶۷۴۲۴ را ببینید.

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

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

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

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

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

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

با ویژگی غیر استاندارد "chromium-experimental-multi-draw-indirect" GPU که در GPUAdapter دردسترس است، GPUDevice را با این ویژگی درخواست کنید. سپس یک GPUBuffer با کاربرد GPUBufferUsage.INDIRECT برای ذخیره کردن فراخوان‌های طراحی ایجاد کنید. می‌توانید از آن در روش‌های جدید multiDrawIndirect() و multiDrawIndexedIndirect() GPURenderPassEncoder برای صدور فراخوان‌های طراحی در گذر رندر استفاده کنید. تکه‌کد زیر و مشکل ۳۵۶۴۶۱۲۸۶ را ببینید.

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 دردسترس است، که یعنی این ویژگی فقط برای استفاده درطول توسعه درنظر گرفته شده است. مشکل ۴۲۲۴۱۴۵۵ را ببینید.

درحال‌حاضر این گزینه در Metal و Direct3D پشتیبانی می‌شود. وقتی ریاضیات دقیق غیرفعال باشد، کامپایلر ممکن است سایه‌زن‌های شما را با این روش‌ها بهینه‌سازی کند:

  • امکان مقادیر NaN و Infinity نادیده گرفته می‌شود.
  • ‫-۰ به‌عنوان +۰ درنظر گرفته می‌شود.
  • جایگزین کردن تقسیم با ضرب سریع‌تر در معکوس.
  • ترتیب مجدد عملیات براساس خواص انجمنی و توزیعی.
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 });

برداشتن GPUAdapter requestAdapterInfo()‎

روش ناهم‌زمان requestAdapterInfo()‏ GPUAdapter اضافی است زیرا ازقبل می‌توانید بااستفاده از مشخصه info‏ GPUAdapter،‏ GPUAdapterInfo را به‌صورت هم‌زمان دریافت کنید. بنابراین، روش غیر استاندارد GPUAdapter requestAdapterInfo() اکنون برداشته شده است. قصد برداشتن را ببینید.

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

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

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

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

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

‫۱۵۵-۱۵۶ Chrome

‫۱۵۳-۱۵۴ Chrome

Chrome 151-152

‫۱۴۹-۱۵۰ Chrome

‫۱۴۷-۱۴۸ Chrome

‫۱۴۶ Chrome

‫Chrome 145

‫۱۴۴ Chrome

‫۱۴۳ Chrome

‫۱۴۲ Chrome

Chrome 141

‫۱۴۰ Chrome

Chrome 139

‫Chrome 138

Chrome 137

‫Chrome 136

‫۱۳۵ Chrome

‫۱۳۴ Chrome

‫Chrome 133

‫۱۳۲ Chrome

‫۱۳۱ Chrome

‫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