XR_EXT_frame_synthesis
מחרוזת שם
XR_EXT_frame_synthesis
סוג התוסף
הרחבת המכונה
מספר שלוחה רשום
212
Revision
1
סטטוס האישור
לא אושר
תלות בתוסף ובגרסה
שותפים ביצירת התוכן
Jian Zhang, Meta Platforms
Neel Bedekar, Meta Platforms
Xiang Wei, Meta Platforms
Guodong Rong, Meta Platforms
Trevor Dasch, Meta Platforms
Rémi Arnaud, Varjo
Paulo Gomes, Samsung Electronics
Bryce Hutchings, Microsoft
Rylie Pavlik, Collabora
Shuai Liu, ByteDance
סקירה כללית
התוסף הזה מספק תמיכה בהפעלת סינתזת פריימים באפליקציות שמבוססות על נתונים נוספים שמסופקים על ידי האפליקציה. יכול להיות שסביבת זמן הריצה תשתמש בתמונות של וקטורי תנועה ובתמונות עומק שנוצרו על ידי האפליקציה כדי לבצע אקסטרפולציה של פריימים באיכות גבוהה ומיפוי מחדש, וכך ליצור פריימים חדשים. כך אפשר לספק חוויה חלקה גם כשהאפליקציה פועלת מתחת ליעד קצב הפריימים.
התוסף הזה מיועד להיות בלתי תלוי ב-XR_KHR_composition_layer_depth, ואפשר להפעיל את שניהם ולהשתמש בהם בו-זמנית למטרות שונות. XrFrameSynthesisInfoEXT :: depthSubImage עשוי להשתמש בנתוני עומק שמוקדשים לסינתזת פריימים, והרזולוציה שלו עשויה להיות נמוכה יותר מ-XrCompositionLayerDepthInfoKHR :: subImage . אפשר לראות את הרזולוציה המומלצת של depthSubImage ב-XrFrameSynthesisConfigViewEXT .
שליחת תמונות של וקטורי תנועה ותמונות עומק
המבנה XrFrameSynthesisInfoEXT מוגדר כך:
typedef struct XrFrameSynthesisInfoEXT {
XrStructureType type;
const void* next;
XrFrameSynthesisInfoFlagsEXT layerFlags;
XrSwapchainSubImage motionVectorSubImage;
XrVector4f motionVectorScale;
XrVector4f motionVectorOffset;
XrPosef appSpaceDeltaPose;
XrSwapchainSubImage depthSubImage;
float minDepth;
float maxDepth;
float nearZ;
float farZ;
} XrFrameSynthesisInfoEXT;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
layerFlagsהוא ביטמסק של XrFrameSynthesisInfoFlagsEXT . -
motionVectorSubImageמציין את תמונת וקטור התנועה XrSwapchainSubImage שתשמש לסינתזת מסגרות. -
motionVectorScaleהוא XrVector4f שמשנה את קנה המידה של הפרשנות של וקטור התנועה ב-motionVectorSubImage. -
motionVectorOffsetהוא XrVector4f שמבצע היסט לפרשנות של וקטור התנועה ב-motionVectorSubImage. -
appSpaceDeltaPoseהוא שינוי מצטבר שחל על האפליקציה, אם יש כזה, שמשפיע על התצוגה מאז המסגרת הקודמת. חוויות של תנועה מלאכותית (תנועה מתוסרטת, טלפורטציה וכו') כוללות את האפליקציה שמשנה את כל XrCompositionLayerProjection ::spaceמתנוחה אחת במרחב האפליקציה לתנוחה אחרת בין פריימים, ומשפיעה על התצוגה יותר מהתנועה המעקב בין פריימים. הערך שלappSpaceDeltaPoseחייב להיות זהות כשאין טרנספורמציה של XrCompositionLayerProjection ::spaceבאפליקציה. ה-XrPosef ::positionב-appSpaceDeltaPoseחייב להיות יחסי לאפליקציה הנוכחית XrCompositionLayerProjection ::space. -
depthSubImageמציין את תמונת העומק XrSwapchainSubImage שתשמש לסינתזת הפריים. -
minDepthו-maxDepthהם טווח ערכי העומק ב-depthSubImage, וחייבים להיות בטווח [0.0,1.0] . זה דומה לערכים המינימליים והמקסימליים שלglDepthRangeב-OpenGL , אבל כאן נדרש ש-maxDepth ≥ minDepth . -
nearZהוא המרחק החיובי במטרים של הערךminDepthב-swapchain של העומק. אפליקציות יכולות להשתמש בערךnearZשגדול מ-farZכדי לציין שהערכים של העומק הפוכים.nearZיכול להיות אינסופי. -
farZהוא המרחק החיובי במטרים של הערךmaxDepthב-swapchain של העומק.farZיכול להיות אינסופי. סביבת זמן הריצה חייבת להחזיר את השגיאהXR_ERROR_VALIDATION_FAILUREאםnearZ==farZ
כששולחים תמונות של וקטורי תנועה ותמונות עומק יחד עם שכבות הקרנה, מוסיפים מבנה XrFrameSynthesisInfoEXT לשרשרת XrCompositionLayerProjectionView :: next, לכל מבנה XrCompositionLayerProjectionView בשכבה הנתונה.
סביבת זמן הריצה צריכה לפרש את נתוני הווקטורים של התנועה בערוצי ה-RGB של motionVectorSubImage, ששונו על ידי motionVectorScale ו-motionVectorOffset באופן הבא: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . המערכת מתעלמת מהרכיבים motionVectorSubImage a , motionVectorScale w ו-motionVectorOffset w.
וקטור התנועה מייצג את התנועה של פיקסל מאז XrFrameEndInfo ::displayTime של הפריים הקודם ועד XrFrameEndInfo ::displayTime של הפריים הנוכחי. יכול להיות שזמן הריצה ישתמש במידע הזה כדי לבצע אקסטרפולציה של הפריים שעבר רינדור לפריים עתידי.
וקטור התנועה חייב להיות נגזר ממרחב קואורדינטות המכשיר הנורמלי (NDC), שבהקשר הזה משתמש במוסכמות בסגנון Vulkan: טווח ה-NDC מוגדר כ-[-1, -1, 0] עד [1, 1, 1], שונה מטווח ה-NDC של OpenGL. עם זאת, וקטור התנועה עצמו לא מוגבל לטווח הזה. הערכים שלו תלויים בתנועת הפיקסל ועשויים לחרוג מגבולות מרחב ה-NDC. לדוגמה, אם מיקום הפיקסל ב-NDC בפריים הקודם הוא PrevNDC, ובפריים הנוכחי הוא CurrNDC, ואין שינוי קנה מידה או היסט, אז ערך וקטור התנועה הוא (CurrNDC - PrevNDC) xyz.
שימוש תקף (משתמע)
- התוסף
XR_EXT_frame_synthesisחייב להיות מופעל לפני שמשתמשים ב-XrFrameSynthesisInfoEXT -
typeחייב להיותXR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים -
layerFlagsחייב להיות0או שילוב תקין של ערכים של XrFrameSynthesisInfoFlagBitsEXT -
motionVectorSubImageחייב להיות מבנה XrSwapchainSubImage תקין -
depthSubImageחייב להיות מבנה XrSwapchainSubImage תקין
הערה
יש הרבה דרכים ליצור את הערכים motionVectorSubImage ו-depthSubImage . לדוגמה, יכול להיות שהאפליקציה תעבד אותם ברזולוציה נמוכה יותר במעבר ייעודי של וקטור תנועה (מומלץ לעיין ב-XrFrameSynthesisConfigViewEXT כדי לראות את הרזולוציה המומלצת), או שהיא תעבד אותם במעבר של התצוגה הראשית באמצעות MRT (יעדי רינדור מרובים). האפליקציה היא זו שמחליטה באיזו גישה ספציפית להשתמש. מומלץ להשתמש בפורמטים של ערוצי פיקסלים עם נקודה צפה של 16 ביט חתומה עבור motionVectorSubImage .
התרעות לגבי סינתזת פריימים
typedef XrFlags64 XrFrameSynthesisInfoFlagsEXT;
// Flag bits for XrFrameSynthesisInfoFlagsEXT
static const XrFrameSynthesisInfoFlagsEXT XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT = 0x00000001;
static const XrFrameSynthesisInfoFlagsEXT XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT = 0x00000002;
תיאורי הסימונים
-
XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXTמציין שהמערכת משתמשת בנתוני וקטור תנועה דו-ממדיים. -
XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTמספק רמז לזמן הריצה שלפיו האפליקציה מעדיפה זמן נוסף לרינדור של כל פריים, בתמורה לכך שזמן הריצה יסנתז יותר פריימים. האפשרות הזו יכולה להיות שימושית לאפליקציות שרוצות לחסוך בשימוש במעבד ובמעבד גרפי (למשל, כדי להאריך את חיי הסוללה) או להגדיל את תקציב החישוב של כל פריים. סביבת זמן הריצה עשויה לבקש פריימים בכל מרווח זמן, ללא קשר לערך של הדגל הזה.
כברירת מחדל, סביבת זמן הריצה מצפה לנתוני וקטור תנועה תלת-ממדיים, ולכן נעשה שימוש ב-rgb של motionVectorSubImage , ב-xyz של motionVectorScale וב-xyz של motionVectorOffset, כפי שמתואר ב-XrFrameSynthesisInfoEXT .
כשההגדרה XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT מופעלת ב-XrFrameSynthesisInfoEXT layerFlags , זמן הריצה מפרש את תמונת וקטור התנועה שנשלחה כנתוני וקטור תנועה דו-ממדיים, שמייצגים תנועת פיקסלים דו-ממדית מהפריים הקודם לפריים הנוכחי. ערכי הפיקסלים מפורשים באופן הבא עבור נתוני וקטור תנועה דו-ממדי: motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy . המערכת מתעלמת מהרכיבים motionVectorSubImage ba , motionVectorScale zw ו-motionVectorOffset zw. שימוש בנתוני וקטור תנועה דו-ממדיים במקום בנתוני וקטור תנועה תלת-ממדיים עשוי להפחית את האיכות של המסגרות הסינתטיות.
קבלת רזולוציה מומלצת
המבנה XrFrameSynthesisConfigViewEXT מוגדר כך:
typedef struct XrFrameSynthesisConfigViewEXT {
XrStructureType type;
void* next;
uint32_t recommendedMotionVectorImageRectWidth;
uint32_t recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
recommendedMotionVectorImageRectWidth: רוחב מומלץ של וקטור התנועה ותמונת העומק. -
recommendedMotionVectorImageRectHeight: גובה מומלץ של וקטור התנועה ותמונת העומק.
כשהתוסף הזה מופעל, אפליקציה יכולה להעביר מבנה XrFrameSynthesisConfigViewEXT בשרשרת XrViewConfigurationView :: next כשקוראים ל-xrEnumerateViewConfigurationViews כדי לקבל מידע על רזולוציית התמונה המומלצת של וקטור התנועה.
שימוש תקף (משתמע)
- התוסף
XR_EXT_frame_synthesisחייב להיות מופעל לפני שמשתמשים ב-XrFrameSynthesisConfigViewEXT -
typeחייב להיותXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים
מבנים חדשים
הרחבה של XrCompositionLayerProjectionView :
הרחבה של XrViewConfigurationView :
New Enum Constants
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONהרחבה של XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
בעיות
היסטוריית הגרסאות
גרסה 1, 31 בינואר 2022 (Jian Zhang)
- תיאור התוסף הראשוני, שהומר מ-fb_space_warp
- שיתוף פעולה עם תורמים כדי לשפר את הממשקים של התוספים.