איך משתמשים בהערכת תאורה באפליקציות שלכם
דרישות מוקדמות
לפני שממשיכים, חשוב לוודא שמבינים את המושגים הבסיסיים של 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.