XR_EXT_frame_synthesis
Name String
XR_EXT_frame_synthesis
ประเภทส่วนขยาย
ส่วนขยายอินสแตนซ์
หมายเลขต่อที่ลงทะเบียนไว้
212
การแก้ไข
1
สถานะการให้สัตยาบัน
ไม่ได้รับการให้สัตยาบัน
ทรัพยากร Dependency ของส่วนขยายและเวอร์ชัน
ผู้เขียน
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หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้างlayerFlagsคือบิตมาสก์ของ XrFrameSynthesisInfoFlagsEXTmotionVectorSubImageระบุรูปภาพเวกเตอร์การเคลื่อนไหว XrSwapchainSubImage ที่จะใช้สำหรับการสังเคราะห์เฟรมmotionVectorScaleคือ XrVector4f ซึ่งปรับขนาดการตีความเวกเตอร์การเคลื่อนไหวในmotionVectorSubImagemotionVectorOffsetคือ XrVector4f ซึ่งออฟเซ็ตการตีความเวกเตอร์ของการเคลื่อนไหวในmotionVectorSubImageappSpaceDeltaPoseคือการเปลี่ยนรูปแบบที่แอปพลิเคชันใช้เพิ่มขึ้น (หากมี) ซึ่งส่งผลต่อมุมมองตั้งแต่เฟรมก่อนหน้า ประสบการณ์การเคลื่อนไหวเทียม (การเคลื่อนไหวตามสคริปต์ การเทเลพอร์ต ฯลฯ) เกี่ยวข้องกับแอปพลิเคชันที่เปลี่ยน XrCompositionLayerProjection ::spaceทั้งหมดจากท่าทางหนึ่งในพื้นที่แอปพลิเคชันไปยังอีกท่าทางหนึ่งระหว่างเฟรม ซึ่งส่งผลต่อมุมมองมากกว่าการเคลื่อนไหวที่ติดตามระหว่างเฟรมappSpaceDeltaPoseต้องเป็นเอกลักษณ์เมื่อไม่มีการเปลี่ยนรูปแบบ XrCompositionLayerProjection ::spaceในแอปพลิเคชัน XrPosef ::positionในappSpaceDeltaPoseต้องสัมพันธ์กับ XrCompositionLayerProjection ::spaceของแอปพลิเคชันปัจจุบันdepthSubImageระบุรูปภาพความลึก 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 (เป้าหมายการแสดงผลหลายรายการ) แอปพลิเคชันจะเป็นผู้ตัดสินใจเลือกแนวทางที่เฉพาะเจาะจง ขอแนะนำให้ใช้รูปแบบช่องสัญญาณแบบ Signed 16 Bit Float ต่อพิกเซลสำหรับ 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หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง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, 31-01-2022 (Jian Zhang)
- คำอธิบายส่วนขยายเริ่มต้น แปลงมาจาก fb_space_warp
- ทำงานร่วมกับผู้ร่วมให้ข้อมูลเพื่อปรับแต่งอินเทอร์เฟซส่วนขยาย