Saiba como usar a Estimativa de iluminação nos seus próprios apps.
Pré-requisitos
Entenda os conceitos fundamentais de RA e saiba como configurar uma sessão do ARCore antes de continuar.
Configure a API uma vez por sessão com o modo adequado
Configure a estimativa de iluminação uma vez por sessão para o modo que você quer usar.
HDR ambiental
// 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);
Intensidade ambiente
// 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);
Desativado
// 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);
Usar valores obtidos da estimativa de iluminação
Para usar os valores obtidos da estimação de iluminação, receba a estimativa de luz de cada frame.
// 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; }
Em seguida, receba os componentes de iluminação HDR ambiental para a configuração atual:
HDR ambiental
// 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);
Intensidade ambiente
// 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);
Garantir a conservação de energia com as APIs HDR ambientais
A conservação de energia é o princípio de que a luz refletida de uma superfície nunca será mais intensa do que era antes de atingir a superfície. Essa regra é aplicada na renderização baseada em física, mas geralmente é omitida dos pipelines de renderização legados usados em videogames e apps para dispositivos móveis.
Se você estiver usando um pipeline de renderização fisicamente baseado com estimativa de luz HDR ambiental, basta garantir que materiais fisicamente baseados sejam usados nos objetos virtuais.
No entanto, se você não estiver usando um pipeline baseado em física, terá algumas opções:
A solução mais adequada para isso é migrar para um pipeline baseado em física.
Se isso não for possível, uma boa solução alternativa é multiplicar o valor de albedo de um material não baseado na física por um fator de conservação de energia. Isso garante que pelo menos o modelo de sombreamento BRDF possa ser convertido em um modelo fisicamente baseado. Cada BRDF tem um fator diferente. Por exemplo, para uma reflexão difusa, é 1/Pi.