XR_EXT_frame_synthesis

Name String

XR_EXT_frame_synthesis

ประเภทส่วนขยาย

ส่วนขยายอินสแตนซ์

หมายเลขต่อที่ลงทะเบียนไว้

212

การแก้ไข

1

สถานะการให้สัตยาบัน

ไม่ได้รับการให้สัตยาบัน

ทรัพยากร Dependency ของส่วนขยายและเวอร์ชัน

OpenXR 1.0

ผู้เขียน

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 คือบิตมาสก์ของ XrFrameSynthesisInfoFlagsEXT
  • motionVectorSubImage ระบุรูปภาพเวกเตอร์การเคลื่อนไหว XrSwapchainSubImage ที่จะใช้สำหรับการสังเคราะห์เฟรม
  • motionVectorScale คือ XrVector4f ซึ่งปรับขนาดการตีความเวกเตอร์การเคลื่อนไหวใน motionVectorSubImage
  • motionVectorOffset คือ XrVector4f ซึ่งออฟเซ็ตการตีความเวกเตอร์ของการเคลื่อนไหวใน motionVectorSubImage
  • appSpaceDeltaPose คือการเปลี่ยนรูปแบบที่แอปพลิเคชันใช้เพิ่มขึ้น (หากมี) ซึ่งส่งผลต่อมุมมองตั้งแต่เฟรมก่อนหน้า ประสบการณ์การเคลื่อนไหวเทียม (การเคลื่อนไหวตามสคริปต์ การเทเลพอร์ต ฯลฯ) เกี่ยวข้องกับแอปพลิเคชันที่เปลี่ยน XrCompositionLayerProjection :: space ทั้งหมดจากท่าทางหนึ่งในพื้นที่แอปพลิเคชันไปยังอีกท่าทางหนึ่งระหว่างเฟรม ซึ่งส่งผลต่อมุมมองมากกว่าการเคลื่อนไหวที่ติดตามระหว่างเฟรม appSpaceDeltaPose ต้องเป็นเอกลักษณ์เมื่อไม่มีการเปลี่ยนรูปแบบ XrCompositionLayerProjection :: space ในแอปพลิเคชัน XrPosef :: position ใน appSpaceDeltaPose ต้องสัมพันธ์กับ XrCompositionLayerProjection :: space ของแอปพลิเคชันปัจจุบัน
  • depthSubImage ระบุรูปภาพความลึก XrSwapchainSubImage ที่จะใช้สำหรับการสังเคราะห์เฟรม
  • minDepth และ maxDepth คือช่วงของค่าความลึกใน depthSubImage และต้องอยู่ในช่วง [0.0,1.0] ซึ่งคล้ายกับค่าต่ำสุดและสูงสุดของ glDepthRange ของ OpenGL แต่มีข้อกำหนดที่นี่ว่า maxDepth ≥ minDepth
  • nearZ คือระยะทางบวกในหน่วยเมตรของค่า 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 "

การใช้งานที่ถูกต้อง (โดยนัย)

หมายเหตุ

การสร้าง 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 เพื่อรับข้อมูลเกี่ยวกับความละเอียดของรูปภาพเวกเตอร์การเคลื่อนไหวที่แนะนำ

การใช้งานที่ถูกต้อง (โดยนัย)

โครงสร้างใหม่

ค่าคงที่ Enum ใหม่

  • 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

ปัญหา

ประวัติเวอร์ชัน

  • การแก้ไขครั้งที่ 1, 31-01-2022 (Jian Zhang)

    • คำอธิบายส่วนขยายเริ่มต้น แปลงมาจาก fb_space_warp
    • ทำงานร่วมกับผู้ร่วมให้ข้อมูลเพื่อปรับแต่งอินเทอร์เฟซส่วนขยาย