Я пытаюсь отобразить HUD поверх приложения OpenGL ES 2.0, написанного на C на платформе ARM Linux.OpenGL ES 2.0 + Cairo: HUD
В настоящее время я использую 2 треугольника, расположенных близко к плоскости отсечения и облицовки текстуры на них. Текстура - это размер экрана и в основном прозрачная, за исключением тех частей, где у меня есть текст. Текстура создается с помощью Pango/Cairo
Если я включаю HUD (раскомментирую вызов для render_ui), в настоящее время я получаю 50% -ный удар производительности (Goes from 60fps to 30fps).
Вот код, чтобы сделать 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");
}
Там должен быть более разумным способом сделать это.
Что такое GPU на вашей платформе (PowerVr, Adreno, Mali, Nvidia Tegra ...)? И что такое резолюция? –
@VB_overflow Vivante GPU/плата Freescale iMX6. Разрешение - 1920x1080. – ReX357