XR_EXT_frame_synthesis

מחרוזת שם

XR_EXT_frame_synthesis

סוג התוסף

הרחבת המכונה

מספר שלוחה רשום

212

Revision

1

סטטוס האישור

לא אושר

תלות בתוסף ובגרסה

OpenXR 1.0

שותפים ביצירת התוכן

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.

שימוש תקף (משתמע)

הערה

יש הרבה דרכים ליצור את הערכים 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 כדי לקבל מידע על רזולוציית התמונה המומלצת של וקטור התנועה.

שימוש תקף (משתמע)

מבנים חדשים

New Enum Constants

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • הרחבה של XrStructureType :

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_TYPE_FRAME_SYNTHESIS_INFO_EXT

בעיות

היסטוריית הגרסאות

  • גרסה 1, 31 בינואר 2022 (Jian Zhang)

    • תיאור התוסף הראשוני, שהומר מ-fb_space_warp
    • שיתוף פעולה עם תורמים כדי לשפר את הממשקים של התוספים.