Vật thể ảo chiếu sáng thực tế trong cảnh

Tìm hiểu cách sử dụng công cụ Dự kiến ánh sáng trong ứng dụng của chính bạn.

Điều kiện tiên quyết

Đảm bảo rằng bạn hiểu rõ các khái niệm cơ bản về AR và cách định cấu hình phiên ARCore trước khi tiếp tục.

Định cấu hình API một lần cho mỗi phiên bằng chế độ phù hợp

Thiết lập tính năng Ước tính ánh sáng một lần cho mỗi phiên cho chế độ bạn muốn sử dụng.

HDR môi trường

// Configure the session's lighting estimation mode for
// AR_LIGHT_ESTIMATION_MODE_ENVIRONMENTAL_HDR.
ArConfig* config = NULL;
ArConfig_create(session, &config);
ArSession_getConfig(session, config);
ArConfig_setLightEstimationMode(session, config,
                                AR_LIGHT_ESTIMATION_MODE_ENVIRONMENTAL_HDR);
ArSession_configure(session, config);
ArConfig_destroy(config);

Cường độ môi trường xung quanh

// Configure the session's lighting estimation mode for
// AR_LIGHT_ESTIMATION_MODE_AMBIENT_INTENSITY.
ArConfig* config = NULL;
ArConfig_create(session, &config);
ArSession_getConfig(session, config);
ArConfig_setLightEstimationMode(session, config,
                                AR_LIGHT_ESTIMATION_MODE_AMBIENT_INTENSITY);
ArSession_configure(session, config);
ArConfig_destroy(config);

Đã tắt

// Disable the session's lighting estimation mode.
ArConfig* config = NULL;
ArConfig_create(session, &config);
ArSession_getConfig(session, config);
ArConfig_setLightEstimationMode(session, config,
                                AR_LIGHT_ESTIMATION_MODE_DISABLED);
ArSession_configure(session, config);
ArConfig_destroy(config);

Sử dụng các giá trị thu được trong Dữ liệu ước tính về độ sáng

Để sử dụng các giá trị thu được từ công cụ Ước tính ánh sáng, hãy lấy thông tin ước tính về ánh sáng cho từng khung hình.

// Get the current frame.
ArFrame* ar_frame = NULL;
if (ArSession_update(session, ar_frame) != AR_SUCCESS) {
  LOGE("ArSession_update error");
  return;
}

// Get the light estimate for the current frame.
ArLightEstimate* ar_light_estimate = NULL;
ArLightEstimate_create(session, &ar_light_estimate);
ArFrame_getLightEstimate(session, ar_frame, ar_light_estimate);

ArLightEstimateState ar_light_estimate_state;
ArLightEstimate_getState(session, ar_light_estimate,
                         &ar_light_estimate_state);

// Check that the light estimate is valid before proceeding.
if (ar_light_estimate_state != AR_LIGHT_ESTIMATE_STATE_VALID) {
  LOGE("ArLightEstimateState is not valid.");
  ArLightEstimate_destroy(ar_light_estimate);
  return;
}

Sau đó, tải các thành phần ánh sáng HDR môi trường cho cấu hình hiện tại:

HDR môi trường

// Get intensity and direction of the main directional light from the current
// light estimate.
float direction[3];
ArLightEstimate_getEnvironmentalHdrMainLightDirection(
    session, ar_light_estimate, direction);

float intensity[3];
ArLightEstimate_getEnvironmentalHdrMainLightIntensity(
    session, ar_light_estimate, intensity);

// Get ambient lighting as spherical harmonics coefficients.
float ambient_spherical_harmonics[27];
ArLightEstimate_getEnvironmentalHdrAmbientSphericalHarmonics(
    session, ar_light_estimate, ambient_spherical_harmonics);

// Get HDR environmental lighting as a cubemap in linear color space.
ArImageCubemap cubemap_textures;
ArLightEstimate_acquireEnvironmentalHdrCubemap(session, ar_light_estimate,
                                               cubemap_textures);
int width = -1;
int height = -1;
int32_t format = -1;
for (int i = 0; i < 6; ++i) {
  ArImage* image_ptr = cubemap_textures[i];
  // We can access the cubemap texture data through ArImage APIs.
  ArImage_getWidth(session, image_ptr, &width);
  ArImage_getHeight(session, image_ptr, &height);
  ArImage_getFormat(session, image_ptr, &format);
  // Acquired image must be released with ArImage_release once it is no
  // longer needed.
  ArImage_release(image_ptr);
}
ArLightEstimate_destroy(ar_light_estimate);

Cường độ môi trường xung quanh

// Get the pixel intensity of AR_LIGHT_ESTIMATION_MODE_AMBIENT_INTENSITY mode.
float pixel_intensity;
ArLightEstimate_getPixelIntensity(session, ar_light_estimate,
                                  &pixel_intensity);

// Get the pixel color correction of
// AR_LIGHT_ESTIMATION_MODE_AMBIENT_INTENSITY mode.
float color_correction[4];
ArLightEstimate_getColorCorrection(session, ar_light_estimate,
                                   color_correction);
ArLightEstimate_destroy(ar_light_estimate);

Đảm bảo bảo tồn năng lượng bằng API HDR môi trường

Bảo toàn năng lượng là nguyên tắc mà ánh sáng phản chiếu từ một bề mặt sẽ mãnh liệt hơn trước khi va chạm. Quy tắc này là được thực thi trong kết xuất dựa trên vật lý, nhưng thường bị loại khỏi phiên bản cũ quy trình kết xuất dùng trong trò chơi điện tử và ứng dụng dành cho thiết bị di động.

Nếu bạn đang sử dụng quy trình kết xuất hình ảnh dựa trên thực tế với HDR môi trường ước tính ánh sáng, chỉ cần đảm bảo rằng bạn sử dụng các vật liệu dựa trên vật lý trong vật thể ảo.

Tuy nhiên, nếu không sử dụng đường ống thực tế, bạn có một vài tùy chọn:

  • Giải pháp lý tưởng nhất cho vấn đề này là chuyển sang một đường ống thực tế.

  • Tuy nhiên, nếu không thể thực hiện được cách đó, giải pháp hay là tăng gấp đôi giá trị suất phản chiếu từ một vật liệu phi vật lý bằng cách bảo toàn năng lượng . Điều này đảm bảo ít nhất mô hình tô bóng BRDF có thể chuyển hoá thành cơ thể. Mỗi BRDF có một yếu tố khác nhau -- ví dụ: đối với phản xạ khuếch tán, giá trị này là 1/Pi.