מרחקי קליפים ב-WGSL
מרחקים של קליפים מאפשרים להגביל את עוצמת הקול של קליפים של primitives באמצעות רווחים למחצה שהוגדרו על ידי המשתמש בפלט של שלב הקודקוד. הגדרה של מישורי חיתוך משלכם מאפשרת לכם לשלוט טוב יותר במה שגלוי בסצנות WebGPU. הטכניקה הזו שימושית במיוחד לאפליקציות כמו תוכנת CAD, שבהן שליטה מדויקת על התצוגה החזותית היא קריטית.
כשהתכונה "clip-distances"
זמינה ב-GPUAdapter, מבקשים GPUDevice עם התכונה הזו כדי לקבל תמיכה במרחקי חיתוך ב-WGSL, ומפעילים את התוסף הזה באופן מפורש בקוד ה-WGSL באמצעות enable clip_distances;
. אחרי ההפעלה, תוכלו להשתמש במערך המובנה clip_distances
בשדה הקוד של ה-vertex shader. המערך הזה מכיל מרחקים במישור קליפ שהוגדר על ידי המשתמש:
- אם מרחק החיתוך הוא 0, המשמעות היא שהקודקוד נמצא במישור.
- מרחק חיובי מציין שהקודקוד נמצא בתוך חצי המרחב של הקליפ (הצד שרוצים לשמור).
- אם המרחק שלילי, הקודקוד נמצא מחוץ למרחב החצי של החיתוך (הצד שרוצים להשליך).
אפשר לעיין בקטע הקוד הבא, ברשומה ב-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()
של GPUCanvasContext עם מילון תצורה, אפשר להשתמש בשיטה getConfiguration()
של GPUCanvasContext כדי לבדוק את ההגדרות של הקשר הלוח. הקבוצה כוללת את device
, format
, usage
, viewFormats
, colorSpace
, toneMapping
ו-alphaMode
חברים. האפשרות הזו שימושית למשימות כמו בדיקה אם הדפדפן תומך באזור העריכה HDR, כפי שמתואר בדגימת חלקיקים (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
פונקציות מובנות של סריקה כוללת לקבוצות משנה
כחלק מהניסוי בקבוצות משנה, הפונקציות המובנות הבאות של קבוצות משנה נוספו בבעיה 361330160:
subgroupInclusiveAdd(value)
: הפונקציה מחזירה את הסכום הכולל של כל הקריאות הפעילותvalue
בקבוצת המשנה.subgroupInclusiveMul(value)
: הפונקציה מחזירה את ההכפלה הכוללת של הסריקה של כל ההפעלות הפעילותvalue
בקבוצת המשנה.
תמיכה ניסיונית ב-multi-draw indirect
התכונה 'GPU עקיף עם מספר משיכות' מאפשרת להנפיק מספר קריאות משיכה באמצעות פקודה אחת של GPU. האפשרות הזו שימושית במיוחד במצבים שבהם צריך ליצור רינדור של מספר גדול של אובייקטים, כמו מערכות של חלקיקים, יצירה של מכונות וסביבות גדולות. ב-methods 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 כדי להנפיק קריאות ציור בתוך שלב עיבוד (pass) של רינדור. יש לעיין בקטע הקוד הבא ובבעיה 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();
אפשרות הידור של מודול Shader: מתמטיקה קפדנית
נוספה אפשרות למפתחים מסוג strictMath
ב-GPUShaderModuleDescriptor, שמאפשרת להפעיל או להשבית מתמטיקה קפדנית במהלך הידור מודול שדה הגרפיקה. התכונה הזו זמינה באמצעות הדגל 'WebGPU Developer Features' (תכונות למפתחים של WebGPU) ב-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 });
הסרה של GPUAdapter requestAdapterInfo()
השיטה האסינכרונית requestAdapterInfo()
של GPUAdapter היא מיותרת, כי כבר אפשר לקבל את GPUAdapterInfo באופן סינכרוני באמצעות המאפיין info
של GPUAdapter. לכן, השיטה הלא סטנדרטית requestAdapterInfo()
של GPUAdapter הוסרה. כוונת ההסרה.
עדכונים של Dawn
קובץ ההפעלה tint_benchmark
מודד את העלות של תרגום שגיאות מ-WGSL לכל שפת קצה עורפי. בתיעוד החדש תוכלו לקרוא מידע נוסף על הנושא.
זה כולל רק חלק מהעדכונים העיקריים. רשימת ההצהרות המלאה
מה חדש ב-WebGPU
רשימה של כל מה שנדון בסדרה מה חדש ב-WebGPU.
Chrome 131
- חיתוך מרחקים ב-WGSL
- GPUCanvasContext getConfiguration()
- פרימיטיבים של נקודה וקווים לא יכולים להיות עם הטיית עומק
- פונקציות מובנות של סריקה כוללת לקבוצות משנה
- תמיכה ניסיונית בקריאה עקיפה עם מספר משיכות
- Shader module compilation option strict math
- הסרה של GPUAdapter requestAdapterInfo()
- עדכונים לגבי Dawn
Chrome 130
- שילוב של שני מקורות
- שיפורי זמן הידור של שפות Shader ב-Metal
- הוצאה משימוש של requestAdapterInfo() של GPUAdapter
- עדכונים לגבי Dawn
Chrome 129
Chrome 128
- ניסוי עם תתי-קבוצות
- הוצאה משימוש של הגדרת הטיה של עומק לקווים ולנקודות
- הסתרת אזהרת DevTools על שגיאה שלא תועדה אם preventDefault
- WGSL מבצעת אינטרפולציה של הדגימה קודם ואז
- עדכונים לגבי זריחה
Chrome 127
- תמיכה ניסיונית ב-OpenGL ES ב-Android
- מאפיין המידע של GPUAdapter
- שיפורים בתאימות הדדית של WebAssembly
- שיפור שגיאות של מקודד הפקודות
- עדכונים לגבי זריחה
Chrome 126
- הגדלת המגבלה של maxTextureArrayLayers
- אופטימיזציה של העלאת מאגר נתונים זמני לקצה העורפי של Vulkan
- שיפורים בזמן הידור של שגיאות (shader)
- מאגרי הפקודות שנשלחים חייבים להיות ייחודיים
- עדכונים לגבי Dawn
Chrome 125
Chrome 124
- טקסטורות אחסון לקריאה בלבד ולקריאה וכתיבה
- תמיכה ב-Service Workers וב-Shared Workers
- מאפיינים חדשים של פרטי מתאמים
- תיקוני באגים
- עדכונים לגבי זריחה
Chrome 123
- תמיכה בפונקציות מובנות של DP4a ב-WGSL
- פרמטרים של מצביע ללא הגבלה ב-WGSL
- תחביר פשוט יותר לביטול ההפניה למשתנים מורכבים ב-WGSL
- מצב נפרד לקריאה בלבד של אספקטים של תבנית ועומק
- עדכונים לגבי Dawn
Chrome 122
- הרחבת פוטנציאל החשיפה באמצעות מצב תאימות (תכונה בפיתוח)
- הגדלת המגבלה של maxVertexAttributes
- עדכונים לגבי Dawn
Chrome 121
- תמיכה ב-WebGPU ב-Android
- שימוש ב-DXC במקום ב-FXC לצורך הידור של שגיאות ב-Windows
- שאילתות של חותמות זמן בשלבי המחשוב והעיבוד
- נקודות כניסה שמוגדרות כברירת מחדל למודולי שַדְר (shader)
- תמיכה ב-display-p3 כמרחב צבע של GPUExternalTexture
- מידע על ערמות זיכרון
- עדכונים לגבי זריחה
Chrome 120
- תמיכה בערכים של נקודה צפה (floating-point) באורך 16 ביט ב-WGSL
- מעבר למגבלות
- שינויים במצב העומק של סטנסיל
- עדכונים של פרטי המתאם
- כימות שאילתות חותמות זמן
- תכונות לניקוי האביב
Chrome 119
- טקסטורות של מספרים ממשיים (float) ב-32 ביט שניתן לסנן
- פורמט קודקוד unorm10-10-10-2
- פורמט טקסטורה של IMAP10a2uint
- עדכונים לגבי Dawn
Chrome 118
- תמיכה ב-HTMLImageElement וב-ImageData ב-
copyExternalImageToTexture()
- תמיכה ניסיונית ברקמות אחסון לקריאה וכתיבה ולקריאה בלבד
- עדכונים לגבי Dawn
Chrome 117
- הסרה של מאגר נתונים זמני של קודקודים
- ביטול ההגדרה של קבוצת הקישור
- השתקת שגיאות מיצירה של צינור עיבוד נתונים אסינכרוני כשהמכשיר אבד
- עדכונים ליצירת מודול של תוכנת ההצללה (shader) SPIR-V
- שיפור חוויית המפתחים
- אחסון צינורות עיבוד נתונים במטמון עם פריסה שנוצרה באופן אוטומטי
- עדכונים לגבי זריחה
Chrome 116
- שילוב WebCodecs
- מכשיר שאבד שהוחזר על ידי GPUAdapter
requestDevice()
- שמירה על הפעלה חלקה של סרטונים אם מתבצעת קריאה ל-
importExternalTexture()
- תאימות למפרט
- שיפור חוויית המפתחים
- עדכונים לגבי Dawn
Chrome 115
- תוספים נתמכים לשפת WGSL
- תמיכה ניסיונית ב-Direct3D 11
- קבלת GPU נפרד כברירת מחדל בחיבור לחשמל
- שיפור חוויית המפתחים
- עדכונים לגבי Dawn
Chrome 114
- אופטימיזציה של JavaScript
- getCurrentTexture() ב-Canvas לא מוגדר מפעילה שגיאה מסוג InvalidStateError
- עדכונים מ-WGSL
- עדכונים לגבי Dawn