【发布时间】:2015-11-27 11:45:44
【问题描述】:
我正在尝试在 ARM Linux 平台上用 C 语言编写的 OpenGL ES 2.0 应用程序渲染 HUD。
我目前正在使用 2 个三角形,它们位于靠近剪裁平面的位置,并将纹理平铺在它们上面。纹理是屏幕的大小,除了我渲染文本的部分外,大部分都是透明的。使用 Pango/Cairo 生成纹理
如果我打开 HUD(取消对 render_ui 调用的注释),我目前会受到 50% 的性能影响(从 60fps 到 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 / 飞思卡尔 iMX6 板。分辨率为 1920x1080。
标签: c opengl-es-2.0 hud