我对使用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