XR_EXT_spatial_container

Name String

XR_EXT_spatial_container

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

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

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

811

การแก้ไข

1

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

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

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

OpenXR 1.0

วันที่แก้ไขล่าสุด

2026-08-06

สถานะ IP

ไม่มีการอ้างสิทธิ์ IP ที่ทราบ

ผู้เขียน

Jared Finder, Google
Andreas Loeve Selvik, Meta Platforms
Lachlan Ford, Google
Cass Everitt, Meta Platforms
Adam Gousetis, Meta Platforms
Ankur Agrawal, Unity Technologies
Bjorn Swenson, LÖVR
Denny Rönngren, Varjo Technologies
Fredia Huya-Kouadio, Godot Engine
Guodong Rong, Meta Platforms
Jakob Bornecrantz, NVIDIA
Jian Zhang, ByteDance
John Kearney, Meta Platforms
Jonathan Wright, Meta Platforms
Junfeng She, ByteDance
Kenny Vercaemer, Google
Kurtis Eveleigh, Qualcomm
Mauricio Narvaez, Meta Platforms
Nathan Nuber, Valve Corporation
Nihav Jain, Google
Nikita Lutsenko, Meta Platforms
Praveen Babu J D, ByteDance
Rylie Pavlik, Collabora
Salar Khan, Google
Shuai Liu, ByteDance
Walter Luh, Meta Platforms
Yin Li, Microsoft
Zhipeng Liu, ByteDance

ภาพรวม

ส่วนขยายนี้กำหนดเอนทิตีที่แสดงได้คลาสใหม่ที่เรียกว่า "คอนเทนเนอร์เชิงพื้นที่" ซึ่งคล้ายกับแนวคิดของ "หน้าต่าง" ในระบบหน้าต่าง 2 มิติบนเดสก์ท็อป

ใน OpenXR 1.x แอปจะควบคุมทุกสิ่งที่ผู้ใช้เห็นและวิธีผสมผสานสิ่งนั้นไว้ด้านบนของสภาพแวดล้อมจริงหรือเสมือนของผู้ใช้แต่เพียงผู้เดียว รันไทม์จะทำการแก้ไขเล็กน้อยในสิ่งที่แสดงเพื่อความปลอดภัยของผู้ใช้ โมเดลแอปนี้เหมาะสำหรับการทำให้ผู้ใช้ดื่มด่ำกับประสบการณ์เดียว แต่ไม่ครอบคลุมถึงประสบการณ์หลายอย่างพร้อมกัน โดยเฉพาะอย่างยิ่งในสภาพแวดล้อม AR และเทคโนโลยีความจริงแบบผสม (MR) ผู้ใช้มักต้องการสัมผัสประสบการณ์การใช้งานแอปต่างๆ หลายแอปพร้อมกัน

คอนเทนเนอร์เชิงพื้นที่ก็เหมือนกับหน้าต่างที่ขยายเป็น 3 มิติ ผู้ใช้จะเห็นคอนเทนเนอร์เชิงพื้นที่หลายรายการพร้อมกันและป้อนข้อมูลลงในคอนเทนเนอร์บางส่วน คอนเทนเนอร์เชิงพื้นที่ที่มองเห็นได้สามารถเป็นของแอปต่างๆ และรันไทม์จะจัดการขนาดและตำแหน่งในนามของผู้ใช้

ส่วนขยายนี้รองรับประสบการณ์การใช้งานแบบมีขอบเขตเชิงพื้นที่ประเภทใหม่ๆ เหล่านี้ นอกเหนือจากประสบการณ์การใช้งาน OpenXR แบบสมจริงที่มีอยู่ ประสบการณ์การใช้งาน OpenXR แบบจำกัดอนุญาตให้มีเนื้อหา 3 มิติเล็กน้อย (แผงแบนที่มีออฟเซ็ตความลึกเล็กน้อย) หรือวอลุ่มที่โฮสต์เนื้อหา 3 มิติเต็มรูปแบบ ประสบการณ์การใช้งาน OpenXR ที่สมจริงคือแอปแบบสมจริงเต็มหน้าจอที่มีอยู่ซึ่งได้รับการรองรับตั้งแต่ OpenXR 1.0 แอปสามารถสลับไปมาระหว่างเนื้อหา 2 ประเภทได้หากแอปเลือกที่จะทำเช่นนั้น

ส่วนขยายนี้ไม่ได้กำหนดวิธีการใดๆ สำหรับแอปในการแสดงผลเนื้อหา วิธีวาดเนื้อหาได้รับการกำหนดไว้ในส่วนขยายอื่นๆ: XR_EXT_spatial_container_self_rendering

การใช้คอนเทนเนอร์เชิงพื้นที่

XrSpatialContainerEXT คือแฮนเดิลที่แสดงถึงคอนเทนเนอร์เชิงพื้นที่

XR_DEFINE_HANDLE(XrSpatialContainerEXT)

แอปพลิเคชันจะเริ่มแสดงผลผ่านคอนเทนเนอร์เชิงพื้นที่โดยทำตามขั้นตอนต่อไปนี้

  1. สร้างคอนเทนเนอร์เชิงพื้นที่ด้วย xrCreateSpatialContainerEXT
  2. แก้ไขสถานะใดก็ได้ในคอนเทนเนอร์สำหรับการนำเสนอครั้งแรก เช่น โหมดขอบเขต
  3. ขอให้รันไทม์แสดงคอนเทนเนอร์ด้วย xrRequestSpatialContainerVisibleEXT
  4. รอให้รันไทม์พร้อมแสดงคอนเทนเนอร์ เมื่อรันไทม์พร้อมแล้ว ระบบจะจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT โดยตั้งค่า visible เป็น XR_TRUE
  5. เริ่มแสดงผลคอนเทนเนอร์เชิงพื้นที่

และวิธีทำลายคอนเทนเนอร์เชิงพื้นที่เป็นดังนี้

  1. ขอให้รันไทม์ซ่อนคอนเทนเนอร์ด้วย xrRequestSpatialContainerVisibleEXT
  2. รอให้รันไทม์ซ่อนคอนเทนเนอร์ให้เสร็จสิ้น เมื่อรันไทม์ซ่อนคอนเทนเนอร์โดยสมบูรณ์แล้ว ระบบจะจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT โดยตั้งค่า visible เป็น XR_FALSE
  3. สิ้นสุดการแสดงผลสำหรับคอนเทนเนอร์เชิงพื้นที่
  4. ทำลายคอนเทนเนอร์ด้วย xrDestroySpatialContainerEXT

หมายเหตุ

ส่วนขยายนี้ออกแบบมาเพื่อมอบสิทธิ์การเข้าถึงและการจัดการโฟกัสให้กับคอนเทนเนอร์เชิงพื้นที่แต่ละรายการ เนื่องจากเซสชันโดยรวมไม่ได้แสดงออบเจ็กต์ที่มองเห็นได้หรือโฟกัสเพียงรายการเดียวอีกต่อไป เซสชันจึงไม่เปลี่ยนผ่านเครื่องสถานะ OpenXR มาตรฐาน (READY, SYNCHRONIZED, VISIBLE, FOCUSED) แต่เซสชันจะยังคงอยู่ใน XR_SESSION_STATE_IDLE ตลอดอายุการใช้งาน และกฎในการเปลี่ยนแปลงสถานะเซสชันจะระบุวิธีที่การดำเนินการ OpenXR หลักเชื่อมโยงกับโหมดนี้

สร้างคอนเทนเนอร์เชิงพื้นที่

ฟังก์ชัน xrCreateSpatialContainerEXT จะสร้างคอนเทนเนอร์เชิงพื้นที่ใหม่

XrResult xrCreateSpatialContainerEXT(
    XrSession                                   session,
    const XrSpatialContainerCreateInfoEXT*      createInfo,
    XrSpatialContainerEXT*                      spatialContainer);

คำอธิบายพารามิเตอร์

  • session คือ XrSession ที่สร้างคอนเทนเนอร์เชิงพื้นที่
  • createInfo เป็นตัวชี้ไปยัง XrSpatialContainerCreateInfoEXT ที่มีพารามิเตอร์สำหรับสร้างคอนเทนเนอร์เชิงพื้นที่
  • spatialContainer คือตัวชี้ไปยังแฮนเดิลที่แสดงผล XrSpatialContainerEXT ที่สร้างขึ้น

XrSpatialContainerEXT ที่สร้างขึ้นใหม่ต้องไม่แสดง ไม่สามารถโต้ตอบได้ และอยู่ในโหมดขอบเขต XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT แอปที่ต้องการให้คอนเทนเนอร์เชิงพื้นที่เริ่มต้นในโหมดใหญ่พิเศษสามารถขอโหมดขอบเขตเป็น XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT ก่อนที่จะขอให้แสดงคอนเทนเนอร์เชิงพื้นที่ได้

รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE หากมิติข้อมูลใดๆ ของ XrSpatialContainerCreateInfoEXT :: suggestedBounds เป็นค่าลบ ไม่มีที่สิ้นสุด หรือไม่ใช่ตัวเลข รันไทม์ต้องแสดงผล XR_ERROR_LIMIT_REACHED หากแอปพยายามสร้างคอนเทนเนอร์เชิงพื้นที่มากกว่าที่ระบุไว้ใน XrSystemSpatialContainerPropertiesEXT :: maxSpatialContainerCount หากไม่ได้เปิดใช้คอนเทนเนอร์เชิงพื้นที่สำหรับเซสชันนี้ รันไทม์ต้องแสดงผล XR_ERROR_SPATIAL_CONTAINERS_NOT_ENABLED_EXT

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

  • ต้องเปิดใช้ส่วนขยาย XR_EXT_spatial_container ก่อนเรียกใช้ xrCreateSpatialContainerEXT
  • session ต้องเป็นแฮนเดิล XrSession ที่ถูกต้อง
  • createInfo ต้องเป็นตัวชี้ไปยังโครงสร้าง XrSpatialContainerCreateInfoEXT ที่ถูกต้อง
  • spatialContainer ต้องเป็นตัวชี้ไปยังแฮนเดิล XrSpatialContainerEXT

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINERS_NOT_ENABLED_EXT
  • XR_ERROR_VALIDATION_FAILURE

ระบบจะส่ง XrSpatialContainerCreateInfoEXT ไปยัง xrCreateSpatialContainerEXT เพื่อสร้างคอนเทนเนอร์เชิงมิติพื้นที่

typedef struct XrSpatialContainerCreateInfoEXT {
    XrStructureType                              type;
    const void*                                  next;
    XrSpatialContainerGraphicsPresentationEXT    graphicsPresentation;
    XrExtent3Df                                  suggestedBounds;
} XrSpatialContainerCreateInfoEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • graphicsPresentation คือ XrSpatialContainerGraphicsPresentationEXT ที่อธิบายวิธีที่คอนเทนเนอร์เชิงพื้นที่นี้แสดงกราฟิก
  • suggestedBounds คือ XrExtent3Df ที่อธิบายขนาดที่ขอของคอนเทนเนอร์เชิงพื้นที่ในหน่วยเมตร

แอปที่ไม่มีค่ากำหนดสำหรับขนาดของตนเองสามารถตั้งค่า suggestedBounds เป็น {0, 0, 0} ได้ รันไทม์อาจละเว้น suggestedBounds ที่ขอ

รันไทม์ที่อนุญาตให้คอนเทนเนอร์เชิงพื้นที่ถูกจำกัดด้วยรูปร่างอื่นๆ นอกเหนือจากกล่องที่กำหนดทิศทางต้องใช้ suggestedBounds เป็นกรอบล้อมรอบรูปร่างอื่นๆ กล่องที่ปรับแนวเป็นรูปร่างขอบเขตที่พบบ่อยที่สุด

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

เมื่อคอนเทนเนอร์เชิงพื้นที่ใช้งานไม่ได้อีกต่อไป รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerClosedEXT

typedef struct XrEventDataSpatialContainerClosedEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
} XrEventDataSpatialContainerClosedEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • spatialContainer คือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อ

การได้รับเหตุการณ์ XrEventDataSpatialContainerClosedEXT บ่งชี้ว่ารันไทม์ไม่สามารถแสดงคอนเทนเนอร์เชิงพื้นที่ได้อีกต่อไป เช่น เนื่องจากผู้ใช้คลิกปุ่ม "ปิด" หรือเซสชันเข้าสู่สถานะ XR_SESSION_STATE_LOSS_PENDING

หลังจากได้รับเหตุการณ์ XrEventDataSpatialContainerClosedEXT แอปควรหยุดใช้คอนเทนเนอร์เชิงพื้นที่นั้น ล้างสถานะที่เกี่ยวข้อง เช่น ลูปการแสดงผล และทำลายคอนเทนเนอร์ รันไทม์ต้องแสดงผล XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT จากฟังก์ชันทั้งหมดที่ทำงานในคอนเทนเนอร์นั้นนอกเหนือจาก xrDestroySpatialContainerEXT

หากคอนเทนเนอร์เชิงพื้นที่ปรากฏขึ้นเมื่อรันไทม์จัดคิวเหตุการณ์ปิด รันไทม์ต้องเปลี่ยนคอนเทนเนอร์เป็นไม่ปรากฏก่อน แล้วจึงจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT

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

ฟังก์ชัน xrDestroySpatialContainerEXT จะทำลายคอนเทนเนอร์เชิงพื้นที่ที่มีอยู่

XrResult xrDestroySpatialContainerEXT(
    XrSpatialContainerEXT                       spatialContainer);

คำอธิบายพารามิเตอร์

หลังจากทำลายคอนเทนเนอร์เชิงพื้นที่แล้ว รันไทม์ต้องไม่แสดงเนื้อหาของคอนเทนเนอร์อีก และต้องไม่จัดคิวเหตุการณ์เพิ่มเติมเกี่ยวกับคอนเทนเนอร์

แอปไม่ควรทำลายคอนเทนเนอร์เชิงพื้นที่ที่มองเห็นได้ เนื่องจากการทำเช่นนั้นอาจส่งผลให้เกิดข้อบกพร่องด้านกราฟิก แต่แอปควรขอซ่อนคอนเทนเนอร์เชิงพื้นที่ด้วย xrRequestSpatialContainerVisibleEXT รอเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT แล้วจึงทำลายคอนเทนเนอร์

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

  • ต้องเปิดใช้ส่วนขยาย XR_EXT_spatial_container ก่อนเรียกใช้ xrDestroySpatialContainerEXT
  • spatialContainer ต้องเป็นแฮนเดิล XrSpatialContainerEXT ที่ถูกต้อง

ความปลอดภัยของชุดข้อความ

  • การเข้าถึง spatialContainer และแฮนเดิลย่อยต้องซิงค์กับภายนอก

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_RUNTIME_FAILURE

พื้นที่คอนเทนเนอร์เชิงพื้นที่

ฟังก์ชัน xrCreateSpatialContainerSpaceEXT จะสร้างแฮนเดิล XrSpace สำหรับพื้นที่คอนเทนเนอร์เชิงมิติพื้นที่ของคอนเทนเนอร์เชิงมิติพื้นที่ที่เฉพาะเจาะจง

XrResult xrCreateSpatialContainerSpaceEXT(
    XrSession                                   session,
    const XrSpatialContainerSpaceCreateInfoEXT* createInfo,
    XrSpace*                                    space);

คำอธิบายพารามิเตอร์

  • session คือ XrSession ที่สร้างพื้นที่ทำงาน
  • createInfo เป็นตัวชี้ไปยัง XrSpatialContainerSpaceCreateInfoEXT ที่มีพารามิเตอร์สำหรับสร้างพื้นที่ทำงาน
  • space คือตัวชี้ไปยังแฮนเดิลที่แสดงผล XrSpace ที่สร้างขึ้น

"พื้นที่คอนเทนเนอร์เชิงพื้นที่" สำหรับคอนเทนเนอร์เชิงพื้นที่หนึ่งๆ คือระบบพิกัดที่มีจุดเริ่มต้นอยู่ที่กึ่งกลางของขอบเขตของคอนเทนเนอร์เชิงพื้นที่นั้น โดยทั่วไปแล้ว พื้นที่นี้จะใช้เป็นพื้นที่ฐานสำหรับฟังก์ชันต่างๆ เช่น xrLocateSpace

+X ชี้ไปที่ด้านขวาของคอนเทนเนอร์ +Y ชี้ไปที่ด้านบนของคอนเทนเนอร์ และ +Z ชี้ไปที่ด้านหน้าของคอนเทนเนอร์ ตัวอย่างเช่น หากคอนเทนเนอร์จัดแนวตามแรงโน้มถ่วง อยู่ด้านหน้าผู้ดู และผู้ดูอยู่ในท่าทางเอกลักษณ์ที่สัมพันธ์กับพื้นที่ LOCAL รันไทม์ต้องปรับทิศทางพื้นที่คอนเทนเนอร์ด้วยการวางแนวเอกลักษณ์ที่สัมพันธ์กับพื้นที่ LOCAL รันไทม์อาจตั้งค่าท่าทางของพื้นที่คอนเทนเนอร์ที่สัมพันธ์กับพื้นที่ LOCAL เป็นท่าทางใดก็ได้เมื่อคอนเทนเนอร์นั้นปรากฏขึ้น

ext spatial container space convention

รูปที่ 18 ข้อตกลงแกนของพื้นที่คอนเทนเนอร์เชิงพื้นที่

พื้นที่คอนเทนเนอร์เชิงพื้นที่เป็นต้นทางที่ไม่ได้ล็อกโลก แอปที่ต้องการจุดเริ่มต้นที่ล็อกไว้กับโลกขณะอยู่ในโหมดใหญ่พิเศษสามารถใช้พื้นที่ที่ล็อกไว้กับโลก เช่น XR_REFERENCE_SPACE_TYPE_LOCAL

รันไทม์อาจเปลี่ยนท่าทางของพื้นที่คอนเทนเนอร์เชิงพื้นที่ได้ทุกเมื่อ โดยทั่วไปเพื่อรองรับผู้ใช้ที่ย้ายคอนเทนเนอร์เชิงพื้นที่ไปยังตำแหน่งหรือการหมุนอื่น รันไทม์อาจเปลี่ยนท่าทางเมื่อเปลี่ยนระหว่างโหมดขอบเขต XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT และ XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT ด้วย

พื้นที่คอนเทนเนอร์เชิงพื้นที่ต้องยังคงเป็นแฮนเดิลที่ถูกต้อง แม้ว่าคอนเทนเนอร์เชิงพื้นที่ที่เกี่ยวข้องจะถูกทำลายด้วย xrDestroySpatialContainerEXT ก็ตาม แม้ว่าคอนเทนเนอร์เชิงพื้นที่จะไม่ปรากฏหรือถูกทำลาย แต่พื้นที่คอนเทนเนอร์เชิงพื้นที่ต้องไม่สามารถระบุตำแหน่งได้เมื่อเทียบกับพื้นที่อื่นๆ XrSpaceLocation :: locationFlags และ XrViewState ::viewStateFlags จะเป็น 0

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

  • ต้องเปิดใช้ส่วนขยาย XR_EXT_spatial_container ก่อนเรียกใช้ xrCreateSpatialContainerSpaceEXT
  • session ต้องเป็นแฮนเดิล XrSession ที่ถูกต้อง
  • createInfo ต้องเป็นตัวชี้ไปยังโครงสร้าง XrSpatialContainerSpaceCreateInfoEXT ที่ถูกต้อง
  • space ต้องเป็นตัวชี้ไปยังแฮนเดิล XrSpace

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialContainerSpaceCreateInfoEXT ใช้กับ xrCreateSpatialContainerSpaceEXT เพื่อสร้างแฮนเดิล XrSpace

typedef struct XrSpatialContainerSpaceCreateInfoEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
} XrSpatialContainerSpaceCreateInfoEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • spatialContainer คือ XrSpatialContainerEXT เพื่อสร้างพื้นที่ทำงาน

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

การนำเสนอคอนเทนเนอร์เชิงพื้นที่

การส่งเนื้อหาของคอนเทนเนอร์เชิงพื้นที่ไปยัง OpenXR เพื่อแสดงผลจะจัดการโดยส่วนขยายอื่นๆ: XR_EXT_spatial_container_self_rendering

หากต้องการอนุญาตให้ส่วนขยายอื่นๆ ระบุวิธีการนำเสนอกราฟิกสำหรับคอนเทนเนอร์เชิงพื้นที่ ส่วนขยายนี้จะกำหนด enum XrSpatialContainerGraphicsPresentationEXT

typedef enum XrSpatialContainerGraphicsPresentationEXT {
    XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT = 1000813000,
    XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_CONFORMANCE_AUTOMATION_EXT = 1000814000,
    XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SYSTEM_RENDERING_EXTX1 = 1000815000,
    XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerGraphicsPresentationEXT;

คำอธิบาย Enum

XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT

คอนเทนเนอร์เชิงพื้นที่ใช้เลเยอร์องค์ประกอบ OpenXR (เพิ่มโดยส่วนขยาย XR_EXT_spatial_container_self_rendering)

XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_CONFORMANCE_AUTOMATION_EXT

ระบบสร้างคอนเทนเนอร์เชิงพื้นที่เพื่อทดสอบความสอดคล้องและไม่มีเส้นทางการแสดงผล (เพิ่มโดยส่วนขยาย XR_EXT_spatial_container_conformance_automation)

XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SYSTEM_RENDERING_EXTX1

คอนเทนเนอร์เชิงพื้นที่ใช้การแสดงผลระบบ OpenXR (เพิ่มโดยส่วนขยาย XR_EXTX1_system_renderer)

สถานะคอนเทนเนอร์เชิงพื้นที่

รันไทม์จะจัดการสถานะคอนเทนเนอร์เชิงพื้นที่ตามทั้งคำขอของแอปและความต้องการของผู้ใช้ ด้วยเหตุนี้ แต่ละแง่มุมของสถานะคอนเทนเนอร์เชิงพื้นที่จึงบันทึกสิ่งต่อไปนี้

  • เมื่อรันไทม์ได้รับอนุญาตให้เปลี่ยนสถานะคอนเทนเนอร์เชิงพื้นที่ สำหรับสถานะคอนเทนเนอร์เชิงพื้นที่ส่วนใหญ่ รันไทม์อาจเปลี่ยนสถานะได้ทุกเมื่อ
  • วิธีที่แอปขอเปลี่ยนแปลงสถานะ รันไทม์อาจเลื่อนคำขอออกไปจนกว่าจะเห็นว่าคำขอนั้นเหมาะสม รันไทม์จะไม่จัดคิวเหตุการณ์เมื่อมีการเลื่อนคำขอ ดังนั้นแอปไม่ควรรอเหตุการณ์ดังกล่าวสำหรับตรรกะที่ไม่เกี่ยวข้อง
  • เหตุการณ์ที่รันไทม์จะจัดคิวเมื่อสถานะคอนเทนเนอร์เชิงพื้นที่เปลี่ยนแปลง รันไทม์จะจัดคิวเหตุการณ์สำหรับการเปลี่ยนแปลงทั้งหมด รวมถึงการเปลี่ยนแปลงที่แอปขอและการเปลี่ยนแปลงที่รันไทม์เริ่ม รันไทม์ต้องไม่จัดคิวเหตุการณ์การเปลี่ยนแปลงสถานะที่ไม่ได้บ่งชี้ถึงการเปลี่ยนแปลง เช่น หากแอปส่งคำขอ 2 รายการเพื่อซ่อนคอนเทนเนอร์อย่างรวดเร็วติดต่อกัน
  • คิวรันไทม์ของเหตุการณ์ใดเมื่อปฏิเสธคำขอเปลี่ยนแปลงแอป รันไทม์อาจปฏิเสธคำขอด้วยเหตุผลใดก็ได้ ซึ่งโดยปกติแล้วจะเกิดจากนโยบายระบบที่เกี่ยวข้องกับการรักษาประสบการณ์ของผู้ใช้ที่มีคุณภาพสูง

ฟังก์ชัน xrGetSpatialContainerStateEXT จะค้นหาสถานะปัจจุบันของคอนเทนเนอร์เชิงพื้นที่

XrResult xrGetSpatialContainerStateEXT(
    XrSpatialContainerEXT                       spatialContainer,
    const XrSpatialContainerStateGetInfoEXT*    getInfo,
    XrSpatialContainerStateEXT*                 state);

คำอธิบายพารามิเตอร์

  • spatialContainer คือ XrSpatialContainerEXT ที่จะค้นหา
  • getInfo คือ XrSpatialContainerStateGetInfoEXT พร้อมข้อมูลที่ใช้เพื่อรับสถานะของคอนเทนเนอร์เชิงมิติพื้นที่
  • state เป็นตัวชี้ไปยัง XrSpatialContainerStateEXT ซึ่งจะแสดงผลสถานะคอนเทนเนอร์เชิงมิติพื้นที่

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

  • ต้องเปิดใช้ส่วนขยาย XR_EXT_spatial_container ก่อนเรียกใช้ xrGetSpatialContainerStateEXT
  • spatialContainer ต้องเป็นแฮนเดิล XrSpatialContainerEXT ที่ถูกต้อง
  • หาก getInfo ไม่ใช่ NULL getInfo ต้องเป็นพอยเตอร์ไปยังโครงสร้าง XrSpatialContainerStateGetInfoEXT ที่ถูกต้อง
  • state ต้องเป็นพอยเตอร์ไปยังโครงสร้าง XrSpatialContainerStateEXT

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialContainerStateGetInfoEXT ใช้กับ xrGetSpatialContainerStateEXT เพื่อค้นหา XrSpatialContainerStateEXT

typedef struct XrSpatialContainerStateGetInfoEXT {
    XrStructureType    type;
    const void*        next;
} XrSpatialContainerStateGetInfoEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้

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

typedef struct XrSpatialContainerStateEXT {
    XrStructureType                    type;
    void*                              next;
    XrBool32                           visible;
    XrBool32                           interactable;
    XrSpatialContainerBoundsModeEXT    boundsMode;
} XrSpatialContainerStateEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • visible แสดงว่าคอนเทนเนอร์เชิงพื้นที่มองเห็นได้หรือไม่
  • interactable แสดงว่าคอนเทนเนอร์เชิงพื้นที่สามารถรับอินพุตประเภทใดก็ได้ในขณะนี้หรือไม่ ซึ่งคล้ายกับ "โฟกัส" สำหรับระบบการจัดการหน้าต่าง 2 มิติบนเดสก์ท็อป โดยมีความแตกต่างตรงที่คอนเทนเนอร์เชิงพื้นที่หลายรายการอาจโต้ตอบได้พร้อมกัน
  • boundsMode คือ XrSpatialContainerBoundsModeEXT ปัจจุบันของคอนเทนเนอร์เชิงพื้นที่

การเปลี่ยนแปลงสถานะของคอนเทนเนอร์เชิงพื้นที่จะสื่อสารผ่านเหตุการณ์

เหตุการณ์การเปลี่ยนแปลงช่อง

visible

XrEventDataSpatialContainerVisibleChangedEXT

interactable

XrEventDataSpatialContainerInteractableChangedEXT

boundsMode

XrEventDataSpatialContainerBoundsChangedEXT

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

ระดับการแชร์

แอปจะขอแสดงหรือซ่อนคอนเทนเนอร์เชิงมิติพื้นที่ด้วย xrRequestSpatialContainerVisibleEXT

XrResult xrRequestSpatialContainerVisibleEXT(
    XrSpatialContainerEXT                       spatialContainer,
    const XrSpatialContainerVisibleRequestInfoEXT* info);

คำอธิบายพารามิเตอร์

การแสดงหรือซ่อนคอนเทนเนอร์เชิงพื้นที่เป็นการดำเนินการแบบอะซิงโครนัส

แอปควรส่งคำขอให้ซ่อนคอนเทนเนอร์เชิงพื้นที่ก่อนที่จะทำลาย เพื่อให้รันไทม์แสดงการเปลี่ยนผ่านที่ราบรื่น รันไทม์ควรทำตามคำขอให้ซ่อนคอนเทนเนอร์เชิงพื้นที่

รันไทม์อาจปฏิเสธคำขอแสดงคอนเทนเนอร์เชิงพื้นที่ ซึ่งในกรณีนี้รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleRequestDeniedEXT ตัวอย่างเช่น รันไทม์บางรายการจะปฏิเสธคำขอให้แสดงคอนเทนเนอร์เชิงพื้นที่ที่ผู้ใช้ซ่อนไว้โดยการโต้ตอบกับปุ่ม "ย่อ" ที่ระบบมีให้

รันไทม์ต้องไม่แสดงคอนเทนเนอร์เชิงพื้นที่ก่อนที่แอปจะขอแสดงคอนเทนเนอร์เชิงพื้นที่นั้นอย่างน้อย 1 ครั้ง หลังจากที่แอปส่งคำขอแรกเพื่อแสดงคอนเทนเนอร์เชิงพื้นที่ รันไทม์อาจเปลี่ยนระดับการมองเห็นของคอนเทนเนอร์เชิงพื้นที่นั้นโดยไม่ขึ้นอยู่กับคำขอของแอป ซึ่งจะช่วยให้แอปควบคุมสถานะเริ่มต้นและเนื้อหาของคอนเทนเนอร์เชิงพื้นที่ได้ และช่วยให้รันไทม์แสดง UI ของระบบ เช่น แถบงานที่ช่วยให้ผู้ใช้เลือกคอนเทนเนอร์เชิงพื้นที่ที่มองเห็นได้

รันไทม์ต้องปฏิเสธคำขอให้แสดงคอนเทนเนอร์เชิงมิติพื้นที่ในโหมดขอบเขตที่ไม่รองรับตาม XrSystemSpatialContainerPropertiesEXT :: supportsBounded และ XrSystemSpatialContainerPropertiesEXT :: supportsImmersive กรณีนี้อาจเกิดขึ้นได้เมื่อระบบไม่รองรับโหมดขอบเขตเริ่มต้น XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT

หมายเหตุ

ในการใช้งานบางอย่าง การแสดงหรือซ่อนคอนเทนเนอร์เชิงพื้นที่ต้องมีการสื่อสารกับบริการของระบบ และอาจเลื่อนออกไปจนกว่าผู้ใช้จะโต้ตอบกับกล่องโต้ตอบของระบบ การออกแบบแบบไม่พร้อมกันสำหรับการขอเปลี่ยนแปลงสถานะระดับการเข้าถึงมีไว้เพื่อให้รันไทม์มีเวลาดำเนินการทั้ง 2 อย่างนี้ให้เสร็จสมบูรณ์

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

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialContainerVisibleRequestInfoEXT ใช้กับ xrRequestSpatialContainerVisibleEXT เพื่อเปลี่ยนระดับการมองเห็นของคอนเทนเนอร์เชิงมิติพื้นที่

typedef struct XrSpatialContainerVisibleRequestInfoEXT {
    XrStructureType    type;
    const void*        next;
    XrBool32           visible;
} XrSpatialContainerVisibleRequestInfoEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • visible แสดงว่ามีการขอให้แสดงหรือซ่อนคอนเทนเนอร์เชิงพื้นที่หรือไม่

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

ทุกครั้งที่รันไทม์เปลี่ยนระดับการเข้าถึงของคอนเทนเนอร์เชิงพื้นที่ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT ด้วยสถานะใหม่

typedef struct XrEventDataSpatialContainerVisibleChangedEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
    XrBool32                 visible;
} XrEventDataSpatialContainerVisibleChangedEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • spatialContainer คือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อ
  • visible คือสถานะการมองเห็นใหม่สำหรับคอนเทนเนอร์เชิงพื้นที่

เหตุการณ์นี้จะแทนที่ XR_SESSION_STATE_VISIBLE ซึ่งช่วยให้ค่าแตกต่างกันไปตามคอนเทนเนอร์ เหตุการณ์ต้องอยู่ในคิวสำหรับการเปลี่ยนแปลงทั้งหมด ซึ่งรวมถึงการเปลี่ยนแปลงที่แอปขอและการเปลี่ยนแปลงที่รันไทม์เริ่มต้น

รันไทม์อาจเลื่อนเวลาการแสดงผลคอนเทนเนอร์ออกไป 2-3 เฟรมหลังจากจัดคิวเหตุการณ์นี้โดยตั้งค่า visible เป็น XR_TRUE เพื่อหลีกเลี่ยงการแสดงคอนเทนเนอร์ว่างเปล่าและให้เวลาแอปส่งเนื้อหาเริ่มต้น ในช่วงเวลานี้ XrSpatialContainerStateEXT ::visible จะเป็น XR_TRUE รันไทม์ไม่ควรทำให้การแสดงผลคอนเทนเนอร์ล่าช้าเกิน 0.5 วินาที

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

ทุกครั้งที่รันไทม์ปฏิเสธคำขอให้แสดงคอนเทนเนอร์ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleRequestDeniedEXT

typedef struct XrEventDataSpatialContainerVisibleRequestDeniedEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
} XrEventDataSpatialContainerVisibleRequestDeniedEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • spatialContainer คือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อ

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

โต้ตอบได้

แอปไม่สามารถขอให้คอนเทนเนอร์เชิงพื้นที่โต้ตอบได้ คอนเทนเนอร์เชิงพื้นที่ที่โต้ตอบได้จะได้รับการควบคุมโดยรันไทม์อย่างเต็มรูปแบบ คอนเทนเนอร์เชิงพื้นที่ที่โต้ตอบได้ต้องมองเห็นได้ด้วย

ทุกครั้งที่รันไทม์เปลี่ยนสถานะที่โต้ตอบได้ของคอนเทนเนอร์เชิงพื้นที่ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerInteractableChangedEXT พร้อมสถานะใหม่

typedef struct XrEventDataSpatialContainerInteractableChangedEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
    XrBool32                 interactable;
} XrEventDataSpatialContainerInteractableChangedEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • spatialContainer คือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อ
  • interactable คือสถานะใหม่ที่โต้ตอบได้สำหรับคอนเทนเนอร์เชิงพื้นที่

เหตุการณ์นี้จะแทนที่ XR_SESSION_STATE_FOCUSED ซึ่งช่วยให้ค่าแตกต่างกันไปตามคอนเทนเนอร์ ระบบจะจัดคิวเหตุการณ์สำหรับการเปลี่ยนแปลงทั้งหมด รวมถึงการเปลี่ยนแปลงที่เริ่มต้นระหว่างรันไทม์

รันไทม์อาจเปิดหรือปิดใช้การโต้ตอบกับคอนเทนเนอร์เชิงพื้นที่ได้ทุกเมื่อ หากรันไทม์รองรับคอนเทนเนอร์เชิงพื้นที่ที่โต้ตอบได้สูงสุด 1 รายการต่อครั้ง เมื่อรันไทม์เปลี่ยนคอนเทนเนอร์เชิงพื้นที่ที่โต้ตอบได้ รันไทม์ต้องจัดคิวเหตุการณ์สำหรับคอนเทนเนอร์เชิงพื้นที่ที่หยุดโต้ตอบได้ ( interactable ตั้งค่าเป็นเท็จ) ก่อนเหตุการณ์สำหรับคอนเทนเนอร์ที่เริ่มโต้ตอบได้ ( interactable ตั้งค่าเป็นจริง)

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

ขอบเขต

คอนเทนเนอร์เชิงพื้นที่ประกอบด้วยโหมดขอบเขตและกรอบล้อมรอบ โหมดขอบเขตของคอนเทนเนอร์เชิงพื้นที่อธิบายลักษณะการทำงานของขอบเขต กรอบล้อมรอบคือสิ่งที่คอนเทนเนอร์เชิงพื้นที่วาดไว้ด้านใน

การแจงนับ XrSpatialContainerBoundsModeEXT จะระบุโหมดต่างๆ ที่ขอบเขตของคอนเทนเนอร์เชิงพื้นที่สามารถอยู่ได้

typedef enum XrSpatialContainerBoundsModeEXT {
    XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT = 1,
    XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT = 2,
    XR_SPATIAL_CONTAINER_BOUNDS_MODE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerBoundsModeEXT;

คำอธิบาย Enum

XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT

คอนเทนเนอร์เชิงพื้นที่ถูกจำกัดขอบเขต ขอบเขตเป็นกล่องที่มีขอบเขตจำกัด คอนเทนเนอร์เชิงพื้นที่นี้จะปรากฏในภูมิภาคนี้เท่านั้น

XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT

คอนเทนเนอร์เชิงพื้นที่เป็นแบบสมจริงและมีขอบเขตไม่จำกัด คอนเทนเนอร์เชิงมิติพื้นที่จะแสดงเต็มหน้าจอ

คอนเทนเนอร์เชิงพื้นที่ที่อยู่ในโหมดขอบเขต XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT มีข้อกำหนดเพิ่มเติมดังนี้

  • รันไทม์ต้องจัดการคอนเทนเนอร์เชิงพื้นที่เหล่านี้เหมือนกับแอปแบบเต็มหน้าจอและแอปที่สมจริงซึ่งสร้างขึ้นโดยไม่ใช้คอนเทนเนอร์เชิงพื้นที่ ยกเว้นการเปลี่ยนแปลงลักษณะการทำงานที่ระบุไว้ในการเปลี่ยนแปลงสถานะเซสชัน
  • รันไทม์อาจมีส่วนขยายเพิ่มเติมที่ช่วยให้คอนเทนเนอร์เชิงพื้นที่แบบสมจริงทำงานแตกต่างจากแอปแบบเต็มหน้าจอและแอปแบบสมจริงที่สร้างขึ้นโดยไม่มีส่วนขยายนี้
  • รันไทม์ต้องรายงานขอบเขตที่ไม่มีที่สิ้นสุดสำหรับคอนเทนเนอร์เชิงพื้นที่เหล่านี้
  • รันไทม์อาจซ่อนคอนเทนเนอร์เชิงพื้นที่อื่นๆ ขณะที่คอนเทนเนอร์เชิงพื้นที่แบบสมจริงปรากฏอยู่ เนื่องจากลักษณะการทำงานนี้อาจแตกต่างกันไปตามรันไทม์ แอปไม่ควรอาศัยคอนเทนเนอร์เชิงพื้นที่ที่แสดงหรือซ่อนโดยอัตโนมัติตามระดับการมองเห็นคอนเทนเนอร์เชิงพื้นที่แบบสมจริง รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT เมื่อคอนเทนเนอร์เชิงพื้นที่ถูกซ่อนเนื่องจากคอนเทนเนอร์แบบสมจริงปรากฏขึ้น เช่นเดียวกับการเปลี่ยนสถานะที่มองเห็นได้อื่นๆ ทั้งหมด

หมายเหตุ

ข้อกำหนดข้างต้นหมายความว่ารันไทม์ทั้งหมดสามารถใช้เส้นทาง OpenXR 1.x ได้โดยไม่ต้องมีส่วนขยายนี้ โดยการสร้างคอนเทนเนอร์เชิงพื้นที่โดยนัย ตั้งค่าโหมดขอบเขตของคอนเทนเนอร์เป็นแบบสมจริง และขอให้มองเห็นได้

แอปจะขอเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์เชิงมิติพื้นที่ด้วย xrRequestSpatialContainerBoundsModeEXT

XrResult xrRequestSpatialContainerBoundsModeEXT(
    XrSpatialContainerEXT                       spatialContainer,
    const XrSpatialContainerBoundsModeRequestInfoEXT* info);

คำอธิบายพารามิเตอร์

การเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์เชิงพื้นที่เป็นการดำเนินการแบบอะซิงโครนัส และรันไทม์อาจจัดคิวเหตุการณ์ที่เปลี่ยนแปลงหรือถูกปฏิเสธหลายวินาทีหลังจากที่แอปขอการเปลี่ยนแปลง ซึ่งจะช่วยให้รันไทม์แสดง UI ที่จำเป็นเพื่อให้ผู้ใช้เข้าสู่โหมดใหญ่พิเศษได้อย่างปลอดภัย

รันไทม์ต้องทำตามคำขอเพื่อเปลี่ยนโหมดขอบเขตสำหรับคอนเทนเนอร์เชิงพื้นที่ที่ไม่แสดง หากรันไทม์ปฏิเสธคำขอโหมดขอบเขตสำหรับคอนเทนเนอร์ที่มองไม่เห็น รันไทม์อาจปฏิเสธหรือเลื่อนคำขอเพื่อแสดงคอนเทนเนอร์เชิงพื้นที่ดังกล่าวแทน ซึ่งจะช่วยให้แอปเริ่มคอนเทนเนอร์เป็นคอนเทนเนอร์ที่สมจริงได้ รันไทม์อาจปฏิเสธคำขอเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์เชิงพื้นที่ที่มองเห็นได้ ซึ่งในกรณีนี้ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerBoundsModeRequestDeniedEXT ตัวอย่างเช่น รันไทม์บางรายการจะปฏิเสธคำขอเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์เชิงพื้นที่ที่มองเห็นได้ซึ่งผู้ใช้ไม่ได้โต้ตอบด้วย

รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE หากแอปขอโหมดขอบเขตที่ไม่รองรับตาม XrSystemSpatialContainerPropertiesEXT :: supportsBounded และ XrSystemSpatialContainerPropertiesEXT :: supportsImmersive

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

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialContainerBoundsModeRequestInfoEXT ใช้กับ xrRequestSpatialContainerBoundsModeEXT เพื่อเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์เชิงมิติพื้นที่

typedef struct XrSpatialContainerBoundsModeRequestInfoEXT {
    XrStructureType                    type;
    const void*                        next;
    XrSpatialContainerBoundsModeEXT    boundsMode;
} XrSpatialContainerBoundsModeRequestInfoEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • boundsMode คือ XrSpatialContainerBoundsModeEXT ที่ต้องการสำหรับคอนเทนเนอร์เชิงมิติพื้นที่

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

ทุกครั้งที่รันไทม์เปลี่ยนขอบเขตหรือโหมดขอบเขตของคอนเทนเนอร์เชิงพื้นที่ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerBoundsChangedEXT พร้อมข้อมูลขอบเขตใหม่

typedef struct XrEventDataSpatialContainerBoundsChangedEXT {
    XrStructureType                    type;
    const void*                        next;
    XrSpatialContainerEXT              spatialContainer;
    XrExtent3Df                        bounds;
    XrBool32                           infiniteBounds;
    XrSpatialContainerBoundsModeEXT    boundsMode;
} XrEventDataSpatialContainerBoundsChangedEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • spatialContainer คือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อ
  • bounds คือความกว้าง ความสูง และความลึกใหม่ของขอบเขตคอนเทนเนอร์เชิงพื้นที่
  • infiniteBounds จะเป็นจริงหากคอนเทนเนอร์มีขอบเขตไม่สิ้นสุด
  • boundsMode คือ XrSpatialContainerBoundsModeEXT ใหม่ของคอนเทนเนอร์เชิงพื้นที่

ระบบจะจัดคิวเหตุการณ์สำหรับการเปลี่ยนแปลงทั้งหมด ซึ่งรวมถึงการเปลี่ยนแปลงที่แอปขอและการเปลี่ยนแปลงที่เริ่มต้นระหว่างรันไทม์

ขณะที่ผู้ใช้ปรับขนาดคอนเทนเนอร์เชิงพื้นที่แบบอินเทอร์แอกทีฟ รันไทม์ต้องทำงานในลักษณะใดลักษณะหนึ่งต่อไปนี้

  • จัดคิวเหตุการณ์จำนวนมาก ซึ่งน่าจะอยู่ที่อัตราเฟรม เนื่องจากผู้ใช้กำลังปรับขนาดคอนเทนเนอร์เชิงพื้นที่
  • จัดคิวเหตุการณ์เดียวเมื่อสิ้นสุดการปรับขนาด

หากรันไทม์จัดคิวเหตุการณ์เดียวเมื่อสิ้นสุดการปรับขนาด รันไทม์นั้นต้องรายงานขอบเขตเดิมจาก xrGetSpatialContainerBoundsEXT ต่อไปจนกว่ารันไทม์จะจัดคิวเหตุการณ์การปรับขนาด รันไทม์ต้องรวมเหตุการณ์การเปลี่ยนแปลงขอบเขตที่ไม่ได้สำรวจหลายรายการเข้าด้วยกัน กล่าวคือ หากขอบเขตหรือโหมดขอบเขตเปลี่ยนแปลงขณะที่ยังมีเหตุการณ์ XrEventDataSpatialContainerBoundsChangedEXT อยู่ในคิว รันไทม์ต้องรายงานเฉพาะเหตุการณ์เดียวที่มีการเปลี่ยนแปลงขอบเขตล่าสุดที่เกิดขึ้น เนื่องจากแอปสามารถสำรวจขอบเขตของคอนเทนเนอร์เชิงพื้นที่ได้โดยตรงด้วย xrGetSpatialContainerBoundsEXT จำนวนการเปลี่ยนแปลงขอบเขตจากเหตุการณ์จึงอาจแตกต่างจากจำนวนการเปลี่ยนแปลงจากการสำรวจตามเวลาของการเปลี่ยนแปลงขอบเขตที่สร้างขึ้นในรันไทม์ การเรียกใช้ xrPollEvent ของแอป และการเรียกใช้ xrGetSpatialContainerBoundsEXT ของแอป

เมื่อขอบเขตของคอนเทนเนอร์เชิงพื้นที่เปลี่ยนแปลง จุดเริ่มต้นในเครื่องของคอนเทนเนอร์เชิงพื้นที่อาจเปลี่ยนแปลงด้วย ตัวอย่างเช่น หากรันไทม์อนุญาตให้ผู้ใช้ปรับขนาดขอบเขตของคอนเทนเนอร์เชิงพื้นที่โดยการลากขอบด้านใดด้านหนึ่งของคอนเทนเนอร์ ขอบเขตและจุดเริ่มต้นในเครื่องของคอนเทนเนอร์นั้นจะเปลี่ยนไปเมื่อผู้ใช้ลากขอบด้านเดียว ในสถานการณ์เช่นนี้ รันไทม์ต้องเปลี่ยนขอบเขตและจุดเริ่มต้นในเครื่องพร้อมกัน

รันไทม์ต้องตั้งค่า infiniteBounds เป็น XR_TRUE และตั้งค่าความกว้าง ความสูง และความลึกเป็น 0.0 เพื่อแสดงขอบเขตที่ไม่มีที่สิ้นสุด รันไทม์ต้องตั้งค่า infiniteBounds เป็น XR_FALSE และตั้งค่าความกว้าง ความสูง และความลึกเป็นจำนวนบวกที่จำกัดสำหรับขอบเขตที่จำกัด

รันไทม์ต้องตั้งค่า bounds และ infiniteBounds ตามกฎเดียวกันกับ XrSpatialContainerBoundsEXT

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

ทุกครั้งที่รันไทม์ปฏิเสธคำขอเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerBoundsModeRequestDeniedEXT

typedef struct XrEventDataSpatialContainerBoundsModeRequestDeniedEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
} XrEventDataSpatialContainerBoundsModeRequestDeniedEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • spatialContainer คือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อ

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

โครงสร้าง XrSpatialContainerBoundsEXT อธิบายกรอบล้อมรอบของคอนเทนเนอร์เชิงพื้นที่

typedef struct XrSpatialContainerBoundsEXT {
    XrStructureType    type;
    void*              next;
    XrExtent3Df        bounds;
    XrBool32           infiniteBounds;
} XrSpatialContainerBoundsEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • bounds คือความกว้าง ความสูง และความลึกของขอบเขตคอนเทนเนอร์เชิงพื้นที่ ขอบเขตมีหน่วยเป็นเมตร
  • infiniteBounds จะเป็นจริงหากคอนเทนเนอร์มีขอบเขตไม่สิ้นสุด

รันไทม์ต้องตั้งค่า infiniteBounds เป็น XR_TRUE และตั้งค่าความกว้าง ความสูง และความลึกเป็น 0.0 เพื่อแสดงขอบเขตที่ไม่มีที่สิ้นสุด รันไทม์ต้องตั้งค่า infiniteBounds เป็น XR_FALSE และตั้งค่าความกว้าง ความสูง และความลึกเป็นจำนวนบวกที่จำกัดสำหรับขอบเขตที่จำกัด

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

ฟังก์ชัน xrGetSpatialContainerBoundsEXT จะค้นหาขอบเขตปัจจุบันของคอนเทนเนอร์เชิงพื้นที่

XrResult xrGetSpatialContainerBoundsEXT(
    XrSpatialContainerEXT                       spatialContainer,
    const XrSpatialContainerBoundsGetInfoEXT*   getInfo,
    XrSpatialContainerBoundsEXT*                bounds);

คำอธิบายพารามิเตอร์

  • spatialContainer คือ XrSpatialContainerEXT ที่จะค้นหา
  • getInfo คือ XrSpatialContainerBoundsGetInfoEXT ที่มีข้อมูลที่ใช้เพื่อรับสถานะของคอนเทนเนอร์เชิงมิติพื้นที่
  • bounds คือตัวชี้ไปยัง XrSpatialContainerBoundsEXT ซึ่งจะแสดงขอบเขต

แม้ว่าคอนเทนเนอร์เชิงพื้นที่จะมีขอบเขต แต่ก็ต้องไม่มีขอบเขตที่ไม่มีที่สิ้นสุด ในขณะที่คอนเทนเนอร์เชิงพื้นที่เป็นแบบสมจริงก็ต้องมีขอบเขตที่ไม่มีที่สิ้นสุด

รันไทม์อาจเปลี่ยนขอบเขตของคอนเทนเนอร์เชิงพื้นที่เป็นค่าจำกัดที่เป็นบวกได้ทุกเมื่อขณะที่คอนเทนเนอร์เชิงพื้นที่มีขอบเขต การเปลี่ยนแปลงขอบเขตของคอนเทนเนอร์เชิงมิติพื้นที่จะได้รับการสื่อสารผ่าน XrEventDataSpatialContainerBoundsChangedEXT

เมื่อใช้ส่วนขยายนี้ แอปไม่สามารถขอเปลี่ยนแปลงขอบเขตได้ นอกเหนือจากการเปลี่ยนระหว่างโหมดมีขอบเขตและโหมดสมจริงด้วย xrRequestSpatialContainerBoundsModeEXT ส่วนขยายอื่นๆ อาจมีวิธีดังกล่าวในอนาคต

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

  • ต้องเปิดใช้ส่วนขยาย XR_EXT_spatial_container ก่อนเรียกใช้ xrGetSpatialContainerBoundsEXT
  • spatialContainer ต้องเป็นแฮนเดิล XrSpatialContainerEXT ที่ถูกต้อง
  • หาก getInfo ไม่ใช่ NULL getInfo ต้องเป็นพอยเตอร์ไปยังโครงสร้าง XrSpatialContainerBoundsGetInfoEXT ที่ถูกต้อง
  • bounds ต้องเป็นตัวชี้ไปยังโครงสร้าง XrSpatialContainerBoundsEXT

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
  • XR_ERROR_VALIDATION_FAILURE

โครงสร้าง XrSpatialContainerBoundsGetInfoEXT เป็นโครงสร้างอินพุตที่มีไว้เพื่อวัตถุประสงค์ในการขยายในอนาคต

typedef struct XrSpatialContainerBoundsGetInfoEXT {
    XrStructureType    type;
    const void*        next;
} XrSpatialContainerBoundsGetInfoEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้

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

การแจงนับ XrSpatialContainerVolumeClippingEXT จะระบุลักษณะการทำงานของการตัดคลิปวอลุ่มที่แตกต่างกันสำหรับคอนเทนเนอร์เชิงพื้นที่

typedef enum XrSpatialContainerVolumeClippingEXT {
    XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_NONE_EXT = 0,
    XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT = 1,
    XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerVolumeClippingEXT;

คำอธิบาย Enum

XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_NONE_EXT

ไม่มีการครอบตัดเนื้อหาตามปริมาตรขอบเขตของคอนเทนเนอร์เชิงพื้นที่ เนื้อหาอาจแสดงผลนอกขอบเขตของคอนเทนเนอร์เชิงพื้นที่ได้

XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT

เนื้อหาจะถูกตัดให้พอดีกับปริมาตรขอบเขตของคอนเทนเนอร์เชิงพื้นที่อย่างเคร่งครัด

ไม่มีการใช้การแจงนับนี้ในส่วนขยายนี้ ซึ่งกำหนดไว้เพื่ออนุญาตให้ส่วนขยายอื่นๆ ระบุลักษณะการทำงานของการตัดระดับเสียงที่ต้องการได้ ตัวอย่างเช่น แอปอาจต้องการวาดพื้นหลังสำหรับคอนเทนเนอร์เชิงพื้นที่ที่มีขอบเขต คิวบ์แมปแบบตาเดียวเป็นวิธีที่สะดวกในการระบุพื้นหลัง อย่างไรก็ตาม คิวบ์แมปแบบตาเดียวจะอยู่ในตำแหน่งที่ไม่มีที่สิ้นสุดตามแนวคิด ซึ่งอยู่นอกคอนเทนเนอร์

ความสามารถของระบบ

แอปสามารถตรวจสอบความสามารถของระบบได้โดยเชื่อมโยงโครงสร้าง XrSystemSpatialContainerPropertiesEXT กับ XrSystemProperties เมื่อเรียกใช้ xrGetSystemProperties

typedef struct XrSystemSpatialContainerPropertiesEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           maxSpatialContainerCount;
    XrBool32           supportsBounded;
    XrBool32           supportsImmersive;
} XrSystemSpatialContainerPropertiesEXT;

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • maxSpatialContainerCount คือจำนวนคอนเทนเนอร์เชิงพื้นที่สูงสุดที่สร้างได้
  • supportsBounded จะเป็นจริงหากคอนเทนเนอร์เชิงพื้นที่สามารถกำหนดขอบเขตได้
  • supportsImmersive จะเป็นจริงหากคอนเทนเนอร์เชิงพื้นที่ได้รับอนุญาตให้แสดงผลแบบสมจริง

รันไทม์ที่รองรับส่วนขยายนี้ควรรองรับแอปที่สร้างคอนเทนเนอร์เชิงพื้นที่จำนวนมาก โดยจำกัดเฉพาะการจัดสรรหน่วยความจำเท่านั้น รันไทม์อาจมีขีดจำกัดที่แตกต่างกันสำหรับจำนวนคอนเทนเนอร์เชิงพื้นที่ที่แสดงพร้อมกัน ไม่มีวิธีค้นหาจำนวนคอนเทนเนอร์ที่แสดงพร้อมกันในส่วนขยายนี้ เนื่องจากรันไทม์อาจจำกัดแอปแต่ละแอปตามสถานะในแอปที่ทำงานอยู่ทั้งหมด สมมติฐานคืออุปกรณ์ที่มีข้อจำกัดสูงและอุปกรณ์ที่มีข้อจำกัดน้อยจะมีขีดจำกัดที่แตกต่างกันสำหรับจำนวนคอนเทนเนอร์ที่แสดงพร้อมกัน อุปกรณ์ที่มีข้อจำกัดสูงอาจรองรับการแสดงคอนเทนเนอร์เชิงพื้นที่ได้ครั้งละ 1 รายการเท่านั้น และอุปกรณ์ที่มีข้อจำกัดน้อยอาจรองรับการแสดงคอนเทนเนอร์เชิงพื้นที่จำนวนมากพร้อมกัน ทั้งนี้ขึ้นอยู่กับขีดจำกัดการประมวลผลการแสดงผล

รันไทม์ที่รองรับส่วนขยายนี้ต้องรองรับคอนเทนเนอร์เชิงพื้นที่แบบมีขอบเขตหรือคอนเทนเนอร์เชิงพื้นที่แบบสมจริงอย่างน้อย 1 รายการ

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

ฟังก์ชัน xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT จะแสดงผลวิธีการนำเสนอกราฟิกที่ระบบรองรับ

XrResult xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    graphicsPresentationCapacityInput,
    uint32_t*                                   graphicsPresentationCountOutput,
    XrSpatialContainerGraphicsPresentationEXT*  graphicsPresentations);

คำอธิบายพารามิเตอร์

  • instance คือ XrInstance ที่ดึงข้อมูล systemId มา
  • systemId คือ XrSystemId ที่มีการค้นหา
  • graphicsPresentationCapacityInput คือความจุของอาร์เรย์ graphicsPresentations หรือ 0 เพื่อระบุคำขอให้ดึงข้อมูลความจุที่จำเป็น
  • graphicsPresentationCountOutput คือตัวชี้ไปยังจำนวนการนำเสนอกราฟิกที่เขียน หรือตัวชี้ไปยังความจุที่จำเป็นในกรณีที่ graphicsPresentationCapacityInput เป็น 0
  • graphicsPresentations เป็นตัวชี้ไปยังอาร์เรย์ของค่า XrSpatialContainerGraphicsPresentationEXT แต่สามารถเป็นค่า Null ได้หาก graphicsPresentationCapacityInput เป็น 0
  • ดูคำอธิบายโดยละเอียดเกี่ยวกับการดึงข้อมูลขนาด graphicsPresentations ที่จำเป็นได้ที่ส่วนพารามิเตอร์ขนาดบัฟเฟอร์

รันไทม์ต้องแสดงเนื้อหาบัฟเฟอร์ที่เหมือนกันจากการแจงนับนี้เสมอสำหรับ systemId ที่ระบุและตลอดอายุการใช้งานของอินสแตนซ์

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

  • ต้องเปิดใช้ส่วนขยาย XR_EXT_spatial_container ก่อนเรียกใช้ xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT
  • instance ต้องเป็นแฮนเดิล XrInstance ที่ถูกต้อง
  • graphicsPresentationCountOutput ต้องเป็นตัวชี้ไปยังค่า uint32_t
  • หาก graphicsPresentationCapacityInput ไม่ใช่ 0 graphicsPresentations ต้องเป็นพอยน์เตอร์ไปยังอาร์เรย์ของค่า graphicsPresentationCapacityInput XrSpatialContainerGraphicsPresentationEXT

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_SYSTEM_INVALID
  • XR_ERROR_VALIDATION_FAILURE

การเปลี่ยนแปลงสถานะเซสชัน

ระบบจะเปิดใช้การรองรับคอนเทนเนอร์เชิงพื้นที่สำหรับเซสชันโดยเชื่อมโยง XrSessionCreateInfoSpatialContainersEXT เมื่อเรียกใช้ xrCreateSession

typedef struct XrSessionCreateInfoSpatialContainersEXT {
    XrStructureType    type;
    const void*        next;
} XrSessionCreateInfoSpatialContainersEXT;

เมื่อเปิดใช้การรองรับคอนเทนเนอร์เชิงพื้นที่ XrSession จะทำงานต่างออกไป เนื่องจากเมื่อใช้คอนเทนเนอร์เชิงพื้นที่ เซสชันจะไม่แสดงเนื้อหารูปภาพบนจอแสดงผลอีกต่อไป แต่คอนเทนเนอร์เชิงพื้นที่จะเป็นผู้แสดงแทน ดังนั้น เมื่อเปิดใช้ส่วนขยายนี้ เซสชันจะ "ไม่มีส่วนหัว" อย่างมีประสิทธิภาพ แอปสามารถส่งข้อมูลรูปภาพผ่านคอนเทนเนอร์เชิงพื้นที่ได้ ซึ่งต่างจากส่วนขยายแบบ Headless อื่นๆ

การเปิดใช้การรองรับคอนเทนเนอร์เชิงพื้นที่จะเปลี่ยนแปลง OpenXR API หลักด้วยวิธีต่อไปนี้

รันไทม์: ระบบหรืออุปกรณ์สูญหาย

รันไทม์: ระบบหรืออุปกรณ์สูญหาย

xrDestroySession

xrDestroySession

ไม่มีการใช้งาน
(กำลังทำงาน)

ไม่มีการใช้งาน...

xrGetSystem
xrCreateSession

xrGetSystem...

xrCreateInstance

xrCreateIn...

xrDestroySession

xrDestroySession

LOSS_PENDING
(ไม่ทำงาน)

LOSS_PENDING...

xrDestroyInstance

xrDestroyInstance

แอป: เปิด XR อีกครั้ง
หากต้องการ

แอป: ไม่บังคับ...

รูปที่ 19 เครื่องสถานะเซสชันใหม่

  • เซสชันไม่เคยเข้าสู่สถานะ XR_SESSION_STATE_VISIBLE, XR_SESSION_STATE_FOCUSED หรือ XR_SESSION_STATE_EXITING รันไทม์ต้องไม่จัดคิวเหตุการณ์สำหรับสถานะเหล่านี้ สถานะเหล่านี้จะถูกแทนที่ด้วยเหตุการณ์คอนเทนเนอร์เชิงพื้นที่ XrEventDataSpatialContainerVisibleChangedEXT, XrEventDataSpatialContainerInteractableChangedEXT และ XrEventDataSpatialContainerClosedEXT ตามลำดับ
  • นอกจากนี้ เซสชันจะไม่เข้าสู่สถานะ XR_SESSION_STATE_READY , XR_SESSION_STATE_SYNCHRONIZED , XR_SESSION_STATE_STOPPING ด้วย รันไทม์ต้องไม่จัดคิวเหตุการณ์สำหรับสถานะเหล่านี้ ไม่มีการแทนที่สำหรับสถานะเหล่านี้
  • รันไทม์ต้องถือว่าเซสชันกำลังทำงานเมื่ออยู่ในสถานะ XR_SESSION_STATE_IDLE
  • รันไทม์ต้องถือว่าเซสชันเป็นแบบโฟกัสเมื่ออยู่ในสถานะ XR_SESSION_STATE_IDLE และมีคอนเทนเนอร์เชิงพื้นที่อย่างน้อย 1 รายการที่โต้ตอบได้
  • ไม่จำเป็นต้องใช้ฟังก์ชัน xrBeginSession และ xrEndSession อีกต่อไป รันไทม์ต้องแสดงผล XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT เมื่อมีการเรียกใช้ฟังก์ชันเหล่านี้ ส่วนขยายอื่นๆ อาจมีฟังก์ชันเหล่านี้ให้ใช้แทน
  • นอกจากนี้ คุณไม่จำเป็นต้องใช้ฟังก์ชัน xrRequestExitSession อีกต่อไป รันไทม์ต้องแสดงผล XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT เมื่อมีการเรียกใช้ฟังก์ชันนี้ แอปที่ต้องการออกจากเซสชันที่กำลังทำงานอยู่แทนสามารถเรียกใช้ xrRequestSpatialContainerVisibleEXT เพื่อซ่อนคอนเทนเนอร์ และทำลายเซสชันหลังจากที่มองไม่เห็นคอนเทนเนอร์ทั้งหมดแล้ว
  • ส่วนขยายที่จะจัดคิวเหตุการณ์เพิ่มเติมเมื่อเซสชันเริ่มทำงานจะได้รับการเรียกใช้ในตอนนี้ และต้องจัดคิวเหตุการณ์เหล่านั้นหลังจากสร้างเซสชัน ส่วนขยายดังกล่าวจะระบุไว้ด้านล่าง

    เหตุการณ์ของส่วนขยาย

XR_EXT_user_presence

XrEventDataUserPresenceChangedEXT

XR_META_boundary_visibility

XrEventDataBoundaryVisibilityChangedMETA

  • ฟังก์ชัน xrLocateViews ไม่ถูกต้องสำหรับการเรียกใช้เซสชัน รันไทม์ต้องแสดงผล XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT จาก xrLocateViews ส่วนขยายอื่นๆ อาจมีวิธีค้นหามุมมองสำหรับคอนเทนเนอร์เชิงพื้นที่หนึ่งๆ
  • ฟังก์ชัน xrWaitFrame ต้องตั้งค่า XrFrameState :: shouldRender เป็น false เสมอ ส่วนขยายอื่นๆ อาจมีวิธีให้ทราบว่าคอนเทนเนอร์เชิงพื้นที่หนึ่งๆ ควรอัปเดตเลเยอร์องค์ประกอบหรือไม่
  • ฟังก์ชัน xrEndFrame ไม่ใช่วิธีที่ถูกต้องในการส่งเลเยอร์องค์ประกอบ หากแอปตั้งค่า XrFrameEndInfo :: layerCount เป็นค่าที่ไม่ใช่ 0 รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE ส่วนขยายอื่นๆ อาจมีวิธีส่งเลเยอร์องค์ประกอบสำหรับคอนเทนเนอร์เชิงพื้นที่ที่เฉพาะเจาะจง
  • การเข้าสู่สถานะ XR_SESSION_STATE_LOSS_PENDING จะปิดคอนเทนเนอร์เชิงพื้นที่ทั้งหมดด้วย รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerClosedEXT สำหรับคอนเทนเนอร์เชิงพื้นที่ที่ใช้งานอยู่แต่ละรายการก่อนจัดคิวการเปลี่ยนแปลงสถานะเซสชันสำหรับ XR_SESSION_STATE_LOSS_PENDING
  • ฟังก์ชัน xrCreateSession ไม่จำเป็นต้องมีโครงสร้างการเชื่อมโยง Graphics API อีกต่อไป ส่วนขยายอื่นๆ อาจต้องมีการเชื่อมโยงกราฟิก เช่น สำหรับคอนเทนเนอร์เชิงพื้นที่เพื่อแสดงผลโดยใช้ Graphics API

ลักษณะการทำงานข้างต้นแตกต่างจากลักษณะการทำงานใน XR_MND_headless เล็กน้อย รันไทม์ต้องไม่เปิดใช้ลักษณะการทำงานของเซสชันแบบไม่มีส่วนหัวจาก XR_MND_headless เมื่อเปิดใช้การรองรับคอนเทนเนอร์เชิงพื้นที่สำหรับเซสชันนั้น

หมายเหตุ

เมื่อเปิดใช้คอนเทนเนอร์เชิงพื้นที่ เซสชันจะเปลี่ยนสถานะระหว่าง 2 สถานะเท่านั้น ได้แก่ XR_SESSION_STATE_IDLE (กำลังทำงาน) และ XR_SESSION_STATE_LOSS_PENDING (ไม่ได้ทำงาน) ด้วยเหตุนี้ รันไทม์จึงไม่แสดงผล XR_ERROR_SESSION_RUNNING หรือ XR_ERROR_SESSION_NOT_RUNNING อีกต่อไป แต่เมื่อเซสชันไม่ทำงาน รันไทม์จะแสดงผลเป็น XR_ERROR_SESSION_LOST หรือ XR_SESSION_LOSS_PENDING ตามกฎใน OpenXR Core นอกจากนี้ xrBeginSession ซึ่งเป็นฟังก์ชันเดียวที่แสดงผล XR_ERROR_SESSION_RUNNING จะแสดงผล XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT เสมอ

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

รายการ Android Manifest

รันไทม์ที่ใช้ AOSP อาจมีลักษณะการทำงานที่กำหนดเองตามสถานะคอนเทนเนอร์เชิงพื้นที่เริ่มต้นที่เริ่มทำงานก่อนเรียกใช้โค้ดแอป ตัวอย่างเช่น รันไทม์อาจแก้ไขทรัพยากรที่จัดสรรสำหรับกิจกรรม ภาพเคลื่อนไหวเมื่อเปิด หรือการแสดงหน้าจอเริ่มต้น (Splash Screen) พร็อพเพอร์ตี้ต่อไปนี้มีไว้เพื่อวัตถุประสงค์นี้ โดยจะแทนที่แท็ก <category android:name="org.khronos.openxr.intent.category.IMMERSIVE_HMD" /> ซึ่งแอปที่อิงตามคอนเทนเนอร์เชิงพื้นที่ไม่ควรระบุ ยกเว้นเพื่อความเข้ากันได้กับรันไทม์ที่อิงตาม AOSP เวอร์ชันก่อนหน้า

<property android:name="org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_USED_BOUNDS_MODES"
          android:value="list of modes" />

พร็อพเพอร์ตี้นี้จะบอกใบ้รันไทม์เกี่ยวกับโหมดขอบเขตที่กิจกรรมใช้ โดยค่าเริ่มต้น รายการนี้จะเป็นรายการว่างเปล่า ซึ่งหมายความว่าไม่มีคำแนะนำ

สตริงต่อไปนี้ใช้ได้กับแอตทริบิวต์นี้ ค่าหลายค่าจะคั่นด้วย | เช่น "bounded|immersive"

ค่า

คำอธิบาย

"2d_panel"

กิจกรรมจะแสดงโดยใช้เฟรมเวิร์กมุมมอง 2 มิติของ Android

"bounded"

กิจกรรมใช้ XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT

"immersive"

กิจกรรมใช้ XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT

<property android:name="org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE"
          android:value="XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_BOUNDED|
                         XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_IMMERSIVE|
                         XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_UNDEFINED" />

พร็อพเพอร์ตี้นี้จะบอกใบ้รันไทม์ถึง XrSpatialContainerBoundsModeEXT เริ่มต้นของกิจกรรมเมื่อสร้างขึ้นครั้งแรก โดยค่าเริ่มต้นจะเป็นสตริง XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_UNDEFINED ซึ่งหมายความว่าไม่มีคำแนะนำ

รันไทม์ต้องไม่กำหนดให้แอปต้องมีพร็อพเพอร์ตี้เหล่านี้เพื่อให้ทำงานตามข้อกำหนดนี้ รันไทม์ต้องไม่เปลี่ยนแปลงลักษณะการทำงานที่มองเห็นได้ของแอปโดยอิงตามพร็อพเพอร์ตี้เหล่านี้ ข้อมูลเมตาทั้งหมดดังกล่าวต้องระบุได้ที่ระดับ <activity> หรือระดับ <application> หากระบุที่ระดับ <application> จะมีผลกับกิจกรรมทั้งหมดในแอปพลิเคชันที่ไม่ได้ระบุค่าของตนเอง

โค้ดตัวอย่าง

โค้ดต่อไปนี้แสดงวิธีใช้ส่วนขยายนี้สำหรับกรณีการใช้งานที่เน้นการรับรู้เท่านั้นโดยไม่มีการแสดงผล

XrInstance instance;    // Already initialized


// Create the session with spatial containers enabled
XrSession session;

XrSessionCreateInfoSpatialContainersEXT spatialContainerCreateInfo {
  .type = XR_TYPE_SESSION_CREATE_INFO_SPATIAL_CONTAINERS_EXT,
};
XrSessionCreateInfo sessionCreateInfo {
  .type = XR_TYPE_SESSION_CREATE_INFO,
  .next = &spatialContainerCreateInfo,   // Enable spatial containers
};
(void)sessionCreateInfo.systemId;                             // Other create fields set in usual way

CHK_XR(xrCreateSession(instance, &sessionCreateInfo, &session));


// Because spatial containers are enabled, the session is considered
// running. App is able to query perception data such as head poses and hand
// poses.


// Based on app logic or when a system lost event happens, destroy the
// session
CHK_XR(xrDestroySession(session));

ประเภทออบเจ็กต์ใหม่

คำสั่งใหม่

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

Enum ใหม่

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

  • XR_EXT_SPATIAL_CONTAINER_EXTENSION_NAME
  • XR_EXT_spatial_container_SPEC_VERSION
  • การขยาย XrObjectType :

    • XR_OBJECT_TYPE_SPATIAL_CONTAINER_EXT
  • การขยาย XrResult :

    • XR_ERROR_COMPATIBLE_SPATIAL_CONTAINER_MISSING_EXT
    • XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT
    • XR_ERROR_SPATIAL_CONTAINERS_NOT_ENABLED_EXT
    • XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
  • การขยาย XrStructureType :

    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_CHANGED_EXT
    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_DENIED_EXT
    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_CLOSED_EXT
    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_INTERACTABLE_CHANGED_EXT
    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_CHANGED_EXT
    • XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_REQUEST_DENIED_EXT
    • XR_TYPE_SESSION_CREATE_INFO_SPATIAL_CONTAINERS_EXT
    • XR_TYPE_SPATIAL_CONTAINER_BOUNDS_EXT
    • XR_TYPE_SPATIAL_CONTAINER_BOUNDS_GET_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_CREATE_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_SPACE_CREATE_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_STATE_EXT
    • XR_TYPE_SPATIAL_CONTAINER_STATE_GET_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_VISIBLE_REQUEST_INFO_EXT
    • XR_TYPE_SYSTEM_SPATIAL_CONTAINER_PROPERTIES_EXT

ปัญหา

  • เราจะจัดการคำขอที่มองเห็นได้ซึ่งค้างอยู่หลายรายการอย่างไร แอปควรได้รับการเปลี่ยนแปลง/การปฏิเสธกลับมา 1 รายการหรือหลายรายการ คำตอบอาจแตกต่างกันหากการเรียกใช้เกิดขึ้นในหลายเฟรม คำตอบอาจแตกต่างออกไปหากคำขอหลายรายการส่งผลให้ไม่มีการดำเนินการใดๆ เช่น การขอให้คอนเทนเนอร์เชิงพื้นที่ปรากฏขึ้น แล้วไม่ปรากฏสำหรับคอนเทนเนอร์ที่เริ่มต้นด้วยการไม่ปรากฏ

    • แก้ไขแล้ว ตัวเลือกที่แตกต่างกันสำหรับเหตุการณ์การเปลี่ยนแปลงและเหตุการณ์ที่ถูกปฏิเสธ คำขอ Noop จะไม่จัดคิวเหตุการณ์การเปลี่ยนแปลง ซึ่งจะสร้างความรบกวนให้กับนักพัฒนาแอปและรันไทม์จะกรองออกได้ง่าย หากคำขอที่มองเห็นได้หลายรายการถูกปฏิเสธ รันไทม์แต่ละรายการต้องสร้างเหตุการณ์ที่ถูกปฏิเสธที่เกี่ยวข้อง
  • ส่วนขยายการทำงานอัตโนมัติเพื่อความสอดคล้องควรได้รับการกำหนดอย่างไรเพื่อให้ CTS ยังคงทดสอบข้อความข้อมูลจำเพาะที่ไม่บังคับทั้งหมดสำหรับลักษณะการทำงานของนโยบายได้

    • แก้ไขแล้ว ส่วนขยายการทดสอบแยกต่างหาก จะมีการติดตั้งรันไทม์ของส่วนขยายการทดสอบสำหรับ CTS เท่านั้น ซึ่งจะช่วยให้ CTS ควบคุมนโยบายระบบทั้งหมดได้
  • เราจำเป็นต้องมีเหตุการณ์เมื่อตำแหน่งของคอนเทนเนอร์เชิงพื้นที่เปลี่ยนแปลงไหม

    • แก้ไขแล้ว ไม่ พื้นที่คอนเทนเนอร์เชิงพื้นที่ไม่ได้ล็อกโลก และพื้นที่อื่นๆ เช่น XR_REFERENCE_SPACE_TYPE_VIEW จะไม่มีเหตุการณ์เมื่อมีการเปลี่ยนแปลง
  • xrSyncActions ทำงานอย่างไรหากมีคอนเทนเนอร์เชิงพื้นที่หลายรายการ

    • แก้ไขแล้ว ไม่จำเป็นต้องเปลี่ยนแปลง xrSyncActions จะมีผลกับคอนเทนเนอร์เชิงพื้นที่ทั้งหมดในเซสชัน หากแอปต้องการกำหนดทิศทางการดำเนินการอินพุตไปยังคอนเทนเนอร์เชิงพื้นที่ที่เฉพาะเจาะจง แอปสามารถดูสถานะที่โต้ตอบได้ต่อคอนเทนเนอร์เพื่อเลือกคอนเทนเนอร์ที่เป็นเป้าหมายที่ถูกต้อง หากแอปต้องการซิงค์เฉพาะสถานะการดำเนินการอินพุตสำหรับคอนเทนเนอร์เชิงพื้นที่รายการเดียว ก็จะต้องใช้ส่วนขยายเพิ่มเติม อย่างไรก็ตาม เราคาดว่าจะมุ่งเน้นไปที่ส่วนขยายที่ช่วยให้แอปทำงานตามเหตุการณ์ได้อย่างสมบูรณ์ และหลีกเลี่ยงความจำเป็นในการเรียกใช้ xrSyncActions ในลูปเฟรมแทน
  • แอปที่อัปเดตไม่บ่อยนักจะจัดการกับอินพุตอย่างไร

    • แก้ไขแล้ว ไม่ต้องเปลี่ยนแปลง แม้ว่าจะมีประโยชน์สำหรับ EXT_spatial_container แต่ก็มีประโยชน์นอกคอนเทนเนอร์เชิงพื้นที่ด้วย ซึ่งสามารถจัดการได้ผ่านส่วนขยายช่องทางกิจกรรมและใช้ได้ทั้ง 2 กรณี สำหรับคอนเทนเนอร์เชิงพื้นที่ เราจะเพิ่มวิธีอื่นๆ ในการกรองเหตุการณ์สำหรับคอนเทนเนอร์เชิงพื้นที่รายการเดียว
  • เราจำเป็นต้องรอเพื่อควบคุม/จำกัดเวลาของลูปอินพุตสำหรับแอปที่มีลูปอินพุตและการแสดงผลที่แยกกันหรือไม่

    • แก้ไขแล้ว ไม่ต้องเปลี่ยนแปลง ซึ่งคาดว่าจะได้รับการจัดการผ่านช่องทางกิจกรรมและส่วนขยายคำขอปัจจุบัน ส่วนขยายคำขอปัจจุบันช่วยให้การแสดงผลอิงตามเหตุการณ์และแยกออกจากลูปเฟรมได้
  • คอนเทนเนอร์เชิงพื้นที่สามารถรับท่าทางสัมพัทธ์กับคอนเทนเนอร์เชิงพื้นที่อื่นๆ ได้ไหม สิ่งสำคัญที่ควรพิจารณาคือ เรามีกรณีการใช้งานสำหรับเรื่องนี้ไหม และหากเป็นเช่นนั้น พื้นที่คอนเทนเนอร์เชิงพื้นที่จะเชื่อมต่อกับ LOCAL อย่างไร

    • แก้ไขแล้ว ใช่ ซึ่งสามารถทำได้อยู่แล้วสำหรับคอนเทนเนอร์เชิงพื้นที่ภายในเซสชันเดียวกันโดยไปที่ XR_REFERENCE_SPACE_TYPE_VIEW และควรสนับสนุนเนื้อหาที่ขึ้นอยู่กับมุมมอง สำหรับการแชร์ท่าทางของคอนเทนเนอร์เชิงพื้นที่ในเซสชันต่างๆ (เช่น ไปยังกระบวนการอื่น) เส้นทางที่คาดไว้คือการใช้ประโยชน์จาก XR_EXT_spatial_anchor รวมถึงรูปแบบการคงอยู่และการแชร์ที่มีอยู่
  • หากมองไม่เห็นพื้นที่ของคอนเทนเนอร์เชิงพื้นที่ จะสามารถระบุตำแหน่งได้ไหม

    • แก้ไขแล้ว ไม่ คุณจะค้นหาตำแหน่งของพื้นที่ในคอนเทนเนอร์เชิงพื้นที่ไม่ได้เมื่อมองไม่เห็นคอนเทนเนอร์เชิงพื้นที่ ซึ่งหมายความว่าไม่มีเสียงรอบทิศทาง และแอปไม่สามารถ "เตรียม" เนื้อหาที่ขึ้นอยู่กับมุมมองเมื่อมองไม่เห็น spatial_container ทั้ง 2 กรณีนี้ถือว่ายอมรับได้ เนื่องจากเมื่อคอนเทนเนอร์เชิงพื้นที่ไม่ปรากฏ แอปควรหยุดการโหลด CPU/GPU ที่ใช้สำหรับคอนเทนเนอร์เชิงพื้นที่นั้น
  • คาดว่าจะวางพื้นที่คอนเทนเนอร์เชิงพื้นที่ไว้ที่ใดในคอนเทนเนอร์เชิงพื้นที่ คำแนะนำเป็นจุดศูนย์กลางหรือจุดต่ำสุด (minX, minY, minZ)

    • แก้ไขแล้ว ตรงกลาง ไม่มีตำแหน่งใดที่ไม่เคลื่อนไหวในลักษณะที่คาดหวังจาก UX การปรับขนาดคอนเทนเนอร์เชิงพื้นที่ (ขอบที่เคลื่อนไหว) Center มักใช้ในส่วนอื่นๆ ของ OpenXR เราไม่ได้จัดแนวให้สอดคล้องกับหน้าต่างในการประมวลผลแบบ 2 มิติซึ่งใช้พิกัดต่ำสุด เนื่องจากโปรแกรมดูโมเดล 3 มิติมักไม่เป็นไปตามข้อตกลงนี้
  • รันไทม์ควรสร้างทรัพยากรที่อยู่ภายใต้คอนเทนเนอร์เชิงพื้นที่เมื่อใด ซึ่งบางครั้งเกี่ยวข้องกับ IPC ที่มีบริการของระบบ

    • แก้ไขแล้ว พร้อมกันโดยเป็นส่วนหนึ่งของ xrCreateSpatialContainerEXT แม้ว่าอาจมี IPC เข้ามาเกี่ยวข้อง แต่โดยทั่วไปแล้วการสร้างคอนเทนเนอร์จริงนั้นคาดว่าจะมีค่าใช้จ่ายต่ำ ผู้ให้บริการบางรายมี Mutex ทั่วโลกเกี่ยวกับการจัดการคอนเทนเนอร์ แต่โดยทั่วไปแล้วไม่น่าจะต้องรอนาน ปัญหาเกี่ยวกับการแย่งชิง Mutex เป็นข้อบกพร่องเฉพาะของผู้ให้บริการซึ่งคาดว่าผู้ให้บริการแต่ละรายจะแก้ไขได้
  • เราจำเป็นต้องมีสัญญาณว่า XrSession จะสร้างคอนเทนเนอร์เชิงพื้นที่หรือไม่ และด้วยเหตุนี้จึงไม่รองรับเส้นทางการแสดงผลเดิม

    • แก้ไขแล้ว ใช่ เราเปลี่ยนเครื่องจักรสถานะเซสชันในลักษณะพื้นฐาน

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

  • ฉบับแก้ไข 1, 06-08-2026 (Jared Finder, Google)

    • คำอธิบายส่วนขยายเริ่มต้น