תמיכה ב-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) ובדוגמה ל-WebGPU HDR, ולקרוא את הרשומה ב-chromestatus.
תמיכה מורחבת בתת-קבוצות
בעקבות ההכרזה על ניסויים בקבוצות משנה, הפונקציות המובנות של קבוצות המשנה זמינות עכשיו לשימוש גם ב-compute shaders וגם ב-fragment shaders. הם כבר לא מוגבלים רק ל-compute shaders. בעיה מס' 354738715
שימו לב שהערך המובנה subgroup_size
פגום כרגע ב-fragment shaders. בינתיים, כדאי להימנע מכך.
בנוסף, נוספו הפונקציות המובנות הבאות של קבוצת המשנה:
subgroupAdd(value)
: הפונקציה מחזירה את הסכום של כל הקריאות הפעילותvalue
בקבוצת המשנה.subgroupExclusiveAdd(value)
: הפונקציה מחזירה את הסכום הכולל של כל הקריאות הפעילותvalue
בקבוצת המשנה.subgroupMul(value)
: הפונקציה מחזירה את המכפלה של כל הקריאות הפעילותvalue
בקבוצת המשנה.subgroupExclusiveMul(value)
: הפונקציה מחזירה את המכפלה הבלעדית של כל הקריאות הפעילותvalue
בקבוצת המשנה.subgroupAnd(value)
: הפונקציה מחזירה את הפעולה הבינארית AND של כל הקריאות הפעילותvalue
בקבוצת המשנה.subgroupOr(value)
: הפונקציה מחזירה את או או הבינארי של כל הקריאות הפעילותvalue
בקבוצת המשנה.subgroupXor(value)
: הפונקציה מחזירה את הפונקציה XOR הבינארית של כל ההפעלות הפעילותvalue
בקבוצת המשנה.subgroupMin(value)
: הפונקציה מחזירה את הערך המינימלי של כל הקריאות הפעילותvalue
בקבוצת המשנה.subgroupMax(value)
: הפונקציה מחזירה את הערך המקסימלי של כל הקריאות הפעילותvalue
בקבוצת המשנה.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
מהקריאה של ה-quad עם המזההid
.id
חייב להיות ביטוי קבוע.quadSwapX(value)
: החלפה שלvalue
בין הקריאות ב-quad בכיוון X.quadSwapY(value)
: החלפה שלvalue
בין הקריאות ב-quad בכיוון Y.quadSwapDiagonal(value)
: החלפתvalue
בין הקריאות ברביעייה באלכסון.
עדכונים של Dawn
המבנה 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 131
- חיתוך מרחקים ב-WGSL
- GPUCanvasContext getConfiguration()
- אסור שתהיה הטיה לעומק בפרימיטיבים של קווים ונקודות
- פונקציות מובנות של סריקה כוללת לקבוצות משנה
- תמיכה ניסיונית בקריאה עקיפה עם כמה משיכות
- Shader module compilation option strict math
- הסרת השיטה requestAdapterInfo() של GPUAdapter
- עדכונים לגבי Dawn
Chrome 130
- שילוב של שני מקורות
- שיפורי זמן הידור של שפות Shader ב-Metal
- הוצאה משימוש של requestAdapterInfo() של GPUAdapter
- עדכונים לגבי Dawn
Chrome 129
Chrome 128
- ניסוי עם תתי-קבוצות
- הוצאה משימוש של הגדרת הטיה של עומק לקווים ולנקודות
- הסתרת אזהרת DevTools על שגיאה שלא תועדה אם preventDefault
- WGSL מבצעת אינטרפולציה של הדגימה קודם ואז
- עדכונים לגבי Dawn
Chrome 127
- תמיכה ניסיונית ב-OpenGL ES ב-Android
- מאפיין המידע של GPUAdapter
- שיפורים בתאימות הדדית של WebAssembly
- שיפור שגיאות של מקודד הפקודות
- עדכונים לגבי Dawn
Chrome 126
- הגדלת המגבלה של maxTextureArrayLayers
- אופטימיזציה של העלאה למאגר לצד העורפי של Vulkan
- שיפורים בזמן הידור של שגיאות (shader)
- מאגרי הפקודות שנשלחים חייבים להיות ייחודיים
- עדכונים לגבי Dawn
Chrome 125
Chrome 124
- טקסטורות אחסון לקריאה בלבד ולקריאה וכתיבה
- תמיכה ב-Service Workers וב-Shared Workers
- מאפיינים חדשים של פרטי מתאם
- תיקוני באגים
- עדכונים לגבי Dawn
Chrome 123
- תמיכה בפונקציות מובנות של DP4a ב-WGSL
- פרמטרים של מצביע ללא הגבלה ב-WGSL
- תחביר פשוט יותר לביטול ההפניה למשתנים מורכבים ב-WGSL
- מצב נפרד לקריאה בלבד של אספקטים של תבנית ועומק
- עדכונים לגבי Dawn
Chrome 122
- הרחבת פוטנציאל החשיפה באמצעות מצב תאימות (תכונה בפיתוח)
- הגדלת המגבלה של maxVertexAttributes
- עדכונים לגבי Dawn
Chrome 121
- תמיכה ב-WebGPU ב-Android
- שימוש ב-DXC במקום ב-FXC לצורך הידור של שגיאות ב-Windows
- שאילתות של חותמות זמן בשלבי המחשוב והעיבוד
- נקודות כניסה שמוגדרות כברירת מחדל למודולי שַדְר (shader)
- תמיכה ב-display-p3 כמרחב צבע של GPUExternalTexture
- מידע על ערמות זיכרון
- עדכונים לגבי Dawn
Chrome 120
- תמיכה בערכים של נקודה צפה (floating-point) באורך 16 ביט ב-WGSL
- מעבר למגבלות
- שינויים במצב של עומק-המרקע
- עדכונים של פרטי המתאם
- קידוד נתונים של שאילתות עם חותמות זמן
- תכונות לניקיון האביב
Chrome 119
- טקסטורות של מספרים ממשיים (float) ב-32 ביט שניתן לסנן
- פורמט קודקוד unorm10-10-10-2
- פורמט טקסטורה של rgb10a2uint
- עדכונים לגבי Dawn
Chrome 118
- תמיכה ב-HTMLImageElement וב-ImageData ב-
copyExternalImageToTexture()
- תמיכה ניסיונית ברקמות אחסון לקריאה וכתיבה ולקריאה בלבד
- עדכונים לגבי Dawn
Chrome 117
- ביטול ההגדרה של מאגר הנקודות
- ביטול ההגדרה של קבוצת הקישור
- השתקת שגיאות שנובעות מיצירת צינור עיבוד נתונים אסינכררוני כשהמכשיר אבד
- עדכונים לגבי יצירת מודולים של שפות SPIR-V
- שיפור חוויית המפתחים
- אחסון צינורות עיבוד נתונים במטמון עם פריסה שנוצרה באופן אוטומטי
- עדכונים לגבי Dawn
Chrome 116
- שילוב WebCodecs
- מכשיר שאבד וחוזר על ידי GPUAdapter
requestDevice()
- שמירה על הפעלה חלקה של סרטונים אם מתבצעת קריאה ל-
importExternalTexture()
- תאימות למפרט
- שיפור חוויית המפתחים
- עדכונים לגבי Dawn
Chrome 115
- תוספים נתמכים לשפת WGSL
- תמיכה ניסיונית ב-Direct3D 11
- קבלת GPU נפרד כברירת מחדל בחשמל AC
- שיפור חוויית המפתחים
- עדכונים לגבי Dawn
Chrome 114
- אופטימיזציה של JavaScript
- getCurrentTexture() ב-Canvas לא מוגדר מפעילה שגיאה מסוג InvalidStateError
- עדכונים מ-WGSL
- עדכונים לגבי Dawn