XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
Extension Type
ส่วนขยายอินสแตนซ์
Registered Extension Number
212
Revision
1
Ratification Status
ยังไม่ได้รับการอนุมัติ
Extension and Version Dependencies
Contributors
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 และทั้ง 2 ส่วนขยายอาจ เปิดใช้และใช้งานพร้อมกันได้เพื่อวัตถุประสงค์ที่แตกต่างกัน 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หรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างlayerFlagsคือบิตแมสก์ของ XrFrameSynthesisInfoFlagsEXTmotionVectorSubImageระบุรูปภาพเวกเตอร์ของการเคลื่อนไหว XrSwapchainSubImage ที่จะใช้สำหรับการสังเคราะห์เฟรมmotionVectorScaleคือ XrVector4f ซึ่งปรับขนาดการตีความเวกเตอร์ของการเคลื่อนไหวในmotionVectorSubImagemotionVectorOffsetคือ XrVector4f ซึ่งชดเชยการตีความเวกเตอร์ของการเคลื่อนไหวในmotionVectorSubImageappSpaceDeltaPoseคือการแปลงที่เพิ่มขึ้นซึ่งแอปพลิเคชันใช้ (หากมี) ซึ่งส่งผลต่อมุมมองตั้งแต่เฟรมก่อนหน้า ประสบการณ์การเคลื่อนที่เทียม (การเคลื่อนไหวที่เขียนสคริปต์ การเทเลพอร์ต ฯลฯ) เกี่ยวข้องกับการที่แอปพลิเคชันแปลงทั้งหมดของ XrCompositionLayerProjection ::spaceจากท่าทางในพื้นที่แอปพลิเคชันหนึ่งไปยังอีกท่าทางหนึ่งระหว่างเฟรม ซึ่งส่งผลต่อมุมมองมากกว่าการเคลื่อนไหวที่ติดตามระหว่างเฟรม TheappSpaceDeltaPoseต้อง เป็นการแปลงเอกลักษณ์เมื่อไม่มีการแปลง XrCompositionLayerProjection ::spaceในแอปพลิเคชัน ของ XrPosef ในpositionappSpaceDeltaPoseต้อง สัมพันธ์กับ ปัจจุบันของ XrCompositionLayerProjection ในแอปพลิเคชันspacedepthSubImageระบุรูปภาพความลึก XrSwapchainSubImage ที่จะใช้สำหรับการสังเคราะห์เฟรมminDepthและmaxDepthคือช่วงของค่าความลึกในdepthSubImageและต้อง อยู่ในช่วง [0.0,1.0] ซึ่งคล้ายกับค่าต่ำสุดและค่าสูงสุดของglDepthRangeใน OpenGL แต่มีข้อกำหนดที่ว่า maxDepth ≥ minDepthnearZคือระยะทางเป็นเมตรที่เป็นค่าบวกของค่า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 "
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
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) แอปพลิเคชันมีสิทธิ์ตัดสินใจเลือกแนวทางที่เฉพาะเจาะจง ขอแนะนำให้ใช้รูปแบบช่องสัญญาณต่อพิกเซลแบบทศนิยม 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ระบุว่ามีการใช้ข้อมูลเวกเตอร์ของการเคลื่อนไหว 2 มิติXR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTให้คำแนะนำแก่รันไทม์ว่าแอปพลิเคชันต้องการเวลาเพิ่มเติมในการแสดงผลแต่ละเฟรม โดยมีข้อแลกเปลี่ยนคือรันไทม์จะสังเคราะห์เฟรมเพิ่มเติม ซึ่งอาจมีประโยชน์สำหรับแอปพลิเคชันที่ต้องการประหยัดการใช้งาน CPU และ GPU (เช่น เพื่อยืดอายุการใช้งานแบตเตอรี่) หรือเพิ่มงบประมาณการคำนวณของแต่ละเฟรม รันไทม์อาจ ขอเฟรมในช่วงเวลาใดก็ได้ โดยไม่คำนึงถึงค่าของแฟล็กนี้
โดยค่าเริ่มต้น รันไทม์คาดหวังข้อมูลเวกเตอร์ของการเคลื่อนไหว 3 มิติ ดังนั้นระบบจะใช้ motionVectorSubImage rgb, motionVectorScale xyz และ motionVectorOffset xyz ตามที่อธิบายไว้ใน XrFrameSynthesisInfoEXT
เมื่อเปิดใช้ XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT ใน XrFrameSynthesisInfoEXT layerFlags รันไทม์จะตีความรูปภาพเวกเตอร์ของการเคลื่อนไหวที่ส่งมาเป็นข้อมูลเวกเตอร์ของการเคลื่อนไหว 2 มิติ ซึ่งแสดงถึงการเคลื่อนไหวของพิกเซล 2 มิติจากเฟรมก่อนหน้าไปยังเฟรมปัจจุบัน ระบบจะตีความค่าพิกเซลดังนี้สำหรับข้อมูลเวกเตอร์ของการเคลื่อนไหว 2 มิติ motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy ระบบจะเพิกเฉยต่อคอมโพเนนต์ motionVectorSubImage ba , motionVectorScale zw และ motionVectorOffset zw การใช้ข้อมูลเวกเตอร์ของการเคลื่อนไหว 2 มิติแทน 3 มิติอาจ ลดคุณภาพของเฟรมที่สังเคราะห์
รับความละเอียดที่แนะนำ
โครงสร้าง XrFrameSynthesisConfigViewEXT มีการกำหนดไว้ดังนี้
typedef struct XrFrameSynthesisConfigViewEXT {
XrStructureType type;
void* next;
uint32_t recommendedMotionVectorImageRectWidth;
uint32_t recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างrecommendedMotionVectorImageRectWidth: ความกว้างของรูปภาพเวกเตอร์ของการเคลื่อนไหวและความลึกที่แนะนำrecommendedMotionVectorImageRectHeight: ความสูงของรูปภาพเวกเตอร์ของการเคลื่อนไหวและความลึกที่แนะนำ
เมื่อเปิดใช้ส่วนขยายนี้ แอปพลิเคชัน สามารถ ส่งโครงสร้าง XrFrameSynthesisConfigViewEXT ในห่วงโซ่ XrViewConfigurationView :: next เมื่อเรียก xrEnumerateViewConfigurationViews เพื่อรับข้อมูลเกี่ยวกับความละเอียดของรูปภาพเวกเตอร์ของการเคลื่อนไหวที่แนะนำ
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_frame_synthesisต้อง ก่อนใช้ XrFrameSynthesisConfigViewEXT -
typeต้อง เป็นXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextต้อง เป็นNULLหรือตัวชี้ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง
โครงสร้างใหม่
การขยาย XrCompositionLayerProjectionView :
การขยาย XrViewConfigurationView :
ค่าคงที่ Enum ใหม่
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONการขยาย XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_TYPE_FRAME_SYNTHESIS_INFO_EXT
ปัญหา
ประวัติเวอร์ชัน
การแก้ไข 1, 2022-01-31 (Jian Zhang)
- คำอธิบายส่วนขยายเริ่มต้น ซึ่งแปลงจาก fb_space_warp
- ทำงานร่วมกับผู้เขียนเพื่อปรับแต่งอินเทอร์เฟซส่วนขยาย