OpenGL ES 2.0 を使用して多数のオブジェクトを画面にレンダリングする iOS アプリを作成しています。現在、これらのオブジェクトは単純な形状 (正方形、球、円柱) です。
どのオブジェクトも互いに重なっていない場合、プログラムは 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 デバイスがこれを行うには遅すぎるとは信じられません。プログラムは、それぞれ約 180 個の三角形を持つ 5 つのモデルのみをレンダリングしています。
私が見ていないもの、またはこれに対する何らかの回避策はありますか? 提案や指針をいただければ幸いです。