0

現在、複数の opengl es ビューポート (つまり、分割画面) を使用する iOS アプリを作成しようとしています。これが私がやっている方法です:

// Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
    glGenFramebuffersOES(1, &defaultFramebuffer);
    glGenRenderbuffersOES(1, &colorRenderbuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);

// Replace the implementation of this method to do your own custom drawing
const GLfloat squareVertices[] = {
  -0.5f, -0.5f,
  0.5f,  -0.5f,
  -0.5f,  0.5f,
  0.5f,   0.5f,
};
const GLubyte squareColors[] = {
  255, 255,   0, 255,
  0,   255, 255, 255,
  0,     0,   0,   0,
  255,   0, 255, 255,
 };

[EAGLContext setCurrentContext:context];

glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
glViewport(0, backingHeight/2, backingWidth/2, backingHeight/2);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glRotatef(3.0f, 0.0f, 0.0f, 1.0f);

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
glEnableClientState(GL_COLOR_ARRAY);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
// equivalent to glutswapBuffers()
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

/*********************SECOND VIEW*******/
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
glViewport(backingWidth/2, 0, backingWidth/2, backingHeight/2);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glRotatef(3.0f, 0.0f, 0.0f, 1.0f);

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
glEnableClientState(GL_COLOR_ARRAY);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
/*********************END***************/

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
  1. シミュレーターでは、2 番目のビューポートのみが表示されます (この場合、画面の右下隅にある回転する立方体)。デバイスではどちらも表示されますが、点滅しています... (左上と右下)
  2. glRotatef は 2 回適用されますが、他の変換は 1 回だけ適用したいと考えています。

私が望むのは、単純に同じシーンを 2 回表示することです。基本的に、2台のカメラが同じものを見ているようにシミュレートして、これを画面に表示しようとしています。明らかに、私は何か間違ったことをしています.2つの別々のフレームバッファとレンダバッファを持っている方が良いでしょうか、それともこれを達成するためのより簡単な方法はありますか?

4

1 に答える 1

2

問題はこの行です:

/*********************SECOND VIEW*******/
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_FRAMEBUFFER);

glClearはビューポートの影響を受けません。部分的にクリアする場合は、はさみテストまたはステンシルバッファのいずれかを使用する必要があります。

glClearのドキュメントを参照してください。

于 2012-07-05T23:10:27.783 に答える