ARCore ora supporta la stabilizzazione elettronica dell'immagine (EIS), che contribuisce a produrre un'anteprima fluida della fotocamera. La stabilizzazione elettronica dell'immagine (EIS) viene ottenuta osservando il movimento dello smartphone tramite il giroscopio e applicando una mesh di omogrametria compensativa entro i confini della trama della fotocamera che contrasta le piccole vibrazioni. La stabilizzazione elettronica dell'immagine è supportata solo con l'orientamento verticale del dispositivo. Tutti gli orientamenti saranno supportati nella versione 1.39.0 di ARCore.
Esegui query per l'assistenza EIS e attiva EIS
Per attivare EIS, configura la sessione in modo che utilizzi AR_IMAGE_STABILIZATION_MODE_EIS
. Se il dispositivo non supporta la funzionalità EIS, verrà generata un'eccezione da 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);
Trasformare le coordinate
Quando la stabilizzazione elettronica dell'immagine è attiva, il renderer deve utilizzare le coordinate del dispositivo modificate e le coordinate della texture corrispondenti che incorporano la compensazione EIS durante il rendering dello sfondo della fotocamera. Per ottenere le coordinate compensate dall'EIS, utilizza ArFrame_transformCoordinates3d
, utilizzando AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES
come input e AR_COORDINATES_3D_EIS_NORMALIZED_DEVICE_COORDINATES
come output per ottenere le coordinate del dispositivo 3D e AR_COORDINATES_3D_EIS_TEXTURE_NORMALIZED
come output per ottenere le coordinate della texture 3D. Per il momento, l'unico tipo di coordinate di input supportato per ArFrame_transformCoordinates3d
è 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_);
Quando la correzione della distorsione è disattivata, le coordinate 3D in uscita sono equivalenti alle loro controparti 2D, con i valori z impostati in modo da non produrre alcuna modifica.
Modificare gli shader
Le coordinate 3D calcolate devono essere passate agli shader di rendering in background. I buffer dei vertici ora sono 3D con 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;
}
Inoltre, lo shader di frammento deve applicare la correzione della prospettiva:
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);
}
Per maggiori dettagli, consulta l'app di esempio hello_eis_kotlin.