我正在编写一个 iOS 应用程序,使用 OpenGL ES 2.0 将许多对象呈现到屏幕上。目前,这些对象是简单的形状(正方形、球体和圆柱体)。
当没有对象相互重叠时,程序以 30 fps 平稳运行。
当我添加出现在其余模型后面的对象(例如背景矩形)时,我的问题就出现了。当我尝试绘制背景矩形时,我只能在它前面绘制占屏幕不到一半的对象。任何大于此的帧速率都会下降到 15 到 20 fps 之间。
就目前而言,我所有的模型,包括背景,都是用以下代码绘制的:
- (void)drawSingleModel:(Model *)model
{
//Create a model transform matrix.
CC3GLMatrix *modelView = [CC3GLMatrix matrix];
//Transform model view
// ...
//Pass matrix to shader.
glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);
//Bind the correct buffers to openGL.
glBindBuffer(GL_ARRAY_BUFFER, [model vertexBuffer]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, [model indexBuffer]);
glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));
//Load vertex texture coordinate attributes into the texture buffer.
glVertexAttribPointer(_texCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 7));
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, [model textureIndex]);
glUniform1i(_textureUniform, 0);
glDrawElements([model drawMode], [model numIndices], GL_UNSIGNED_SHORT, 0);
}
这段代码是从我的draw方法中调用的,定义如下:
- (void)draw
{
glUseProgram(_programHandle);
//Perform OpenGL rendering here.
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
_camera = [CC3GLMatrix matrix];
//Camera orientation code.
//...
//Pass the camera matrix to the shader program.
glUniformMatrix4fv(_projectionUniform, 1, 0, _camera.glMatrix);
glViewport(0, 0, self.frame.size.width, self.frame.size.height);
//Render the background.
[self drawSingleModel:_background];
//Render the objects.
for(int x = 0; x < [_models count]; ++x)
{
[self drawSingleModel:[_models objectAtIndex:x]];
}
//Send the contents of the render buffer to the UI View.
[_context presentRenderbuffer:GL_RENDERBUFFER];
}
我发现通过更改渲染顺序如下:
for(int x = 0; x < [_models count]; ++x)
{
[self drawSingleModel:[_models objectAtIndex:x]];
}
[self drawSingleModel:_background];
在背景上渲染时我的帧速率是 30 fps。
当然,如果 _models 中的任何对象必须在彼此前面渲染,仍然会出现减速。此外,按此顺序渲染会导致半透明和透明对象被绘制为黑色。
我对 OpenGL 还是有点陌生,所以我不太清楚我的问题出在哪里。我的假设是执行深度测试的速度有所放缓,而且我也意识到我正在使用移动设备。但我不敢相信 iOS 设备太慢了,无法做到这一点。该程序仅渲染 5 个模型,每个模型大约有 180 个三角形。
有什么我没有看到的,或者有什么解决方法吗?任何建议或指示将不胜感激。