Bir sahnedeki sanal nesneleri gerçekçi bir şekilde ışıklandırın

Işıklandırma Tahmini'nin nasıl kullanılacağını öğrenin inceleyebilirsiniz.

Ön koşullar

Temel artırılmış gerçeklik kavramlarını anladığınızdan emin olun ve devam etmeden önce ARCore oturumunun nasıl yapılandırılacağı hakkında daha fazla bilgi edinin.

API'yi oturum başına bir kez uygun modla yapılandırma

Kullanmak istediğiniz mod için Işık Tahmini'ni oturum başına bir kez yapılandırın.

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

Ortam Yoğunluğu

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

Devre dışı

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

Işıklandırma Tahmini'nden elde edilen değerleri kullan

Aydınlatma Tahmini'nden elde edilen değerleri kullanmak istiyorsanız her kare için ışık tahminini alın.

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

Ardından mevcut yapılandırmanın çevresel HDR ışıklandırma bileşenlerini edinin:

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

Ortam Yoğunluğu

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

Environmental HDR API'leriyle enerjinin korunmasını sağlama

Enerji tasarrufu, bir yüzeyden yansıyan ışığın hiçbir zaman daha yoğun olmayacaktır. Bu kural fiziksel tabanlı oluşturmada zorunlu kılınır ancak genellikle eski sürümdeki atılır Video oyunları ve mobil uygulamalarda kullanılan ardışık düzenleri oluşturma.

Environmental HDR ile fiziksel tabanlı bir oluşturma ardışık düzeni kullanıyorsanız yalnızca ışık tahmininde bulunmayıp evinizde fiziksel olarak bulunan malzemelerin kullanıldığından sanal nesnelerdir.

Ancak fiziksel tabanlı bir ardışık düzen kullanmıyorsanız seçenekler:

  • Bunun için en ideal çözüm, fiziksel tabanlı bir ardışık düzene geçmektir.

  • Ancak bu mümkün değilse iyi bir çözüm olarak enerji korunumu yoluyla, fiziksel olmayan bir malzemeden elde edilen yansıtma oranı faktörünü içerir. Bu, en azından BRDF gölgelendirme modelinin kullanılmasını sağlayabilir dönüştürülebilir. Her BRDF'nin farklı bir faktörü vardır. örneğin, dağınık yansıma için 1/Pi'dir.