XR_EXT_frame_synthesis

Name String

XR_EXT_frame_synthesis

Extension Type

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

Registered Extension Number

212

Revision

1

Ratification Status

ยังไม่ได้รับการอนุมัติ

Extension and Version Dependencies

OpenXR 1.0

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 คือบิตแมสก์ของ XrFrameSynthesisInfoFlagsEXT
  • motionVectorSubImage ระบุรูปภาพเวกเตอร์ของการเคลื่อนไหว XrSwapchainSubImage ที่จะใช้สำหรับการสังเคราะห์เฟรม
  • motionVectorScale คือ XrVector4f ซึ่งปรับขนาดการตีความเวกเตอร์ของการเคลื่อนไหวใน motionVectorSubImage
  • motionVectorOffset คือ XrVector4f ซึ่งชดเชยการตีความเวกเตอร์ของการเคลื่อนไหวใน motionVectorSubImage
  • appSpaceDeltaPose คือการแปลงที่เพิ่มขึ้นซึ่งแอปพลิเคชันใช้ (หากมี) ซึ่งส่งผลต่อมุมมองตั้งแต่เฟรมก่อนหน้า ประสบการณ์การเคลื่อนที่เทียม (การเคลื่อนไหวที่เขียนสคริปต์ การเทเลพอร์ต ฯลฯ) เกี่ยวข้องกับการที่แอปพลิเคชันแปลงทั้งหมดของ XrCompositionLayerProjection :: space จากท่าทางในพื้นที่แอปพลิเคชันหนึ่งไปยังอีกท่าทางหนึ่งระหว่างเฟรม ซึ่งส่งผลต่อมุมมองมากกว่าการเคลื่อนไหวที่ติดตามระหว่างเฟรม The 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 (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 เพื่อรับข้อมูลเกี่ยวกับความละเอียดของรูปภาพเวกเตอร์ของการเคลื่อนไหวที่แนะนำ

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

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

ค่าคงที่ 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, 2022-01-31 (Jian Zhang)

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