Ich versuche, ein HUD über eine OpenGL ES 2.0-Anwendung, die in C geschrieben wurde, auf einer ARM Linux-Plattform zu rendern.OpenGL ES 2.0 + Kairo: HUD
Ich verwende derzeit zwei Dreiecke in der Nähe der Clipping-Ebene und kacheln die Textur auf ihnen. Die Textur ist die Größe des Bildschirms und ist größtenteils transparent mit Ausnahme der Teile, wo ich Text gerendert habe. Die Textur wird erzeugt mit Pango/Cairo
Wenn ich das HUD (auskommentieren den Aufruf von render_ui), mache ich derzeit einen 50% Performance-Hit (Geht von 60fps auf 30fps).
Hier ist der Code das HUD zu machen:
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");
}
Es gibt eine sinnvollere Art und Weise, dies zu tun sein muss.
Was ist die GPU auf Ihrer Plattform (PowerVr, Adreno, Mali, Nvidia Tegra ...)? Was ist die Auflösung? –
@VB_overflow Vivante GPU/Freescale iMX6-Karte. Die Auflösung beträgt 1920 x 1080. – ReX357