Menerangi objek virtual secara realistis dalam adegan

Pelajari cara menggunakan Estimasi Pencahayaan di aplikasi Anda sendiri.

Prasyarat

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

Mengonfigurasi API sekali per sesi dengan mode yang sesuai

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

HDR 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 Ambien

// 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 estimasi cahaya untuk setiap frame.

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

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

HDR 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 Ambien

// 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 penghematan energi dengan Environmental HDR API

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

Jika Anda menggunakan pipeline rendering berbasis fisik dengan estimasi cahaya HDR Lingkungan, cukup pastikan material berbasis fisik digunakan di objek virtual Anda.

Namun, jika tidak menggunakan pipeline berbasis fisik, Anda memiliki beberapa opsi:

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

  • Namun, jika hal itu tidak memungkinkan, solusi yang tepat adalah dengan mengalikan nilai albedo dari material berbasis non-fisik dengan faktor konservasi energi. Hal ini dapat memastikan setidaknya model shading BRDF dapat dikonversi menjadi berbasis fisik. Setiap BRDF memiliki faktor yang berbeda -- misalnya, untuk refleksi difusi, nilainya adalah 1/Pi.