Vật thể ảo chiếu sáng thực tế trong cảnh

Tìm hiểu cách sử dụng công cụ Dự kiến ánh sáng trong ứng dụng của chính bạn.

Điều kiện tiên quyết

Đảm bảo rằng bạn hiểu rõ các khái niệm cơ bản về AR và cách định cấu hình phiên ARCore trước khi tiếp tục.

Định cấu hình API một lần cho mỗi phiên bằng chế độ phù hợp

Thiết lập tính năng Ước tính ánh sáng một lần cho mỗi phiên cho chế độ bạn muốn sử dụng.

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)

Định cấu hình chế độ ENVIRONMENTAL_HDR

Để định cấu hình chế độ ENVIRONMENTAL_HDR, hãy lấy thông tin ước tính về ánh sáng cho mỗi khung hình, sau đó nhận các thành phần ánh sáng HDR môi trường mà bạn muốn sử dụng.

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.
  }
}

Định cấu hình chế độ AMBIENT_INTENSITY

Nếu bạn định sử dụng thành phần chỉnh màu của AMBIENT_INTENSITY hãy tránh phân bổ chỉnh màu trên mỗi khung hình bằng cách sử dụng lại phân bổ được chia sẻ.

Java

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

Kotlin

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

Nhận thông tin ước tính về ánh sáng cho mỗi khung hình, sau đó xem các thành phần cường độ ánh sáng xung quanh mà bạn muốn sử dụng.

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)
}

Đảm bảo bảo tồn năng lượng bằng API HDR môi trường

Bảo toàn năng lượng là nguyên tắc mà ánh sáng phản chiếu từ một bề mặt sẽ mãnh liệt hơn trước khi va chạm. Quy tắc này là được thực thi trong kết xuất dựa trên vật lý, nhưng thường bị loại khỏi phiên bản cũ quy trình kết xuất dùng trong trò chơi điện tử và ứng dụng dành cho thiết bị di động.

Nếu bạn đang sử dụng quy trình kết xuất hình ảnh dựa trên thực tế với Environmental HDR ước tính ánh sáng, chỉ cần đảm bảo rằng bạn sử dụng các vật liệu dựa trên vật lý trong vật thể ảo.

Tuy nhiên, nếu bạn không sử dụng một đường ống thực tế, bạn có một vài tùy chọn:

  • Giải pháp lý tưởng nhất cho vấn đề này là chuyển sang một đường ống thực tế.

  • Tuy nhiên, nếu không thể thực hiện được cách đó, giải pháp hay là tăng gấp đôi giá trị suất phản chiếu từ một vật liệu phi vật lý bằng cách bảo toàn năng lượng . Điều này đảm bảo ít nhất mô hình tô bóng BRDF có thể chuyển hoá thành cơ thể. Mỗi BRDF có một yếu tố khác nhau -- ví dụ: đối với phản xạ khuếch tán, giá trị này là 1/Pi.