了解如何使用测光 。
前提条件
确保您了解 AR 基础概念 以及如何在继续之前配置 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);
通过 Environmental HDR API 确保节能
节能原则是指从物体表面反射的光线 它的强度从未像表面一样。此规则 在基于物理的渲染中会强制执行,但旧版中通常会省略 视频游戏和移动应用中使用的渲染管道
如果您将基于物理的渲染管道与 Environmental HDR 搭配使用 只需确保所用的材料是基于物理材料 虚拟对象。
但是,如果您不使用基于物理的流水线 选项:
对此,最好的解决方案是迁移到基于物理的流水线。
如果不能做到这一点,一个很好的解决办法是将 通过节能研究从非物理材料获得的反照率值 系数。这样至少可以确保 BRDF 着色模型 可以转换为物理存储。每个 BRDF 都有一个不同的因素 -- 例如,对于漫射反射,其值为 1/Pi。