XR_ANDROID_light_estimation_cubemap
Строка имени
XR_ANDROID_light_estimation_cubemap
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
722
Пересмотр
1
Статус ратификации
Не ратифицировано
Зависимости расширений и версий
XR_ANDROID_light_estimation
Дата последнего изменения
2025-08-06
Статус IP
Известных претензий на интеллектуальную собственность нет.
Авторы
Салар Хан, Google
Скотт Чанг, Google
Джаред Финдер, Google
Спенсер Куин, Google
Левана Чен, Google
Нихав Джайн, Google
Юрген Штурм, Google
Обзор
Это расширение основано на базовом расширении XR_ANDROID_light_estimation . Оно добавляет поддержку получения оценок освещения на кубических картах, что позволяет получить более подробные данные об освещении в физической среде.
Примечание
Механизм получения данных для оценки освещенности аналогичен базовому расширению, за исключением того, что при создании дескриптора оценки освещенности необходимо добавить цепочку вызовов XrCubemapLightEstimatorCreateInfoANDROID и XrLightEstimatorCreateInfoANDROID .
Проверьте возможности системы.
typedef struct XrSystemCubemapLightEstimationPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsCubemapLightEstimation;
} XrSystemCubemapLightEstimationPropertiesANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
nextравноNULLили указателю на следующую структуру в цепочке структур. В ядре OpenXR и в этом расширении такие структуры не определены. -
supportsCubemapLightEstimation— это тип данныхXrBool32, указывающий, поддерживает ли текущая система оценку освещения кубической карты.
Приложение может проверить, способна ли система поддерживать оценку освещения с помощью кубической карты, расширив структуру XrSystemProperties с помощью XrSystemCubemapLightEstiminationPropertiesANDROID при вызове функции xrGetSystemProperties .
Если среда выполнения возвращает XR_FALSE для supportsCubemapLightEstimation и XrCubemapLightEstimatorCreateInfoANDROID связана с XrLightEstimatorCreateInfoANDROID , среда выполнения должна вернуть XR_ERROR_FEATURE_UNSUPPORTED из xrCreateLightEstimatorANDROID .
Допустимое использование (неявное)
- Расширение
XR_ANDROID_light_estimation_cubemapнеобходимо включить перед использованием XrSystemCubemapLightEstiminationPropertiesANDROID. -
typeдолжен бытьXR_TYPE_SYSTEM_CUBEMAP_LIGHT_ESTIMATION_PROPERTIES_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур.
Получение информации о поддерживаемых разрешениях кубических карт
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, который устанавливается средой выполнения и указывает количество элементов, записанных средой выполнения в массивresolutions. -
resolutions— это массив типовuint32_t, который заполняется средой выполнения поддерживаемыми разрешениями кубических карт.
Разрешение кубической карты указывает ширину и высоту каждой грани кубической карты в пикселях. Идиома 2-вызова. Затем приложение может выбрать одно из поддерживаемых разрешений в XrCubemapLightEstimatorCreateInfoANDROID :: cubemapResolution при создании дескриптора оценки освещения. Приложение должно выделить соответствующий объем памяти для членов буфера изображения XrCubemapLightingDataANDROID в зависимости от выбранного разрешения и формата цвета.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_light_estimation_cubemapнеобходимо включить перед вызовом функции xrEnumerateCubemapLightingResolutionsANDROID. -
instanceдолжен быть допустимым дескриптором XrInstance. -
resolutionCountOutputдолжен быть указателем на значение типаuint32_t - Если
resolutionCapacityInputне равно0,resolutionsдолжно быть указателем на массив значений типаuint32_t, содержащихresolutionCapacityInput.
Коды возврата
-
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
Получение информации о поддерживаемых форматах цветов кубических карт
Перечисление XrCubemapLightingColorFormatANDROID указывает среде выполнения формат цвета освещения кубической карты, который следует использовать.
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;
Перечисления имеют следующие значения:
Описание перечисления
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, устанавливаемый средой выполнения и указывающий количество элементов, записанных средой выполнения в массивcolorFormats. -
colorFormats— это массив объектов XrCubemapLightingColorFormatANDROID , который заполняется средой выполнения поддерживаемыми форматами цветов кубических карт.
Идиома 2-вызова. Затем приложение может выбрать один из поддерживаемых форматов цвета в XrCubemapLightEstimatorCreateInfoANDROID :: colorFormat при создании дескриптора оценки освещенности. Приложение должно выделить соответствующий объем памяти для членов буфера изображения XrCubemapLightingDataANDROID в зависимости от выбранного формата цвета.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_light_estimation_cubemapнеобходимо включить перед вызовом функции xrEnumerateCubemapLightingColorFormatsANDROID. -
instanceдолжен быть допустимым дескриптором XrInstance. -
colorFormatCountOutputдолжен быть указателем на значение типаuint32_t - Если
colorFormatCapacityInputне равен0,colorFormatsдолжен быть указателем на массив значенийcolorFormatCapacityInputXrCubemapLightingColorFormatANDROID.
Коды возврата
-
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
Создайте обработчик оценки освещенности кубической карты.
typedef struct XrCubemapLightEstimatorCreateInfoANDROID {
XrStructureType type;
const void* next;
uint32_t cubemapResolution;
XrCubemapLightingColorFormatANDROID colorFormat;
XrBool32 reproject;
} XrCubemapLightEstimatorCreateInfoANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
cubemapResolution— это тип данныхuint32_t, указывающий разрешение освещения кубической карты, которое следует использовать. -
colorFormat— это объект XrCubemapLightingColorFormatANDROID , указывающий формат цвета данных освещения кубической карты, который следует использовать. -
reprojectимеет типXrBool32и указывает, следует ли перепроецировать освещение кубической карты в базовое пространство приложения.
Структура XrCubemapLightEstimatorCreateInfoANDROID описывает информацию, необходимую для создания дескриптора XrLightEstimatorANDROID , способного предоставлять оценки освещения кубической карты. Член XrCubemapLightEstimatorCreateInfoANDROID :: cubemapResolution должен быть установлен на одно из разрешений, возвращаемых функцией xrEnumerateCubemapLightingResolutionsANDROID . Член XrCubemapLightEstimatorCreateInfoANDROID :: colorFormat должен быть установлен на один из цветовых форматов, возвращаемых функцией xrEnumerateCubemapLightingColorFormatsANDROID . Если приложение не устанавливает разрешение на одно из поддерживаемых разрешений или цветовой формат на один из поддерживаемых цветовых форматов, среда выполнения должна вернуть XR_ERROR_FEATURE_UNSUPPORTED из xrCreateLightEstimatorANDROID .
Допустимое использование (неявное)
- Расширение
XR_ANDROID_light_estimation_cubemapнеобходимо включить перед использованием XrCubemapLightEstimatorCreateInfoANDROID. -
typeдолжен бытьXR_TYPE_CUBEMAP_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
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или указатель на следующую структуру в цепочке структур. Допустимые структуры: XrAmbientLightANDROID , XrSphericalHarmonicsANDROID , XrDirectionalLightANDROID . -
stateобъекта 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или допустимым указателем на следующую структуру в цепочке структур. stateдолжно быть допустимым значением XrLightEstimateStateANDROID.-
imageBufferRightдолжен быть указателем на массив значенийuint8_t, содержащихimageBufferSize. -
imageBufferLeftдолжен быть указателем на массив значенийuint8_t, содержащихimageBufferSize. -
imageBufferTopдолжен быть указателем на массив значенийuint8_t, содержащихimageBufferSize. -
imageBufferBottomдолжен быть указателем на массив значенийuint8_t, содержащихimageBufferSize. -
imageBufferFrontдолжен быть указателем на массив значенийuint8_t, содержащихimageBufferSize. -
imageBufferBackдолжен быть указателем на массив значенийuint8_t, содержащихimageBufferSize. - Параметр
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 :
Новые перечисления
Новые константы перечислений
-
XR_ANDROID_LIGHT_ESTIMATION_CUBEMAP_EXTENSION_NAME -
XR_ANDROID_light_estimation_cubemap_SPEC_VERSION Расширение XrStructureType :
-
XR_TYPE_CUBEMAP_LIGHTING_DATA_ANDROID -
XR_TYPE_CUBEMAP_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID -
XR_TYPE_SYSTEM_CUBEMAP_LIGHT_ESTIMATION_PROPERTIES_ANDROID
-
Проблемы
История версий
Редакция 1, 05.12.2025 (Салар Хан)
- Первоначальное описание расширения