سنتز قاب 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 این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
layerFlagsیک ماسک بیتی از XrFrameSynthesisInfoFlagsEXT است. -
motionVectorSubImageتصویر برداری متحرک XrSwapchainSubImage را که قرار است برای سنتز فریم استفاده شود، شناسایی میکند. -
motionVectorScaleیک XrVector4f است که تفسیر بردار حرکت درmotionVectorSubImageرا مقیاسبندی میکند. -
motionVectorOffsetیک XrVector4f است که تفسیر بردار حرکت را درmotionVectorSubImageتعدیل میکند. -
appSpaceDeltaPoseتبدیل افزایشی اعمال شده توسط برنامه است، در صورت وجود، که از زمان فریم قبلی بر نما تأثیر میگذارد. تجربیات حرکت مصنوعی (حرکت اسکریپتی، تلهپورت و غیره) شامل برنامهای است که کلspaceXrCompositionLayerProjection :: را از یک حالت فضای برنامه به حالت دیگر بین فریمها تبدیل میکند و نما را بیش از حرکت ردیابی شده بین فریمها تحت تأثیر قرار میدهد.appSpaceDeltaPoseباید زمانی که هیچ تبدیل XrCompositionLayerProjection ::spaceدر برنامه وجود ندارد، یکسان باشد.positionXrPosef :: در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" است.
کاربرد معتبر (ضمنی)
- افزونهی
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 (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 این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
recommendedMotionVectorImageRectWidth: عرض تصویر بردار حرکت و عمق توصیه شده. -
recommendedMotionVectorImageRectHeight: ارتفاع تصویر بردار حرکت و عمق توصیه شده.
وقتی این افزونه فعال باشد، یک برنامه میتواند هنگام فراخوانی xrEnumerateViewConfigurationViews ، ساختار XrFrameSynthesisConfigViewEXT را در زنجیره next XrViewConfigurationView :: ارسال کند تا اطلاعاتی در مورد وضوح تصویر برداری متحرک توصیه شده کسب کند.
کاربرد معتبر (ضمنی)
- افزونهی
XR_EXT_frame_synthesisباید قبل از استفاده از XrFrameSynthesisConfigViewEXT فعال شود. -
typeبایدXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTباشد. -
nextبایدNULLیا یک اشارهگر معتبر به ساختار بعدی در یک زنجیره ساختار باشد.
سازههای جدید
گسترش XrCompositionLayerProjectionView :
گسترش 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
- همکاری با مشارکتکنندگان برای اصلاح رابطهای افزونه.