XR_ANDROID_light_estimation_cubemap

Name String

XR_ANDROID_light_estimation_cubemap

Loại tiện ích

Tiện ích phiên bản

Số máy nhánh đã đăng ký

722

Bản sửa đổi

1

Trạng thái phê chuẩn

Chưa được phê chuẩn

Phần mở rộng và các phần phụ thuộc vào phiên bản

XR_ANDROID_light_estimation

Ngày sửa đổi gần đây nhất

2025-08-06

Trạng thái IP

Không có thông báo xác nhận quyền sở hữu nào đã biết về quyền sở hữu trí tuệ.

Cộng tác viên

Salar Khan, Google
Scott Chung, Google
Jared Finder, Google
Spencer Quin, Google
Levana Chen, Google
Nihav Jain, Google
Jürgen Sturm, Google

Tổng quan

Tiện ích này được xây dựng dựa trên tiện ích XR_ANDROID_light_estimation cơ bản. Thư viện này hỗ trợ việc nhận thông tin ước tính về ánh sáng trong cubemap, giúp cung cấp thông tin ước tính chi tiết hơn về ánh sáng trong môi trường thực tế.

Lưu ý

Cơ chế để lấy dữ liệu ước tính ánh sáng cũng giống như cơ chế của tiện ích cơ bản, ngoại trừ việc XrCubemapLightEstimatorCreateInfoANDROID phải được liên kết với XrLightEstimatorCreateInfoANDROID khi tạo trình xử lý ước tính ánh sáng.

Kiểm tra khả năng của hệ thống

typedef struct XrSystemCubemapLightEstimationPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsCubemapLightEstimation;
} XrSystemCubemapLightEstimationPropertiesANDROID;

Nội dung mô tả thành viên

  • typeXrStructureType của cấu trúc này.
  • nextNULL hoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.
  • supportsCubemapLightEstimation là một XrBool32 , cho biết liệu hệ thống hiện tại có hỗ trợ tính năng ước tính ánh sáng cubemap hay không.

Ứng dụng có thể kiểm tra xem hệ thống có hỗ trợ tính năng ước tính ánh sáng của cubemap hay không bằng cách mở rộng XrSystemProperties bằng cấu trúc XrSystemCubemapLightEstimationPropertiesANDROID khi gọi xrGetSystemProperties .

Nếu thời gian chạy trả về XR_FALSE cho supportsCubemapLightEstimationXrCubemapLightEstimatorCreateInfoANDROID đã được liên kết với XrLightEstimatorCreateInfoANDROID , thì thời gian chạy phải trả về XR_ERROR_FEATURE_UNSUPPORTED từ xrCreateLightEstimatorANDROID .

Cách sử dụng hợp lệ (ngầm)

Lấy độ phân giải được hỗ trợ của cubemap

XrResult xrEnumerateCubemapLightingResolutionsANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    resolutionCapacityInput,
    uint32_t*                                   resolutionCountOutput,
    uint32_t*                                   resolutions);

Nội dung mô tả về tham số

  • instance là một XrInstance được tạo trước đó.
  • systemIdXrSystemId được xrGetSystem truy xuất trước đó để lấy độ phân giải cubemap được hỗ trợ.
  • resolutionCapacityInput là một uint32_t cho biết số lượng tối đa các phần tử có thể được lưu trữ trong mảng resolutions.
  • resolutionCountOutput là một con trỏ đến uint32_t do thời gian chạy thiết lập, cho biết số lượng phần tử được thời gian chạy ghi vào mảng resolutions.
  • resolutions là một mảng uint32_t được thời gian chạy điền sẵn bằng các độ phân giải cubemap được hỗ trợ.

Độ phân giải của cubemap cho biết chiều rộng và chiều cao của mỗi mặt trong cubemap tính bằng pixel. Thành ngữ 2 lệnh gọi Sau đó, ứng dụng có thể chọn sử dụng một trong các độ phân giải được hỗ trợ trong XrCubemapLightEstimatorCreateInfoANDROID :: cubemapResolution khi tạo trình xử lý công cụ ước tính ánh sáng. Ứng dụng phải phân bổ lượng bộ nhớ thích hợp cho các thành phần bộ đệm hình ảnh của XrCubemapLightingDataANDROID dựa trên độ phân giải đã chọn và định dạng màu.

Cách sử dụng hợp lệ (ngầm)

  • Bạn phải bật tiện ích XR_ANDROID_light_estimation_cubemap trước khi gọi xrEnumerateCubemapLightingResolutionsANDROID
  • instance phải là một đối tượng XrInstance hợp lệ
  • resolutionCountOutput phải là con trỏ đến giá trị uint32_t
  • Nếu resolutionCapacityInput không phải là 0 , thì resolutions phải là con trỏ đến một mảng gồm các giá trị resolutionCapacityInput uint32_t

Mã trả về

Thành công

  • XR_SUCCESS

Thất bại

  • 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

Lấy các định dạng màu cubemap được hỗ trợ

Liệt kê XrCubemapLightingColorFormatANDROID để xác định thời gian chạy, định dạng màu của ánh sáng cubemap cần sử dụng.

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;

Các enum có ý nghĩa như sau:

Nội dung mô tả enum

XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32_SFLOAT_ANDROID

Định dạng màu có 3 kênh, trong đó mỗi kênh là một giá trị dấu phẩy động 32 bit.

XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32A32_SFLOAT_ANDROID

Định dạng màu có 4 kênh, trong đó mỗi kênh là một giá trị dấu phẩy động 32 bit.

XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R16G16B16A16_SFLOAT_ANDROID

Định dạng màu có 4 kênh, trong đó mỗi kênh là một giá trị dấu phẩy động 16 bit.

XrResult xrEnumerateCubemapLightingColorFormatsANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    colorFormatCapacityInput,
    uint32_t*                                   colorFormatCountOutput,
    XrCubemapLightingColorFormatANDROID*        colorFormats);

Nội dung mô tả về tham số

  • instance là một XrInstance được tạo trước đó.
  • systemIdXrSystemId được xrGetSystem truy xuất trước đó để lấy độ phân giải cubemap được hỗ trợ.
  • colorFormatCapacityInput là một uint32_t cho biết số lượng tối đa các phần tử có thể được lưu trữ trong mảng colorFormats.
  • colorFormatCountOutput là một con trỏ đến uint32_t do thời gian chạy thiết lập, cho biết số lượng phần tử được thời gian chạy ghi vào mảng colorFormats.
  • colorFormats là một mảng XrCubemapLightingColorFormatANDROID do thời gian chạy điền sẵn bằng các định dạng màu cubemap được hỗ trợ.

2-call idiom (Thành ngữ 2 lệnh gọi) Sau đó, ứng dụng có thể chọn sử dụng một trong các định dạng màu được hỗ trợ trong XrCubemapLightEstimatorCreateInfoANDROID :: colorFormat khi tạo trình xử lý bộ ước tính ánh sáng. Ứng dụng phải phân bổ lượng bộ nhớ thích hợp cho các thành phần bộ đệm hình ảnh của XrCubemapLightingDataANDROID dựa trên định dạng màu đã chọn.

Cách sử dụng hợp lệ (ngầm)

  • Bạn phải bật tiện ích XR_ANDROID_light_estimation_cubemap trước khi gọi xrEnumerateCubemapLightingColorFormatsANDROID
  • instance phải là một đối tượng XrInstance hợp lệ
  • colorFormatCountOutput phải là con trỏ đến giá trị uint32_t
  • Nếu colorFormatCapacityInput không phải là 0 , thì colorFormats phải là con trỏ đến một mảng gồm các giá trị colorFormatCapacityInput XrCubemapLightingColorFormatANDROID

Mã trả về

Thành công

  • XR_SUCCESS

Thất bại

  • 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

Tạo một đối tượng ước tính ánh sáng cubemap

typedef struct XrCubemapLightEstimatorCreateInfoANDROID {
    XrStructureType                        type;
    const void*                            next;
    uint32_t                               cubemapResolution;
    XrCubemapLightingColorFormatANDROID    colorFormat;
    XrBool32                               reproject;
} XrCubemapLightEstimatorCreateInfoANDROID;

Nội dung mô tả thành viên

  • typeXrStructureType của cấu trúc này.
  • nextNULL hoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.
  • cubemapResolution là một uint32_t cho biết độ phân giải của ánh sáng cubemap cần sử dụng.
  • colorFormatXrCubemapLightingColorFormatANDROID cho biết định dạng màu của dữ liệu chiếu sáng cubemap cần sử dụng.
  • reproject là một XrBool32 cho biết liệu ánh sáng cubemap có nên được chiếu lại vào không gian cơ sở của ứng dụng hay không.

Cấu trúc XrCubemapLightEstimatorCreateInfoANDROID mô tả thông tin để tạo một đối tượng XrLightEstimatorANDROID có khả năng cung cấp thông tin ước tính về ánh sáng trong cubemap. Bạn phải đặt thành viên cubemapResolution của XrCubemapLightEstimatorCreateInfoANDROID thành một trong các độ phân giải do xrEnumerateCubemapLightingResolutionsANDROID trả về . Bạn phải đặt thành viên colorFormat của XrCubemapLightEstimatorCreateInfoANDROID thành một trong các định dạng màu do xrEnumerateCubemapLightingColorFormatsANDROID trả về . Nếu ứng dụng không đặt độ phân giải thành một trong các độ phân giải được hỗ trợ hoặc định dạng màu thành một trong các định dạng màu được hỗ trợ, thì thời gian chạy phải trả về XR_ERROR_FEATURE_UNSUPPORTED từ xrCreateLightEstimatorANDROID .

Cách sử dụng hợp lệ (ngầm)

Số liệu ước tính về ánh sáng trong bản đồ hình khối

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;

Nội dung mô tả thành viên

  • typeXrStructureType của cấu trúc này.
  • nextNULL hoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Các cấu trúc hợp lệ là XrAmbientLightANDROID , XrSphericalHarmonicsANDROID , XrDirectionalLightANDROID .
  • stateXrLightEstimateStateANDROID, đại diện cho trạng thái của thông tin ước tính về ánh sáng.
  • imageBufferSize là một uint32_t cho biết kích thước byte của mỗi vùng đệm hình ảnh khuôn mặt trong cubemap.
  • imageBufferRight là một vùng đệm uint8_t chứa hình ảnh mặt bên phải của cubemap.
  • imageBufferLeft là một vùng đệm uint8_t chứa hình ảnh khuôn mặt bên trái của cubemap.
  • imageBufferTop là một vùng đệm uint8_t chứa hình ảnh khuôn mặt trên cùng của cubemap.
  • imageBufferBottom là một vùng đệm uint8_t chứa hình ảnh mặt dưới của cubemap.
  • imageBufferFront là một vùng đệm uint8_t chứa hình ảnh mặt trước của cubemap.
  • imageBufferBack là một vùng đệm uint8_t chứa hình ảnh mặt sau của cubemap.
  • rotation là một XrQuaternionf cho biết hướng xoay của cubemap.
  • centerExposureTime là một XrTime cho biết thời gian chụp cubemap.

Cấu trúc này có thể được liên kết với XrLightEstimateANDROID . Thời gian chạy chỉ được điền sẵn cấu trúc này trong xrGetLightEstimateANDROID nếu XrCubemapLightEstimatorCreateInfoANDROID được dùng để tạo trình xử lý ước tính ánh sáng. Ứng dụng phải phân bổ lượng bộ nhớ thích hợp cho các vùng đệm hình ảnh, tuỳ thuộc vào các giá trị được đặt trong XrCubemapLightEstimatorCreateInfoANDROID :: cubemapResolutionXrCubemapLightEstimatorCreateInfoANDROID :: colorFormat khi tạo trình xử lý công cụ ước tính ánh sáng. Ứng dụng phải đặt XrCubemapLightingDataANDROID :: imageBufferSize thành dung lượng của mỗi vùng đệm hình ảnh khuôn mặt tính bằng byte. Nếu ứng dụng không sử dụng tính năng ước tính ánh sáng cubemap hoặc nếu XrCubemapLightingDataANDROID :: imageBufferSize không đủ lớn để thời gian chạy điền vào các vùng đệm hình ảnh, thì thời gian chạy phải đặt XrCubemapLightingDataANDROID :: state thành XR_LIGHT_ESTIMATE_STATE_INVALID_ANDROID .

Nếu ứng dụng đặt XrCubemapLightEstimatorCreateInfoANDROID :: reproject thành XR_TRUE khi tạo trình ước tính ánh sáng, thì thời gian chạy phải đặt XrCubemapLightingDataANDROID :: rotation thành phép xoay nhận dạng và đảm bảo rằng cubemap được xoay nội bộ được chiếu lại lên các mặt của cubemap nhận dạng trong không gian cơ sở của ứng dụng.

Bố cục của cubemap chiếu sáng giống với bố cục cubemap OpenGL, như minh hoạ trong hình ảnh sau

Bố cục cubemap ước tính ánh sáng XR ANDROID

Hình 24. Bố cục bản đồ hình khối.

Cách sử dụng hợp lệ (ngầm)

  • Bạn phải bật tiện ích XR_ANDROID_light_estimation_cubemap trước khi sử dụng XrCubemapLightingDataANDROID
  • type phảiXR_TYPE_CUBEMAP_LIGHTING_DATA_ANDROID
  • next phảiNULL hoặc một con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc
  • state phải là một giá trị XrLightEstimateStateANDROID hợp lệ
  • imageBufferRight phải là con trỏ đến một mảng gồm các giá trị imageBufferSize uint8_t
  • imageBufferLeft phải là con trỏ đến một mảng gồm các giá trị imageBufferSize uint8_t
  • imageBufferTop phải là con trỏ đến một mảng gồm các giá trị imageBufferSize uint8_t
  • imageBufferBottom phải là con trỏ đến một mảng gồm các giá trị imageBufferSize uint8_t
  • imageBufferFront phải là con trỏ đến một mảng gồm các giá trị imageBufferSize uint8_t
  • imageBufferBack phải là con trỏ đến một mảng gồm các giá trị imageBufferSize uint8_t
  • Tham số imageBufferSize phải lớn hơn 0

Mã ví dụ để ước tính ánh sáng

Đoạn mã ví dụ sau đây minh hoạ cách lấy tất cả các số lượng ước tính ánh sáng có thể có từ thời gian chạy

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));

Lệnh mới

Cấu trúc mới

Enum mới

Hằng số Enum mới

  • XR_ANDROID_LIGHT_ESTIMATION_CUBEMAP_EXTENSION_NAME
  • XR_ANDROID_light_estimation_cubemap_SPEC_VERSION
  • Mở rộng XrStructureType :

    • XR_TYPE_CUBEMAP_LIGHTING_DATA_ANDROID
    • XR_TYPE_CUBEMAP_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID
    • XR_TYPE_SYSTEM_CUBEMAP_LIGHT_ESTIMATION_PROPERTIES_ANDROID

Vấn đề

Nhật ký phiên bản

  • Bản sửa đổi 1, ngày 5 tháng 12 năm 2025 (Salar Khan)

    • Nội dung mô tả ban đầu của tiện ích