XR_ANDROID_light_estimation_cubemap
Name String
XR_ANDROID_light_estimation_cubemap
ประเภทส่วนขยาย
ส่วนขยายอินสแตนซ์
หมายเลขต่อที่ลงทะเบียน
722
การแก้ไข
1
สถานะการให้สัตยาบัน
ยังไม่ให้สัตยาบัน
การขึ้นต่อกันของส่วนขยายและเวอร์ชัน
XR_ANDROID_light_estimation
วันที่แก้ไขล่าสุด
2025-08-06
สถานะ IP
ไม่มีการอ้างสิทธิ์ใน IP ที่ทราบ
ผู้เขียน
Salar Khan, Google
Scott Chung, Google
Jared Finder, Google
Spencer Quin, Google
Levana Chen, Google
Nihav Jain, Google
Jürgen Sturm, Google
ภาพรวม
ส่วนขยายนี้สร้างขึ้นจากส่วนขยาย XR_ANDROID_light_estimation พื้นฐาน โดยจะเพิ่มการรองรับการรับค่าประมาณการจัดแสงแบบคิวบ์แมป ซึ่งให้ค่าประมาณที่ละเอียดยิ่งขึ้นเกี่ยวกับการจัดแสงในสภาพแวดล้อมจริง
หมายเหตุ
กลไกในการรับข้อมูลการประมาณแสงจะเหมือนกับส่วนขยายพื้นฐาน ยกเว้นว่าต้องเชื่อมโยง XrCubemapLightEstimatorCreateInfoANDROID กับ XrLightEstimatorCreateInfoANDROID เมื่อสร้างแฮนเดิลเครื่องมือประมาณแสง
ตรวจสอบความสามารถของระบบ
typedef struct XrSystemCubemapLightEstimationPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsCubemapLightEstimation;
} XrSystemCubemapLightEstimationPropertiesANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้supportsCubemapLightEstimationคือXrBool32ซึ่งระบุว่าระบบปัจจุบันรองรับการประมาณค่าแสงแบบคิวบ์แมปหรือไม่
แอปพลิเคชันสามารถตรวจสอบได้ว่าระบบรองรับการประมาณแสงแบบคิวบ์แมปหรือไม่โดยขยาย XrSystemProperties ด้วยโครงสร้าง XrSystemCubemapLightEstimationPropertiesANDROID เมื่อเรียกใช้ xrGetSystemProperties
หากรันไทม์แสดงผล XR_FALSE สำหรับ supportsCubemapLightEstimation และมีการเชื่อมโยง XrCubemapLightEstimatorCreateInfoANDROID กับ XrLightEstimatorCreateInfoANDROID รันไทม์ต้องแสดงผล XR_ERROR_FEATURE_UNSUPPORTED จาก xrCreateLightEstimatorANDROID
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้
XR_ANDROID_light_estimation_cubemapส่วนขยายก่อนที่จะใช้ XrSystemCubemapLightEstimationPropertiesANDROID -
typeต้องเป็นXR_TYPE_SYSTEM_CUBEMAP_LIGHT_ESTIMATION_PROPERTIES_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง
การรับความละเอียดของคิวบ์แมปที่รองรับ
XrResult xrEnumerateCubemapLightingResolutionsANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t resolutionCapacityInput,
uint32_t* resolutionCountOutput,
uint32_t* resolutions);
คำอธิบายพารามิเตอร์
instanceคือ XrInstance ที่สร้างไว้ก่อนหน้านี้systemIdคือXrSystemIdที่ xrGetSystem ดึงข้อมูลมาก่อนหน้านี้เพื่อรับความละเอียดของคิวบ์แมปที่รองรับresolutionCapacityInputคือuint32_tที่ระบุจำนวนองค์ประกอบสูงสุดที่จัดเก็บในอาร์เรย์resolutionsได้resolutionCountOutputคือตัวชี้ไปยังuint32_tซึ่งรันไทม์ตั้งค่าไว้เพื่อระบุจำนวนองค์ประกอบที่รันไทม์เขียนลงในอาร์เรย์resolutionsresolutionsคืออาร์เรย์ของuint32_tซึ่งรันไทม์จะสร้างขึ้นด้วยความละเอียดของคิวบ์แมปที่รองรับ
ความละเอียดของคิวบ์แมปจะระบุความกว้างและความสูงของแต่ละด้านของคิวบ์แมปเป็นพิกเซล สำนวนการเรียกใช้ 2 ครั้ง จากนั้นแอปพลิเคชันสามารถเลือกใช้ความละเอียดที่รองรับอย่างใดอย่างหนึ่งใน XrCubemapLightEstimatorCreateInfoANDROID :: cubemapResolution เมื่อสร้างแฮนเดิลเครื่องมือประมาณค่าแสง แอปพลิเคชันต้องจัดสรรหน่วยความจำในปริมาณที่เหมาะสมสำหรับสมาชิกบัฟเฟอร์รูปภาพของ XrCubemapLightingDataANDROID ตามความละเอียดที่เลือกและรูปแบบสี
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้
XR_ANDROID_light_estimation_cubemapส่วนขยายก่อนเรียกใช้ xrEnumerateCubemapLightingResolutionsANDROID -
instanceต้องเป็นแฮนเดิล XrInstance ที่ถูกต้อง -
resolutionCountOutputต้องเป็น Pointer ไปยังค่าuint32_t - หาก
resolutionCapacityInputไม่ใช่0resolutionsต้องเป็น Pointer ไปยัง อาร์เรย์ ของค่าresolutionCapacityInputuint32_t
รหัสการคืนสินค้า
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
รับรูปแบบสีของคิวบ์แมปที่รองรับ
การแจงนับ XrCubemapLightingColorFormatANDROID จะระบุรูปแบบสีของแสง Cubemap ที่จะใช้กับรันไทม์
typedef enum XrCubemapLightingColorFormatANDROID {
XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32_SFLOAT_ANDROID = 1,
XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32A32_SFLOAT_ANDROID = 2,
XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R16G16B16A16_SFLOAT_ANDROID = 3,
XR_CUBEMAP_LIGHTING_COLOR_FORMAT_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrCubemapLightingColorFormatANDROID;
โดย Enum มีความหมายดังนี้
คำอธิบาย Enum
XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32_SFLOAT_ANDROID
รูปแบบสีที่มี 3 แชแนล โดยแต่ละแชแนลเป็นค่าทศนิยมแบบลอยตัว 32 บิต
XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32A32_SFLOAT_ANDROID
รูปแบบสีที่มี 4 แชแนล โดยแต่ละแชแนลเป็นค่าทศนิยมแบบ 32 บิต
XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R16G16B16A16_SFLOAT_ANDROID
รูปแบบสีที่มี 4 แชแนล โดยแต่ละแชแนลเป็นค่าทศนิยมแบบ 16 บิต
XrResult xrEnumerateCubemapLightingColorFormatsANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t colorFormatCapacityInput,
uint32_t* colorFormatCountOutput,
XrCubemapLightingColorFormatANDROID* colorFormats);
คำอธิบายพารามิเตอร์
instanceคือ XrInstance ที่สร้างไว้ก่อนหน้านี้systemIdคือXrSystemIdที่ xrGetSystem ดึงข้อมูลมาก่อนหน้านี้เพื่อรับความละเอียดของคิวบ์แมปที่รองรับcolorFormatCapacityInputคือuint32_tที่ระบุจำนวนองค์ประกอบสูงสุดที่จัดเก็บในอาร์เรย์colorFormatsได้colorFormatCountOutputคือตัวชี้ไปยังuint32_tซึ่งรันไทม์ตั้งค่าไว้เพื่อระบุจำนวนองค์ประกอบที่รันไทม์เขียนลงในอาร์เรย์colorFormatscolorFormatsคืออาร์เรย์ของ XrCubemapLightingColorFormatANDROID ซึ่งรันไทม์จะป้อนข้อมูลด้วยรูปแบบสีคิวบ์แมปที่รองรับ
สำนวน 2 การเรียก จากนั้นแอปพลิเคชันสามารถเลือกใช้รูปแบบสีที่รองรับรูปแบบใดรูปแบบหนึ่งใน XrCubemapLightEstimatorCreateInfoANDROID :: colorFormat เมื่อสร้างแฮนเดิลเครื่องมือประมาณแสง แอปพลิเคชันต้องจัดสรรหน่วยความจำในปริมาณที่เหมาะสมสำหรับสมาชิกบัฟเฟอร์รูปภาพของ XrCubemapLightingDataANDROID ตามรูปแบบสีที่เลือก
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้
XR_ANDROID_light_estimation_cubemapส่วนขยายก่อนเรียกใช้ xrEnumerateCubemapLightingColorFormatsANDROID -
instanceต้องเป็นแฮนเดิล XrInstance ที่ถูกต้อง -
colorFormatCountOutputต้องเป็น Pointer ไปยังค่าuint32_t - หาก
colorFormatCapacityInputไม่ใช่0colorFormatsต้องเป็น Pointer ไปยัง อาร์เรย์ ของค่าcolorFormatCapacityInputXrCubemapLightingColorFormatANDROID
รหัสการคืนสินค้า
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
สร้างแฮนเดิลเครื่องมือประมาณค่าแสง Cubemap
typedef struct XrCubemapLightEstimatorCreateInfoANDROID {
XrStructureType type;
const void* next;
uint32_t cubemapResolution;
XrCubemapLightingColorFormatANDROID colorFormat;
XrBool32 reproject;
} XrCubemapLightEstimatorCreateInfoANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างcubemapResolutionคือuint32_tที่ระบุความละเอียดของการจัดแสงคิวบ์แมปที่จะใช้colorFormatคือ XrCubemapLightingColorFormatANDROID ที่ระบุรูปแบบสีของข้อมูลแสง Cubemap ที่จะใช้reprojectคือXrBool32ที่ระบุว่าควรฉายภาพการจัดแสงแบบคิวบ์แมปไปยังพื้นที่ฐานของแอปพลิเคชันอีกครั้งหรือไม่
โครงสร้าง XrCubemapLightEstimatorCreateInfoANDROID อธิบายข้อมูลในการสร้างแฮนเดิล XrLightEstimatorANDROID ที่สามารถให้ค่าประมาณแสงของคิวบ์แมปได้ ต้องตั้งค่าสมาชิก XrCubemapLightEstimatorCreateInfoANDROID :: cubemapResolution เป็นความละเอียดใดความละเอียดหนึ่งที่ xrEnumerateCubemapLightingResolutionsANDROID แสดงผล ต้องตั้งค่าสมาชิก colorFormat ของ XrCubemapLightEstimatorCreateInfoANDROID :: เป็นรูปแบบสีอย่างใดอย่างหนึ่งที่ xrEnumerateCubemapLightingColorFormatsANDROID ส่งคืน หากแอปพลิเคชันไม่ได้ตั้งค่าความละเอียดเป็นความละเอียดที่รองรับอย่างใดอย่างหนึ่ง หรือไม่ได้ตั้งค่ารูปแบบสีเป็นรูปแบบสีที่รองรับอย่างใดอย่างหนึ่ง รันไทม์ต้องส่งคืน XR_ERROR_FEATURE_UNSUPPORTED จาก xrCreateLightEstimatorANDROID
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้ส่วนขยาย
XR_ANDROID_light_estimation_cubemapก่อนจึงจะใช้ XrCubemapLightEstimatorCreateInfoANDROID ได้ -
typeต้องเป็นXR_TYPE_CUBEMAP_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
colorFormatต้องเป็นค่า XrCubemapLightingColorFormatANDROID ที่ถูกต้อง
ค่าประมาณแสงคิวบ์แมป
typedef struct XrCubemapLightingDataANDROID {
XrStructureType type;
void* next;
XrLightEstimateStateANDROID state;
uint32_t imageBufferSize;
uint8_t* imageBufferRight;
uint8_t* imageBufferLeft;
uint8_t* imageBufferTop;
uint8_t* imageBufferBottom;
uint8_t* imageBufferFront;
uint8_t* imageBufferBack;
XrQuaternionf rotation;
XrTime centerExposureTime;
} XrCubemapLightingDataANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง โครงสร้างที่ถูกต้องคือ XrAmbientLightANDROID , XrSphericalHarmonicsANDROID , XrDirectionalLightANDROIDstateคือ XrLightEstimateStateANDROID ที่แสดงสถานะของการประมาณแสงimageBufferSizeคือuint32_tที่ระบุขนาดไบต์ของบัฟเฟอร์รูปภาพแต่ละด้านในคิวบ์แมปimageBufferRightคือบัฟเฟอร์uint8_tที่มีรูปภาพด้านขวาของคิวบ์แมปimageBufferLeftคือuint8_tบัฟเฟอร์ที่มีรูปภาพหน้าด้านซ้ายของคิวบ์แมปimageBufferTopคือบัฟเฟอร์uint8_tที่มีรูปภาพด้านบนของคิวบ์แมปimageBufferBottomคือuint8_tบัฟเฟอร์ที่มีรูปภาพด้านล่างของคิวบ์แมปimageBufferFrontคือบัฟเฟอร์uint8_tที่มีรูปภาพด้านหน้าของคิวบ์แมปimageBufferBackคือบัฟเฟอร์uint8_tที่มีรูปภาพด้านหลังของคิวบ์แมปrotationคือ XrQuaternionf ที่ระบุการหมุนของคิวบ์แมปcenterExposureTimeคือXrTimeที่ระบุเวลาที่บันทึกคิวบ์แมป
โครงสร้างนี้สามารถเชื่อมโยงกับ XrLightEstimateANDROID ได้ รันไทม์ต้องป้อนข้อมูลโครงสร้างนี้ใน xrGetLightEstimateANDROID เท่านั้น หากใช้ XrCubemapLightEstimatorCreateInfoANDROID เพื่อสร้างแฮนเดิลเครื่องมือประมาณแสง แอปพลิเคชันต้องจัดสรรหน่วยความจำในปริมาณที่เหมาะสมสำหรับบัฟเฟอร์รูปภาพซึ่งขึ้นอยู่กับค่าที่ตั้งไว้ใน XrCubemapLightEstimatorCreateInfoANDROID :: cubemapResolution และ XrCubemapLightEstimatorCreateInfoANDROID :: colorFormat เมื่อสร้างแฮนเดิลเครื่องมือประมาณแสง แอปพลิเคชันต้องตั้งค่า XrCubemapLightingDataANDROID :: imageBufferSize เป็นความจุของบัฟเฟอร์รูปภาพแต่ละด้านเป็นไบต์ หากแอปพลิเคชันไม่ได้ใช้การประมาณแสงแบบคิวบ์แมป หรือหาก XrCubemapLightingDataANDROID :: imageBufferSize มีขนาดไม่เพียงพอให้รันไทม์สร้างบัฟเฟอร์รูปภาพ รันไทม์ต้องตั้งค่า XrCubemapLightingDataANDROID :: state เป็น XR_LIGHT_ESTIMATE_STATE_INVALID_ANDROID
หากแอปพลิเคชันตั้งค่า XrCubemapLightEstimatorCreateInfoANDROID :: reproject เป็น XR_TRUE เมื่อสร้างแฮนเดิลเครื่องมือประมาณค่าแสง รันไทม์ต้องตั้งค่า XrCubemapLightingDataANDROID :: rotation เป็นการหมุนเวียนของข้อมูลประจำตัว และตรวจสอบว่ามีการฉายภาพลูกบาศก์แผนที่ที่หมุนภายในไปยังด้านต่างๆ ของลูกบาศก์แผนที่ข้อมูลประจำตัวในพื้นที่ฐานของแอปพลิเคชันอีกครั้ง
เลย์เอาต์ของคิวบ์แมปแสงจะเหมือนกับเลย์เอาต์คิวบ์แมป OpenGL ดังที่แสดงในรูปภาพต่อไปนี้
รูปที่ 24 เลย์เอาต์คิวบ์แมป
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_light_estimation_cubemapก่อนใช้ XrCubemapLightingDataANDROID -
typeต้องเป็นXR_TYPE_CUBEMAP_LIGHTING_DATA_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
stateต้องเป็นค่า XrLightEstimateStateANDROID ที่ถูกต้อง -
imageBufferRightต้องเป็น Pointer ไปยังอาร์เรย์ของค่าimageBufferSizeuint8_t -
imageBufferLeftต้องเป็น Pointer ไปยังอาร์เรย์ของค่าimageBufferSizeuint8_t -
imageBufferTopต้องเป็น Pointer ไปยังอาร์เรย์ของค่าimageBufferSizeuint8_t -
imageBufferBottomต้องเป็น Pointer ไปยังอาร์เรย์ของค่าimageBufferSizeuint8_t -
imageBufferFrontต้องเป็น Pointer ไปยังอาร์เรย์ของค่าimageBufferSizeuint8_t -
imageBufferBackต้องเป็น Pointer ไปยังอาร์เรย์ของค่าimageBufferSizeuint8_t - พารามิเตอร์
imageBufferSizeต้องมากกว่า0
ตัวอย่างโค้ดสำหรับการประมาณค่าแสง
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีรับปริมาณการประมาณแสงที่เป็นไปได้ทั้งหมดจากรันไทม์
XrSession session; // Created at app startup
XrInstance instance; // Created at app startup
XrSpace appSpace; // Created previously.
XrSystemId systemId; // Retrieved previously by xrGetSystem
PFN_xrCreateLightEstimatorANDROID xrCreateLightEstimatorANDROID; // Created previously.
PFN_xrDestroyLightEstimatorANDROID xrDestroyLightEstimatorANDROID; // Created previously.
PFN_xrGetLightEstimateANDROID xrGetLightEstimateANDROID; // Created previously.
PFN_xrEnumerateCubemapLightingResolutionsANDROID xrEnumerateCubemapLightingResolutionsANDROID; // Created previously.
PFN_xrEnumerateCubemapLightingColorFormatsANDROID xrEnumerateCubemapLightingColorFormatsANDROID; // Created previously.
XrSystemCubemapLightEstimationPropertiesANDROID props = {
.type = XR_TYPE_SYSTEM_CUBEMAP_LIGHT_ESTIMATION_PROPERTIES_ANDROID};
XrSystemProperties base = {.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &props};
CHK_XR(xrGetSystemProperties(instance, systemId, &base));
if (!props.supportsCubemapLightEstimation) {
// Cubemap light estimation is not supported
}
uint32_t cubemapResolution = 0;
std::vector<uint32_t> supportedCubemapResolutions;
uint32_t resolutionCount;
CHK_XR(xrEnumerateCubemapLightingResolutionsANDROID(
instance, systemId, 0, &resolutionCount, nullptr));
supportedCubemapResolutions.resize(resolutionCount);
if (resolutionCount == 0) {
// No cubemap lighting supported
} else {
CHK_XR(xrEnumerateCubemapLightingResolutionsANDROID(
instance, systemId, 0, &resolutionCount, supportedCubemapResolutions.data()));
cubemapResolution = supportedCubemapResolutions[0];
}
uint32_t pixelCount = cubemapResolution * cubemapResolution;
XrCubemapLightingColorFormatANDROID colorFormat;
std::vector<XrCubemapLightingColorFormatANDROID> supportedColorFormats;
uint32_t colorFormatCount;
CHK_XR(xrEnumerateCubemapLightingColorFormatsANDROID(
instance, systemId, 0, &colorFormatCount, nullptr));
supportedColorFormats.resize(colorFormatCount);
if (colorFormatCount == 0) {
// No supported color formats for cubemap lighting. Cannot use cubemap
// light estimation.
} else {
CHK_XR(xrEnumerateCubemapLightingColorFormatsANDROID(
instance, systemId, 0, &colorFormatCount, supportedColorFormats.data()));
colorFormat = supportedColorFormats[0];
}
uint32_t pixelSize = 0;
switch (colorFormat) {
case XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32_SFLOAT_ANDROID:
pixelSize = 3 * sizeof(float);
break;
case XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32A32_SFLOAT_ANDROID:
pixelSize = 4 * sizeof(float);
break;
case XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R16G16B16A16_SFLOAT_ANDROID:
pixelSize = 4 * sizeof(uint16_t);
break;
default:
// Should not happen since the color format was validated previously.
break;
}
uint32_t perFaceImageBufferSize = pixelCount * pixelSize;
XrLightEstimatorANDROID estimator;
XrCubemapLightEstimatorCreateInfoANDROID cubemapCreateInfo = {
.type = XR_TYPE_CUBEMAP_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID,
.cubemapResolution = cubemapResolution,
.colorFormat = colorFormat,
.reproject = XR_TRUE
};
XrLightEstimatorCreateInfoANDROID basicCreateInfo = {
.type = XR_TYPE_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID,
.next = &cubemapCreateInfo};
CHK_XR(xrCreateLightEstimatorANDROID(session, &basicCreateInfo, &estimator));
std::vector<uint8_t> cubemapBuffer(perFaceImageBufferSize * 6); // 6 faces * perFaceImageBufferSize
// Every frame
XrTime updateTime; // Time used for the current frame's simulation update.
XrLightEstimateGetInfoANDROID info = {
.type = XR_TYPE_LIGHT_ESTIMATE_GET_INFO_ANDROID,
.space = appSpace,
.time = updateTime,
};
XrCubemapLightingDataANDROID cubemap = {
.type = XR_TYPE_CUBEMAP_LIGHTING_DATA_ANDROID,
.next = nullptr,
.imageBufferSize = perFaceImageBufferSize,
.imageBufferRight = cubemapBuffer.data() + 0 * perFaceImageBufferSize,
.imageBufferLeft = cubemapBuffer.data() + 1 * perFaceImageBufferSize,
.imageBufferTop = cubemapBuffer.data() + 2 * perFaceImageBufferSize,
.imageBufferBottom = cubemapBuffer.data() + 3 * perFaceImageBufferSize,
.imageBufferFront = cubemapBuffer.data() + 4 * perFaceImageBufferSize,
.imageBufferBack = cubemapBuffer.data() + 5 * perFaceImageBufferSize,
};
XrDirectionalLightANDROID directionalLight = {
.type = XR_TYPE_DIRECTIONAL_LIGHT_ANDROID,
.next = &cubemap,
};
XrSphericalHarmonicsANDROID totalSh = {
.type = XR_TYPE_SPHERICAL_HARMONICS_ANDROID,
.next = &directionalLight,
.kind = XR_SPHERICAL_HARMONICS_KIND_TOTAL_ANDROID,
};
XrSphericalHarmonicsANDROID ambientSh = {
.type = XR_TYPE_SPHERICAL_HARMONICS_ANDROID,
.next = &totalSh,
.kind = XR_SPHERICAL_HARMONICS_KIND_AMBIENT_ANDROID,
};
XrAmbientLightANDROID ambientLight = {
.type = XR_TYPE_AMBIENT_LIGHT_ANDROID,
.next = &ambientSh,
};
XrLightEstimateANDROID estimate = {
.type = XR_TYPE_LIGHT_ESTIMATE_ANDROID,
.next = &ambientLight,
};
XrResult result = xrGetLightEstimateANDROID(estimator, &info, &estimate);
if (result == XR_SUCCESS &&
estimate.state == XR_LIGHT_ESTIMATE_STATE_VALID_ANDROID) {
// use cubemap, directionalLight, totalSh, ambientSh, and
// ambientLight if each struct has a valid state field
if (cubemap.state == XR_LIGHT_ESTIMATE_STATE_VALID_ANDROID) {
// use cubemap
if (cubemapCreateInfo.reproject == XR_TRUE) {
XrQuaternionf identityQuaternion = {0.0f, 0.0f, 0.0f, 1.0f};
assert(memcmp(&cubemap.rotation, &identityQuaternion, sizeof(XrQuaternionf)) == 0);
}
}
}
// When you want to disable light estimation
CHK_XR(xrDestroyLightEstimatorANDROID(estimator));
คำสั่งใหม่
โครงสร้างใหม่
การขยาย XrLightEstimateANDROID :
การขยาย XrLightEstimatorCreateInfoANDROID :
การขยาย XrSystemProperties :
Enum ใหม่
ค่าคงที่ Enum ใหม่
XR_ANDROID_LIGHT_ESTIMATION_CUBEMAP_EXTENSION_NAMEXR_ANDROID_light_estimation_cubemap_SPEC_VERSIONการขยาย XrStructureType :
XR_TYPE_CUBEMAP_LIGHTING_DATA_ANDROIDXR_TYPE_CUBEMAP_LIGHT_ESTIMATOR_CREATE_INFO_ANDROIDXR_TYPE_SYSTEM_CUBEMAP_LIGHT_ESTIMATION_PROPERTIES_ANDROID
ปัญหา
ประวัติเวอร์ชัน
การแก้ไข 1, 05-12-2025 (Salar Khan)
- คำอธิบายส่วนขยายเริ่มต้น