Menerangi objek virtual secara realistis dalam adegan

Pelajari cara menggunakan Estimasi Pencahayaan di aplikasi Anda sendiri.

Prasyarat

Pastikan Anda memahami konsep dasar AR dan cara mengonfigurasi sesi ARCore sebelum melanjutkan.

Mengonfigurasi API sekali per sesi dengan mode yang sesuai

Konfigurasi Estimasi Pencahayaan sekali per sesi untuk mode yang ingin Anda gunakan.

HDR untuk Lingkungan

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

Intensitas Sekitar

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

Nonaktif

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

Gunakan nilai yang diperoleh dari Estimasi Pencahayaan

Untuk menggunakan nilai yang diperoleh dari Estimasi Pencahayaan, dapatkan perkiraan cahaya untuk setiap bingkai.

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

Lalu, dapatkan komponen pencahayaan HDR lingkungan untuk konfigurasi saat ini:

HDR untuk Lingkungan

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

Intensitas Sekitar

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

Memastikan konservasi energi dengan Environmental HDR API

Konservasi energi adalah prinsip bahwa cahaya yang dipantulkan dari permukaan akan tidak pernah lebih intens dari sebelum mencapai permukaan. Aturan ini diterapkan dalam rendering berbasis fisik, tetapi biasanya dihilangkan dari versi lama pipeline rendering yang digunakan dalam video {i>game<i} dan aplikasi seluler.

Jika Anda menggunakan pipeline rendering berbasis fisik dengan Environmental HDR perkiraan cahaya, cukup pastikan bahan berbasis fisik digunakan dalam objek virtual.

Jika Anda tidak menggunakan pipeline berbasis fisik, Anda memiliki beberapa opsi:

  • Solusi yang paling ideal untuk hal ini adalah bermigrasi ke pipeline berbasis fisik.

  • Akan tetapi, jika itu tidak memungkinkan, solusi yang baik adalah dengan menggandakan nilai albedo dari bahan berbasis non-fisik oleh konservasi energi . Anda dapat memastikan setidaknya model bayangan BRDF dapat diubah menjadi berbasis fisik. Setiap BRDF memiliki faktor yang berbeda -- misalnya, untuk refleksi difus, nilainya adalah 1/Pi.