畫面中呈現逼真的淺色虛擬物體

瞭解如何使用光源預估功能 您的網站或應用程式

必要條件

請務必瞭解基本 AR 概念 以及如何在繼續操作前設定 ARCore 工作階段

以適當的模式為每個工作階段設定一次 API

針對要使用的模式,每個工作階段設定一次燈光估算值。

JavaKotlin
// 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);
// 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 照明元件

JavaKotlin
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.
 
}
}
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 的色彩校正元件 模式,請先重複使用共用配置,避免每個影格配置色彩校正。

JavaKotlin
 // Avoid allocation on every frame.
float[] colorCorrection = new float[4];
val colorCorrection = floatArrayOf(0.0f, 0.0f, 0.0f, 0.0f)

取得每個影格的亮度預估值,並取得環境強度元件 以及要使用的儲存空間

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

使用環境 HDR API 確保能源保育

從表面反射的光線,能源保育原則是 但它的衝擊力遠不如預期此規則是 強制轉譯,但在舊版中通常省略 電玩遊戲和行動應用程式的轉譯管線

如果採用採用 Environmental HDR 的實體型算繪管道 估算時,只需確保在生產過程中使用實體材料 以及虛擬物件

如果不是使用實體型管道,則有幾個 選項:

  • 最理想的解決方案是遷移至實體型管道。

  • 不過,如果無法解決問題,建議將時間相乘 是否來自能源保育的非物理性物質 。這樣做可確保至少使用 BRDF 陰影模型 可以轉換成實際資料每個 BRDF 都有不同的因素 -- 例如,差異反射的值為 1/Pi。