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

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

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

قبل المتابعة، تأكد من فهم مفاهيم الواقع المعزّز الأساسية وكيفية ضبط جلسة ARCore.

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

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

Java

// Configure the session with the Lighting Estimation API in ENVIRONMENTAL_HDR mode.
Config config = session.getConfig();
config.setLightEstimationMode(LightEstimationMode.ENVIRONMENTAL_HDR);
session.configure(config);

// Configure the session with the Lighting Estimation API in AMBIENT_INTENSITY mode.
Config config = session.getConfig();
config.setLightEstimationMode(LightEstimationMode.AMBIENT_INTENSITY);
session.configure(config);

// Configure the session with the Lighting Estimation API turned off.
Config config = session.getConfig();
config.setLightEstimationMode(LightEstimationMode.DISABLED);
session.configure(config);

Kotlin

// Configure the session with the Lighting Estimation API in ENVIRONMENTAL_HDR mode.
Config config = session.config
config.lightEstimationMode = LightEstimationMode.ENVIRONMENTAL_HDR
session.configure(config)

// Configure the session with the Lighting Estimation API in AMBIENT_INTENSITY mode.
Config config = session.config
config.lightEstimationMode = LightEstimationMode.AMBIENT_INTENSITY
session.configure(config)

// Configure the session with the Lighting Estimation API turned off.
Config config = session.config
config.lightEstimationMode = LightEstimationMode.DISABLED
session.configure(config)

ضبط وضع "ENVIRONMENTAL_HDR"

لضبط وضع ENVIRONMENTAL_HDR، عليك الحصول على تقدير الإضاءة لكل إطار، ثم الحصول على مكوّنات إضاءة النطاق العالي الديناميكية (HDR) البيئية التي تريد استخدامها.

Java

void update() {
  // Get the current frame.
  Frame frame = session.update();

  // Get the light estimate for the current frame.
  LightEstimate lightEstimate = frame.getLightEstimate();

  // Get intensity and direction of the main directional light from the current light estimate.
  float[] intensity = lightEstimate.getEnvironmentalHdrMainLightIntensity(); // note - currently only out param.
  float[] direction = lightEstimate.getEnvironmentalHdrMainLightDirection();
  app.setDirectionalLightValues(intensity, direction); // app-specific code.

  // Get ambient lighting as spherical harmonics coefficients.
  float[] harmonics = lightEstimate.getEnvironmentalHdrAmbientSphericalHarmonics();
  app.setAmbientSphericalHarmonicsLightValues(harmonics); // app-specific code.

  // Get HDR environmental lighting as a cubemap in linear color space.
  Image[] lightmaps = lightEstimate.acquireEnvironmentalHdrCubeMap();
  for (int i = 0; i < lightmaps.length /*should be 6*/; ++i) {
    app.uploadToTexture(i, lightmaps[i]);  // app-specific code.
  }
}

Kotlin

fun update() {
  // Get the current frame.
  val frame = session.update()

  // Get the light estimate for the current frame.
  val lightEstimate = frame.lightEstimate

  // Get intensity and direction of the main directional light from the current light estimate.
  val intensity = lightEstimate.environmentalHdrMainLightIntensity
  val direction = lightEstimate.environmentalHdrMainLightDirection
  app.setDirectionalLightValues(intensity, direction) // app-specific code.

  // Get ambient lighting as spherical harmonics coefficients.
  val harmonics = lightEstimate.environmentalHdrAmbientSphericalHarmonics
  app.ambientSphericalHarmonicsLightValues = harmonics // app-specific code.

  // Get HDR environmental lighting as a cubemap in linear color space.
  val lightMaps = lightEstimate.acquireEnvironmentalHdrCubeMap();
  for ((index, lightMap) in lightMaps.withIndex()) { // 6 maps total.
    app.uploadToTexture(index, lightMap); // app-specific code.
  }
}

ضبط وضع "AMBIENT_INTENSITY"

وإذا كنت تنوي استخدام مكوِّن تصحيح الألوان في وضع AMBIENT_INTENSITY، يجب أولاً تجنُّب تخصيص تصحيح الألوان في كل إطار من خلال إعادة استخدام عملية تخصيص مشتركة.

Java

 // Avoid allocation on every frame.
float[] colorCorrection = new float[4];

Kotlin

val colorCorrection = floatArrayOf(0.0f, 0.0f, 0.0f, 0.0f)

احصل على تقدير الإضاءة لكل إطار، ثم احصل على عناصر درجة شدة البيئة المحيطة التي تريد استخدامها.

Java

void update() {
  // Get the current frame.
  Frame frame = session.update();

  // Get the light estimate for the current frame.
  LightEstimate lightEstimate = frame.getLightEstimate();

  // Get the pixel intensity of AMBIENT_INTENSITY mode.
  float pixelIntensity = lightEstimate.getPixelIntensity();

  // Read the pixel color correction of AMBIENT_INTENSITY mode into colorCorrection.
  lightEstimate.getColorCorrection(colorCorrection, 0);
}

Kotlin

fun update() {
    // Get the current frame.
  val frame = session.update()

  // Get the light estimate for the current frame.
  val lightEstimate = frame.lightEstimate

  // Get the pixel intensity of AMBIENT_INTENSITY mode.
  val pixelIntensity = lightEstimate.pixelIntensity

  // Read the pixel color correction of AMBIENT_INTENSITY mode into colorCorrection.
  lightEstimate.getColorCorrection(colorCorrection, 0)
}

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

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

إذا كنت تستخدم مسار عرض يستند إلى البيانات المادية مع تقدير الإضاءة بتقنية Environmental HDR، يجب ببساطة التأكّد من استخدام المواد المستندة إلى البيانات في العناصر الافتراضية.

ولكن إذا كنت لا تستخدم مسارًا قائمًا ماديًا، فلديك خياران:

  • والحل الأمثل لذلك هو التحوّل إلى خط أنابيب قائم على وجود مادي.

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