我對使用OpenGL中的紋理三角形網格繪製全屏幕背景時看到的糟糕表現感到困惑:只繪製背景而沒有其他東西在使用最基本的着色器爲40 fps,使用默認管道爲50 fps。全屏幕背景紋理與OpenGL性能問題(iPad)
雖然40 fps看起來並不算太差,但是在其上添加其他任何東西都會使fps下降,並且考慮到我需要在其上繪製100-200個其他網格物體,最終會得到微小的15 fps這根本不可用。
我已經分離的相關代碼到可用的XCode項目here,但它的本質是規範的紋理貼圖例如:
static const GLfloat squareVertices[] = {
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f,
1.0f, 1.0f,
};
static const GLfloat texCoords[] = {
0.125, 1.0,
0.875, 1.0,
0.125, 0.0,
0.875, 0.0
};
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
if ([context API] == kEAGLRenderingAPIOpenGLES2) {
// Use shader program.
glUseProgram(program);
glActiveTexture(GL_TEXTURE0);
glUniform1i(uniforms[UNIFORM_TEXTURE], 0);
glBindTexture(GL_TEXTURE_2D, texture);
// Update attribute values.
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
glEnableVertexAttribArray(ATTRIB_TEXCOORD);
} else {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
頂點着色器:
attribute lowp vec4 position;
attribute lowp vec2 tex;
varying lowp vec2 texCoord;
uniform float translate;
void main()
{
gl_Position = position;
texCoord = tex;
}
片段着色器:
varying lowp vec2 texCoord;
uniform sampler2D texture;
void main()
{
gl_FragColor = texture2D(texture, texCoord);
}
將矩形大小除以2渲染時間明顯地取決於繪圖在屏幕上顯示的房地產。這是完全合理的,但對我來說沒有意義的是,用OpenGL紋理映射網格覆蓋整個屏幕看起來不可能超過15 fps。
然而,有數百款遊戲可以做到這一點,所以這是可能的,我必須做出錯誤的事情,但它是什麼?
FWIW,您爲什麼在撥打相關電話後啓用客戶端狀態的任何原因? (例如,在啓用vert數組之前調用頂點指針) – 2011-04-08 15:21:29
實際上,大多數代碼都來自OpenGL ES iPad應用程序的默認模板,這並不意味着它是很好的代碼,但只要它有效,我就不會問自己無論這種或那種方式是否有意義:-) – 2011-04-08 16:47:16