Próbuję wyrenderować HUD nad aplikacją OpenGL ES 2.0 napisaną w języku C na platformie ARM Linux.OpenGL ES 2.0 + Cairo: HUD
Obecnie używam dwóch trójkątów umieszczonych blisko zbliżonej płaszczyzny obcinania i umieszczających na nich teksturę. Tekstura ma rozmiar ekranu i jest przeważnie przezroczysta, z wyjątkiem części, w których tekst jest renderowany. Tekstura jest generowana za pomocą Pango/Cairo
Jeśli włączyłem HUD (odkomentowanie połączenia z render_ui), obecnie uzyskuję 50% skuteczność (od 60 do 30 klatek na sekundę).
Oto kod, aby uczynić 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");
}
Musi być bardziej rozsądny sposób to zrobić.
Co to jest GPU na twojej platformie (PowerVr, Adreno, Mali, Nvidia Tegra ...)? Co to jest rozdzielczość? –
@VB_overflow Płyta główna Vivante GPU/Freescale iMX6. Rozdzielczość wynosi 1920x1080. – ReX357