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
Konfigurasi 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 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);
Menggunakan 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 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 API HDR Lingkungan
Konservasi energi adalah prinsip bahwa cahaya yang dipantulkan dari permukaan tidak akan pernah lebih intens daripada sebelum mengenai permukaan. Aturan ini diterapkan dalam rendering berbasis fisik, tetapi biasanya dihilangkan dari pipeline rendering lama yang digunakan dalam game video dan aplikasi seluler.
Jika Anda menggunakan pipeline rendering berbasis fisik dengan estimasi cahaya HDR Lingkungan, cukup pastikan materi berbasis fisik digunakan dalam objek virtual Anda.
Namun, jika Anda tidak menggunakan pipeline berbasis fisik, Anda memiliki beberapa opsi:
Solusi paling ideal untuk hal ini adalah bermigrasi ke pipeline berbasis fisik.
Namun, jika hal tersebut tidak memungkinkan, solusi yang baik adalah mengalikan nilai albedo dari materi non-berbasis 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 pantulan difus adalah 1/Pi.