Realistycznie oświetlone wirtualne obiekty w scenie

Dowiedz się, jak używać Oszacowania oświetlenia w swoich aplikacjach.

Wymagania wstępne

Zanim przejdziesz dalej, upewnij się, że znasz podstawowe pojęcia związane z AR i wiesz, jak skonfigurować sesję ARCore.

Skonfiguruj interfejs API raz na sesję z użyciem odpowiedniego trybu

Skonfiguruj szacowanie oświetlenia raz na sesję w przypadku wybranego trybu.

Środowisko HDR

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

Intensywność otoczenia

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

Wyłączono

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

Użyj wartości uzyskanych z narzędzia Oszacowanie oświetlenia

Aby użyć wartości uzyskanych z narzędzia Szacowanie oświetlenia, pobierz oszacowanie oświetlenia dla każdej klatki.

// 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;
}

Następnie pobierz komponenty oświetlenia środowiskowego HDR dla bieżącej konfiguracji:

Środowisko HDR

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

Intensywność otoczenia

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

Zapewnianie oszczędzania energii dzięki interfejsom API Environmental HDR API

Oszczędność energii to zasada, że światło odbite od powierzchni nigdy nie będzie silniejsze niż przed uderzeniem na tę powierzchnię. Ta reguła jest egzekwowana w przypadku renderowania fizycznego, ale zwykle jest pomijana w starszych potokach renderowania używanych w grach wideo i aplikacjach mobilnych.

Jeśli używasz fizycznego potoku renderowania z oszacowaniem światła HDR środowiskowego, upewnij się, że w obiektach wirtualnych używane są materiały fizyczne.

Jeśli jednak nie używasz fizycznie potoku, masz kilka możliwości:

  • Najlepszym rozwiązaniem w tym przypadku jest migracja do potoku fizycznie.

  • Jeśli jednak nie jest to możliwe, dobrym obejściem jest pomnożenie wartości albedo materiału niefizycznego przez współczynnik oszczędzania energii. W ten sposób mamy pewność, że przynajmniej model cieniowania BRDF można przekształcić w fizycznie modelowany. Każdy BRDF ma inny czynnik – na przykład w przypadku rozproszonego odbicia wynosi on 1/Pi.