XR_EXT_frame_synthesis

رشته نام

XR_EXT_frame_synthesis

نوع افزونه

افزونه نمونه

شماره داخلی ثبت‌شده

212

بازبینی

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

نمای کلی

این افزونه پشتیبانی لازم را برای فعال کردن ترکیب قاب در برنامه‌ها براساس داده‌های اضافی ارائه‌شده توسط برنامه فراهم می‌کند. تصاویر بُردار حرکت و تصاویر عمق تولیدشده توسط برنامه ممکن است توسط زمان اجرا برای انجام برون‌یابی و بازتابش قاب با کیفیت بالا برای ترکیب قاب جدید استفاده شود، که تجربه روانی را حتی زمانی که برنامه زیر هدف FPS اجرا می‌شود ارائه می‌دهد.

این افزونه به‌گونه‌ای طراحی شده است که مستقل از 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 را از یک حالت فضای برنامه به حالت دیگری بین فریم‌ها تبدیل می‌کند و بر نما بیشتر از حرکت ردیابی‌شده بین فریم‌ها تأثیر می‌گذارد. وقتی XrCompositionLayerProjection :: space تبدیل در برنامه وجود ندارد، appSpaceDeltaPose باید هویت باشد. ‫XrPosef :: position در appSpaceDeltaPose باید نسبت به XrCompositionLayerProjection :: space برنامه فعلی باشد.
  • depthSubImage تصویر عمق XrSwapchainSubImage را که باید برای ترکیب قاب استفاده شود شناسایی می‌کند.
  • minDepth و maxDepth محدوده مقادیر عمق در depthSubImage هستند و باید در محدوده [0.0,1.0] باشند. این شبیه به مقادیر حداقل و حداکثر glDepthRange OpenGL است، اما با این شرط که maxDepth ≥ minDepth باشد .
  • nearZ فاصله مثبت برحسب متر از مقدار minDepth در زنجیره تعویض عمق است. برنامه‌ها می‌توانند از nearZ بزرگ‌تر از farZ استفاده کنند تا نشان دهند مقادیر عمق معکوس شده‌اند. nearZ ممکن است بی‌نهایت باشد.
  • farZ فاصله مثبت برحسب متر از مقدار maxDepth در زنجیره تعویض عمق است. farZ ممکن است بی‌نهایت باشد. اگر nearZ == farZ باشد، زمان اجرا باید خطای XR_ERROR_VALIDATION_FAILURE را برگرداند

هنگام ارسال تصاویر بردار حرکتی و تصاویر عمقی همراه با لایه‌های طرح‌افکنی، یک ساختار 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 (چند هدف پردازشی) پردازش کند. تصمیم‌گیری درباره رویکرد خاص برعهده برنامه است. قالب‌های کانال پیکسل ممیز شناور ۱۶ بیتی علامت‌دار برای 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 به زمان اجرا اشاره می‌کند که برنامه ترجیح می‌دهد زمان بیشتری برای رندر کردن هر فریم داشته باشد، با این معاوضه که فریم‌های بیشتری توسط زمان اجرا ترکیب می‌شوند. این کار ممکن است برای برنامه‌هایی مفید باشد که ترجیح می‌دهند مصرف CPU و GPU را حفظ کنند (مثلاً برای افزایش عمر باتری) یا بودجه محاسباتی هر فریم را افزایش دهند. زمان اجرا ممکن است در هر فاصله‌ای، صرف‌نظر از مقدار این پرچم، فریم درخواست کند.

به‌طور پیش‌فرض، داده‌های بردار حرکت سه‌بعدی توسط زمان اجرا انتظار می‌رود، بنابراین 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 : ارتفاع تصویر عمق و بردار حرکت توصیه‌شده.

وقتی این افزونه فعال باشد، برنامه می‌تواند هنگام فراخوانی xrEnumerateViewConfigurationViews برای کسب اطلاعات درباره وضوح تصویر بردار حرکت توصیه‌شده، ساختار XrFrameSynthesisConfigViewEXT را در زنجیره XrViewConfigurationView :: next ارسال کند.

استفاده معتبر (ضمنی)

سازه‌های جدید

ثابت‌های شمارشی جدید

  • 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

مشکلات

سابقه نسخه

  • بازبینی ۱، ۲۰۲۲/۰۱/۳۱ (Jian Zhang)

    • Initial extension description, converted from fb_space_warp
    • مشارکت با همیاران برای بهبود رابط‌های افزونه.