Реалистичное освещение виртуальных объектов в сцене.

Узнайте, как использовать оценку освещенности в своих приложениях.

Предварительные требования

Прежде чем продолжить, убедитесь, что вы понимаете основные концепции дополненной реальности и как настроить сессию 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-интерфейсов Environmental HDR.

Принцип сохранения энергии гласит, что свет, отраженный от поверхности, никогда не станет интенсивнее, чем был до того, как достиг поверхности. Это правило соблюдается в физически корректном рендеринге, но обычно игнорируется в устаревших конвейерах рендеринга, используемых в видеоиграх и мобильных приложениях.

Если вы используете конвейер физически корректного рендеринга с оценкой освещения Environmental HDR, просто убедитесь, что в ваших виртуальных объектах используются физически корректные материалы.

Однако, если вы не используете конвейер обработки данных, основанный на физических принципах, у вас есть несколько вариантов:

  • Наиболее оптимальным решением в этом случае является переход на конвейер обработки данных, основанный на физическом принципе.

  • Однако, если это невозможно, хорошим обходным путем является умножение значения альбедо для материала, не основанного на физических принципах, на коэффициент сохранения энергии. Это может гарантировать, что, по крайней мере, модель затенения BRDF может быть преобразована в физически обоснованную. Каждая модель BRDF имеет свой коэффициент — например, для диффузного отражения он равен 1/Pi.