عناصر افتراضية إضاءة واقعية في المشهد

التعرّف على كيفية استخدام تقدير الإضاءة في تطبيقاتك الخاصة.

المتطلبات الأساسية

احرص على فهم مفاهيم الواقع المعزّز الأساسية. وكيفية ضبط جلسة ARCore قبل المتابعة.

ضبط واجهة برمجة التطبيقات مرة واحدة لكل جلسة باستخدام الوضع المناسب

اضبط ميزة "تقدير الإضاءة" مرة واحدة في الجلسة للوضع الذي تريد استخدامه.

النطاق العالي الديناميكية للبيئة

// 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) للضبط الحالي:

النطاق العالي الديناميكية للبيئة

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

ضمان الحفاظ على الطاقة باستخدام واجهات Environmental HDR API

الحفاظ على الطاقة هو المبدأ الذي يعني أنّ الضوء المنعكس من سطح أقوى بكثير مما كانت عليه قبل أن تصل إلى السطح. هذه القاعدة يتم فرضها في العرض المستند إلى مادي، ولكن يتم حذفها عادةً من البيانات القديمة مسارات العرض المستخدمة في ألعاب الفيديو وتطبيقات الأجهزة الجوّالة.

في حال استخدام مسار عرض مستند إلى مادي مع ميزة Environmental HDR للضوء التقديري، فما عليك سوى التأكد من استخدام المواد المادية في الكائنات الافتراضية.

أما إذا كنتم لا تستخدمون قنوات مترابطة من الناحية المادية، فلديكم بعض الخيارات:

  • الحل الأمثل لذلك هو الانتقال إلى مسار مستند إلى مسار مادي.

  • ومع ذلك، إذا لم يكن ذلك ممكنًا، فإن الحل الجيد يتمثل في مضاعفة قيمة البياض من مادة غير جسدية عن طريق الحفاظ على الطاقة . يمكن أن يؤكد ذلك على الأقل من خلال نموذج تظليل BRDF يمكن تحويلها إلى نماذج مادية. لكل حساب BRDF عامل مختلف -- فعلى سبيل المثال، للانعكاس المنتشر، تكون 1/باي.