سنتز قاب XR_EXT

رشته نام

XR_EXT_frame_synthesis

نوع افزونه

افزونه نمونه

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

۲۱۲

بازنگری

۱

وضعیت تصویب

تصویب نشده

وابستگی‌های افزونه و نسخه

اوپن‌ایکس‌آر ۱.۰

مشارکت‌کنندگان

جیان ژانگ، متا پلتفرمز
نیل بدکار، متا پلتفرمز
Xiang Wei، Meta Platforms
گودونگ رونگ، متا پلتفرمز
ترور داش، متا پلتفرمز
رمی آرنو، وارخو
پائولو گومز، سامسونگ الکترونیکس
برایس هاچینگز، مایکروسافت
رایلی پاولیک، شرکت 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 تبدیل افزایشی اعمال شده توسط برنامه است، در صورت وجود، که از زمان فریم قبلی بر نما تأثیر می‌گذارد. تجربیات حرکت مصنوعی (حرکت اسکریپتی، تله‌پورت و غیره) شامل برنامه‌ای است که کل space XrCompositionLayerProjection :: را از یک حالت فضای برنامه به حالت دیگر بین فریم‌ها تبدیل می‌کند و نما را بیش از حرکت ردیابی شده بین فریم‌ها تحت تأثیر قرار می‌دهد. appSpaceDeltaPose باید زمانی که هیچ تبدیل XrCompositionLayerProjection :: space در برنامه وجود ندارد، یکسان باشد. position XrPosef :: در appSpaceDeltaPose باید نسبت به برنامه فعلی XrCompositionLayerProjection :: space باشد.
  • depthSubImage تصویر عمق XrSwapchainSubImage را که قرار است برای سنتز فریم استفاده شود، شناسایی می‌کند.
  • minDepth و maxDepth محدوده مقادیر عمق در depthSubImage هستند و باید در محدوده [0.0،1.0] باشند. این شبیه به مقادیر min و max در glDepthRange در OpenGL است، اما با این شرط که maxDepth ≥ minDepth باشد.
  • nearZ فاصله مثبت بر حسب متر از مقدار minDepth در زنجیره تعویض عمق است. برنامه‌ها ممکن است از nearZ بزرگتر از farZ برای نشان دادن معکوس شدن مقادیر عمق استفاده کنند. nearZ می‌تواند بی‌نهایت باشد.
  • farZ فاصله مثبت بر حسب متر از مقدار maxDepth در زنجیره تعویض عمق است. farZ می‌تواند بی‌نهایت باشد. اگر nearZ == farZ باشد، زمان اجرا باید خطای XR_ERROR_VALIDATION_FAILURE را برگرداند.

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

به طور پیش‌فرض، داده‌های برداری حرکت سه‌بعدی در زمان اجرا مورد انتظار هستند، بنابراین از motionVectorSubImage rgb، motionVectorScale xyz و motionVectorOffset xyz استفاده می‌شود، همانطور که در XrFrameSynthesisInfoEXT توضیح داده شده است.

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

کاربرد معتبر (ضمنی)

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

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

  • 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

مسائل

تاریخچه نسخه

  • نسخه ۱، ۲۰۲۲-۰۱-۳۱ (جیان ژانگ)

    • توضیحات اولیه افزونه، تبدیل شده از fb_space_warp
    • همکاری با مشارکت‌کنندگان برای اصلاح رابط‌های افزونه.