ARCore est désormais compatible avec la stabilisation électronique de l'image (EIS), qui permet de produire un aperçu de l'appareil photo fluide. La stabilisation par EIS consiste à observer le mouvement du téléphone à l'aide du gyroscope et à appliquer un maillage d'homogénie de compensation dans les limites de la texture de l'appareil photo pour contrer les tremblements mineurs. La stabilisation électronique de l'image n'est disponible que dans l'orientation portrait de l'appareil. Toutes les orientations seront prises en charge dans la version 1.39.0 d'ARCore.
Demander l'assistance EIS et l'activer
Pour activer l'EIS, configurez votre session pour qu'elle utilise AR_IMAGE_STABILIZATION_MODE_EIS
. Si l'appareil n'est pas compatible avec la fonctionnalité EIS, une exception est générée à partir d'ARCore.
int enableEis = 0; ArSession_isImageStabilizationModeSupported( ar_session, AR_IMAGE_STABILIZATION_MODE_EIS, &enableEis); if (!enableEis) { return; } // Create a session config. ArConfig* ar_config = NULL; ArConfig_create(ar_session, &ar_config); // Enable Electronic Image Stabilization. ArConfig_setImageStabilizationMode(ar_session, ar_config, AR_IMAGE_STABILIZATION_MODE_EIS); CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS); // Release config resources. ArConfig_destroy(ar_config);
Transformer des coordonnées
Lorsque l'EIS est activé, le moteur de rendu doit utiliser les coordonnées de l'appareil modifiées et les coordonnées de texture correspondantes qui intègrent la compensation EIS lors de l'affichage de l'arrière-plan de l'appareil photo. Pour obtenir les coordonnées compensées par l'EIS, utilisez ArFrame_transformCoordinates3d
, en utilisant AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES
comme entrée et AR_COORDINATES_3D_EIS_NORMALIZED_DEVICE_COORDINATES
comme sortie pour obtenir les coordonnées de l'appareil 3D et AR_COORDINATES_3D_EIS_TEXTURE_NORMALIZED
comme sortie pour obtenir les coordonnées de la texture 3D. Pour le moment, le seul type de coordonnées d'entrée compatible avec ArFrame_transformCoordinates3d
est AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES
.
int kNumVertices = 4; // Positions of the quad vertices in clip space (X, Y). const GLfloat kVertices[] = { -1.0f, -1.0f, +1.0f, -1.0f, -1.0f, +1.0f, +1.0f, +1.0f, }; float transformed_vertices_[4 * 3]; float transformed_uvs_[4 * 3]; ArFrame_transformCoordinates3d( session, frame, AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES, kNumVertices, kVertices, AR_COORDINATES_3D_EIS_NORMALIZED_DEVICE_COORDINATES, transformed_vertices_); ArFrame_transformCoordinates3d( session, frame, AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES, kNumVertices, kVertices, AR_COORDINATES_3D_EIS_TEXTURE_NORMALIZED, transformed_uvs_); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_EXTERNAL_OES, camera_texture_id_); glUseProgram(camera_program_); glUniform1i(camera_texture_uniform_, 0); // Set the vertex positions and texture coordinates. glVertexAttribPointer(camera_position_attrib_, 3, GL_FLOAT, false, 0, transformed_vertices_); glVertexAttribPointer(camera_tex_coord_attrib_, 3, GL_FLOAT, false, 0, transformed_uvs_); glEnableVertexAttribArray(camera_position_attrib_); glEnableVertexAttribArray(camera_tex_coord_attrib_);
Lorsque l'EIS est désactivé, les coordonnées 3D de sortie sont équivalentes à leurs homologues 2D, et les valeurs z sont définies pour ne produire aucun changement.
Modifier les nuanceurs
Les coordonnées 3D calculées doivent être transmises aux nuanceurs de rendu en arrière-plan. Les tampons de sommets sont désormais en 3D avec EIS:
layout(location = 0) in vec4 a_Position;
layout(location = 1) in vec3 a_CameraTexCoord;
out vec3 v_CameraTexCoord;
void main() {
gl_Position = a_Position;
v_CameraTexCoord = a_CameraTexCoord;
}
De plus, le nuanceur de fragment doit appliquer une correction de perspective:
precision mediump float;
uniform samplerExternalOES u_CameraColorTexture;
in vec3 v_CameraTexCoord;
layout(location = 0) out vec4 o_FragColor;
void main() {
vec3 tc = (v_CameraTexCoord / v_CameraTexCoord.z);
o_FragColor = texture(u_CameraColorTexture, tc.xy);
}
Pour en savoir plus, consultez l'application exemple hello_eis_kotlin.