XR_EXT_frame_synthesis
رشته نام
XR_EXT_frame_synthesis
نوع افزونه
افزونه نمونه
شماره داخلی ثبتشده
212
بازبینی
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
نمای کلی
این افزونه پشتیبانی لازم را برای فعال کردن ترکیب قاب در برنامهها براساس دادههای اضافی ارائهشده توسط برنامه فراهم میکند. تصاویر بُردار حرکت و تصاویر عمق تولیدشده توسط برنامه ممکن است توسط زمان اجرا برای انجام برونیابی و بازتابش قاب با کیفیت بالا برای ترکیب قاب جدید استفاده شود، که تجربه روانی را حتی زمانی که برنامه زیر هدف 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;
توضیحات عضو
typeXrStructureType این ساختار است.-
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] باشند. این شبیه به مقادیر حداقل و حداکثرglDepthRangeOpenGL است، اما با این شرط که 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» است.
استفاده معتبر (ضمنی)
- افزونه
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 (چند هدف پردازشی) پردازش کند. تصمیمگیری درباره رویکرد خاص برعهده برنامه است. قالبهای کانال پیکسل ممیز شناور ۱۶ بیتی علامتدار برای 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;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
recommendedMotionVectorImageRectWidth: عرض تصویر عمق و بردار حرکت توصیهشده. -
recommendedMotionVectorImageRectHeight: ارتفاع تصویر عمق و بردار حرکت توصیهشده.
وقتی این افزونه فعال باشد، برنامه میتواند هنگام فراخوانی xrEnumerateViewConfigurationViews برای کسب اطلاعات درباره وضوح تصویر بردار حرکت توصیهشده، ساختار XrFrameSynthesisConfigViewEXT را در زنجیره XrViewConfigurationView :: next ارسال کند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_frame_synthesisباید قبلاز استفاده از XrFrameSynthesisConfigViewEXT فعال شود -
typeبایدXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد
سازههای جدید
درحال گسترش دادن XrCompositionLayerProjectionView :
درحال گسترش دادن XrViewConfigurationView :
ثابتهای شمارشی جدید
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONدرحال گسترش دادن XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
مشکلات
سابقه نسخه
بازبینی ۱، ۲۰۲۲/۰۱/۳۱ (Jian Zhang)
- Initial extension description, converted from fb_space_warp
- مشارکت با همیاران برای بهبود رابطهای افزونه.