אובייקטים וירטואליים מציאותיים בסצנה

רוצים לדעת איך משתמשים בהערכת תאורה באפליקציות שלכם?

דרישות מוקדמות

לפני שממשיכים, חשוב לוודא שאתם מבינים את המושגים הבסיסיים של AR ואת האופן שבו מגדירים סשן של ARCore.

הגדרת ה-API פעם אחת בכל סשן, באמצעות המצב המתאים

צריך להגדיר את הערכת התאורה פעם אחת בכל סשן, במצב שבו רוצים להשתמש.

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

עוצמת הסביבה

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

מושבתת

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

שימוש בערכים שהתקבלו מהערכת התאורה

כדי להשתמש בערכים שהתקבלו מהערכת התאורה, צריך לקבל את הערכת האור לכל תמונה.

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

אחר כך, משיגים את רכיבי התאורה הסביבתית של HDR בהתאם להגדרה הנוכחית:

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

עוצמת הסביבה

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

הקפדה על שימור אנרגיה באמצעות ממשקי HDR API

שימור אנרגיה הוא העיקרון שאור שמשתקף ממשטח לעולם לא יהיה חזק יותר מאשר לפני שהתנגש בפני השטח. הכלל הזה נאכף ברינדור שמבוסס על פיזי, אבל בדרך כלל הוא מושמט מצינורות עיבוד הנתונים מדור קודם במשחקי וידאו ובאפליקציות לנייד.

אם אתם משתמשים בצינור עיבוד נתונים פיזי עם הערכת תאורה סביבתית של HDR, פשוט צריך לוודא שנעשה שימוש בחומרים מבוססי-פיזי באובייקטים הווירטואליים.

עם זאת, אם אתם לא משתמשים בצינור עיבוד נתונים פיזי, יש לכם שתי אפשרויות:

  • הפתרון האידיאלי ביותר לכך הוא לעבור לצינור עיבוד נתונים פיזי.

  • עם זאת, אם זה לא אפשרי, כדאי להכפיל את ערך האלבדו מחומר לא פיזי בגורם שימור אנרגיה. כך לפחות יהיה אפשר להמיר את מודל ההצללה של BRDF לפורמט פיזי. לכל BRDF יש גורם אחר -- לדוגמה, בהשתקפות פיזור החישוב הוא 1/Pi.