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

François Beaufort
François Beaufort

پشتیبانی از HDR با حالت نگاشت رنگ‌مایه بوم

توسعه‌دهندگان وب گزینه‌های محدودی برای ارائه محتوای HDR دارند و عمدتاً به عناصر <img> و <video> متکی هستند. بااین‌حال، عنصر <canvas> همچنان به SDR محدود است. تولید محتوای HDR پویا در یک بوم نیازمند کدبندی محتوای آن به‌عنوان تصویر HDR قبل‌از نمایش آن است (برای مثال، این نسخه نمایشی را ببینید).

پارامتر جدید GPUCanvasToneMappingMode در پیکربندی بوم WebGPU اکنون به WebGPU اجازه می‌دهد رنگ‌هایی روشن‌تر از سفید (#FFFFFF) بکشد. این کار ازطریق حالت‌های زیر انجام می‌شود:

  • "standard": رفتار پیش‌فرض محتوا را به محدوده SDR صفحه محدود می‌کند. این حالت با محدود کردن همه مقادیر رنگ در فضای رنگ صفحه به بازه [0, 1] به‌دست می‌آید.

  • "extended": محدوده کامل HDR صفحه را باز می‌کند. این حالت با "standard" در محدوده [0, 1] صفحه‌نمایش مطابقت دارد. گیره یا طرح‌ریزی برای محدوده پویای گسترده صفحه انجام می‌شود اما برای [0, 1] انجام نمی‌شود.

تکه‌کد زیر نحوه پیکربندی بوم نقاشی برای دامنه پویای بالا را نشان می‌دهد.

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

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

context.configure({
  device,
  format: "rgba16float",
  toneMapping: { mode: "extended" },
});

با بررسی نمونه ذرات (HDR) و مثال WebGPU HDR، و دیدن ورودی chromestatus، HDR را با WebGPU کاوش کنید.

رایانه کیفی با صفحه‌نمایش HDR که تصویر زنده‌ای را نمایش می‌دهد.
نمونه «ذرات (HDR)» در صفحه‌نمایش HDR نمایش داده می‌شود.

پشتیبانی از زیرگروه‌های ازهم بازشده

پس‌از اعلام آزمایش زیرگروه‌ها، اکنون توابع داخلی زیرگروه برای استفاده در سایه‌زن‌های محاسباتی و سایه‌زن‌های تکه‌تکه دردسترس هستند. این‌ها دیگر فقط به سایه‌زن‌های محاسباتی محدود نمی‌شوند. مسئله ۳۵۴۷۳۸۷۱۵ را ببینید.

توجه داشته باشید که مقدار داخلی subgroup_size درحال‌حاضر در سایه‌زن‌های تکه‌تکه اشکال دارد. فعلاً از آن اجتناب کنید.

به‌علاوه، توابع داخلی زیرگروه زیر اضافه شده است:

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

  • ‫subgroupAnd(value): «و» دودویی همه فراخوانی‌های فعال values را در سراسر زیرگروه برمی‌گرداند.
  • ‫subgroupOr(value): «یا» دودویی همه فراخوانی‌های فعال values را در سراسر زیرگروه برمی‌گرداند.
  • ‫subgroupXor(value): «یا انحصاری» دودویی همه فراخوانی‌های فعال values را در سراسر زیرگروه برمی‌گرداند.

  • ‫subgroupMin(value): حداقل مقدار همه فراخوانی‌های فعال values را در سراسر زیرگروه برمی‌گرداند.
  • subgroupMax(value): مقدار بیشینه همه فراخوانی‌های فعال values را در سراسر زیرگروه برمی‌گرداند.

  • subgroupAll(value): اگر value برای همه فراخوانی‌های فعال در زیرگروه درست باشد، درست برمی‌گرداند.
  • subgroupAny(value): اگر value برای هر فراخوانی فعال در زیرگروه درست باشد، مقدار درست برمی‌گرداند.

  • subgroupElect(): اگر این فراخوانی در میان فراخوانی‌های فعال در زیرگروه کمترین subgroup_invocation_id را داشته باشد، مقدار درست را برمی‌گرداند.
  • subgroupBroadcastFirst(value): value از فراخوانی فعال با کمترین subgroup_invocation_id در زیرگروه را به همه فراخوانی‌های فعال دیگر همه‌فرستی می‌کند.

  • ‫subgroupShuffle(value, id): value را از فراخوانی فعالی که subgroup_invocation_id آن با id مطابقت دارد برمی‌گرداند.
  • ‫subgroupShuffleXor(value, mask): value را از فراخوانی فعالی که subgroup_invocation_id آن با subgroup_invocation_id ^ mask مطابقت دارد برمی‌گرداند. ‫mask باید به‌صورت پویا یکنواخت باشد.
  • ‫subgroupShuffleUp(value, delta): value را از فراخوانی فعالی که subgroup_invocation_id آن با subgroup_invocation_id - delta مطابقت دارد برمی‌گرداند.
  • ‫subgroupShuffleDown(value, delta): value را از فراخوانی فعالی که subgroup_invocation_id آن با subgroup_invocation_id + delta مطابقت دارد برمی‌گرداند.

  • ‫quadBroadcast(value, id): همه‌فرستی‌های value از فراخوانی چهارگانه با شناسه برابر با id. ‫id باید عبارت ثابت باشد.
  • ‫quadSwapX(value): value را بین فراخوانی‌ها در چهارگانه در جهت X جابه‌جا می‌کند.
  • quadSwapY(value): value را بین فراخوانی‌ها در چهارگانه در جهت Y عوض می‌کند.
  • ‫quadSwapDiagonal(value): value را بین فراخوانی‌ها در چهارگانه به‌صورت مورب عوض می‌کند.

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

ساختار wgpu::PrimitiveState اکنون مستقیماً شامل تنظیم کنترل کلیپ عمق است و نیاز به ساختار wgpu::PrimitiveDepthClipControl جداگانه را ازبین می‌برد. برای کسب اطلاعات بیشتر، تکه‌کد زیر و webgpu-headers PR را ببینید.

// Before
wgpu::PrimitiveState primitive = {};
wgpu::PrimitiveDepthClipControl depthClipControl;
depthClipControl.unclippedDepth = true;
primitive.nextInChain = &depthClipControl;
// Now
wgpu::PrimitiveState primitive = {};
primitive.unclippedDepth = true;

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

ویژگی‌های جدید 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