מה חדש ב-WebGPU (Chrome {/7}129)

François Beaufort
François Beaufort

תמיכה ב-HDR עם מצב מיפוי גוונים של אזור הציור

למפתחי אתרים יש אפשרויות מוגבלות להצגת תוכן HDR, והם מסתמכים בעיקר על רכיבי <img> ו-<video>. עם זאת, רכיב <canvas> נשאר מוגבל ל-SDR. כדי ליצור תוכן דינמי באיכות HDR בתוך אזור ציור, צריך לקודד את התוכן כתמונה באיכות HDR לפני שמציגים אותו (לדוגמה, אפשר לראות את הדמו הזה).

הפרמטר החדש GPUCanvasToneMappingMode בהגדרות של WebGPU canvas מאפשר ל-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) ובדוגמה של HDR ב-WebGPU, וגם בערך ב-chromestatus.

מחשב נייד עם מסך HDR שמוצגת בו תמונה צבעונית.
דוגמה של חלקיקים (HDR) שמוצגת במסך HDR.

תמיכה מורחבת בתת-קבוצות

בעקבות ההודעה על ניסויים בקבוצות משנה, פונקציות ה-built-in של קבוצות המשנה זמינות עכשיו לשימוש גם ב-compute shaders וגם ב-fragment shaders. הם כבר לא מוגבלים רק ל-compute shaders. מידע נוסף זמין בבעיה מספר 354738715.

הערה: הערך המובנה subgroup_size הוא כרגע באגי ב-fragment shaders. מומלץ להימנע ממנו בשלב הזה.

בנוסף, נוספו הפונקציות המובנות הבאות של קבוצות משנה:

  • subgroupAdd(value): מחזירה את סכום כל הקריאות הפעילות value בקבוצת המשנה.
  • subgroupExclusiveAdd(value): מחזירה את סכום הסריקה הבלעדי של כל הקריאות הפעילות values בקבוצת המשנה.
  • subgroupMul(value): מחזירה את המכפלה של כל הקריאות הפעילות values בקבוצת המשנה.
  • subgroupExclusiveMul(value): מחזירה את מכפלת הסריקה הבלעדית של כל ההפעלות הפעילות values בקבוצת המשנה.

  • subgroupAnd(value): מחזירה את הפעולה הבינארית AND של כל הקריאות הפעילות values בקבוצת המשנה.
  • subgroupOr(value): מחזירה את הפעולה הבינארית OR של כל הקריאות הפעילות values בקבוצת המשנה.
  • subgroupXor(value): מחזירה את ה-XOR הבינארי של כל הקריאות הפעילות values בקבוצת המשנה.

  • subgroupMin(value): מחזירה את הערך המינימלי של כל ההפעלות הפעילות values בקבוצת המשנה.
  • subgroupMax(value): מחזירה את הערך המקסימלי של כל הקריאות הפעילות values בקבוצת המשנה.

  • subgroupAll(value): מחזירה את הערך True אם value הוא True לכל ההפעלות הפעילות בתת-הקבוצה.
  • subgroupAny(value): מחזירה true אם value הוא true עבור כל הפעלה פעילה בקבוצת המשנה.

  • subgroupElect(): הפונקציה מחזירה True אם הערך של 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 בין הפעלות ב-quad בכיוון X.
  • quadSwapY(value): מחליף value בין הפעלות ב-quad בכיוון Y.
  • quadSwapDiagonal(value): מחליף את value בין הפעלות ברביע בצורה אלכסונית.

עדכונים לגבי שעות השחר

המבנה wgpu::PrimitiveState כולל עכשיו ישירות את ההגדרה של בקרת חיתוך עומק, כך שאין יותר צורך במבנה wgpu::PrimitiveDepthClipControl נפרד. מידע נוסף זמין בקטע הקוד הבא ובבקשת ה-PR של webgpu-headers.

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

המידע הזה כולל רק חלק מהנקודות העיקריות. רשימה מלאה של קומיטים

מה חדש ב-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