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

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

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

חשוב לוודא שאתם מבינים את המושגים הבסיסיים של 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);

הבטחת שימור אנרגיה באמצעות ממשקי API של HDR סביבתי

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

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

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

  • הפתרון האידיאלי הוא לעבור לצינור עיבוד נתונים מבוסס-פיזי.

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