Sto provando a rendere un HUD su un'applicazione OpenGL ES 2.0 scritta in C su una piattaforma ARM Linux.OpenGL ES 2.0 + Cairo: HUD
Attualmente sto usando 2 triangoli posizionati vicino al piano di ritaglio vicino e affiancandoci sopra la trama. La trama è la dimensione dello schermo ed è per lo più trasparente ad eccezione delle parti in cui ho il rendering del testo. La texture viene generata utilizzando Pango/Cairo
Se accendo l'HUD (decomprimendo la chiamata a render_ui), al momento subisco un calo di prestazioni del 50% (passa da 60 fps a 30 fps).
ecco il codice per rendere l'HUD:
void render_ui(OGL_STATE_T *state) {
glUseProgram(state->uiHandle);
matIdentity(modelViewMatrix);
matTranslate(modelViewMatrix, 0, 0, -0.51);
const GLfloat *mvMat2 = modelViewMatrix;
glViewport(0,0,state->screen_width, state->screen_height);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glBindBuffer(GL_ARRAY_BUFFER, state->uiVB);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, state->uiIB);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, state->uiTex);
glUniform1i(_uiTexUniform, 0);
glUniformMatrix4fv(_uiProjectionUniform, 1, 0, pMat);
glUniformMatrix4fv(_uiModelViewUniform, 1, 0, mvMat2);
glVertexAttribPointer(_uiPositionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(_uiColorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),
(GLvoid *) (sizeof(GLfloat) * 3));
glVertexAttribPointer(_uiTexCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex),
(GLvoid *) (sizeof(GLfloat) * 7));
glEnableVertexAttribArray(_uiPositionSlot);
glEnableVertexAttribArray(_uiColorSlot);
glEnableVertexAttribArray(_uiTexCoordSlot);
glDrawElements(GL_TRIANGLES, uiIndicesArraySize/uiIndicesElementSize,
GL_UNSIGNED_BYTE, 0);
glDisableVertexAttribArray(_uiTexCoordSlot);
glDisable(GL_BLEND);
GLenum err;
if ((err = glGetError()) != GL_NO_ERROR)
printf("There was an error");
}
Ci deve essere un modo più sensato di fare questo.
Qual è la GPU sulla tua piattaforma (PowerVr, Adreno, Mali, Nvidia Tegra ...)? Inoltre, qual è la risoluzione? –
@VB_overflow Scheda Vivante GPU/Freescale iMX6. La risoluzione è 1920x1080. – ReX357