7

テクスチャにレンダリングしてから、iPhone で OpenGL ES を使用してそのテクスチャを画面に描画しようとしています。この質問を出発点として使用し、Apple のデモ EAGLView のサブクラスで描画を行っています。

インスタンス変数:

GLuint textureFrameBuffer;
Texture2D * texture;

フレーム バッファとテクスチャを初期化するには、次のようにします。

GLint oldFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO);

// initWithData results in a white image on the device (works fine in the simulator)
texture = [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"blank320.png"]];

// create framebuffer
glGenFramebuffersOES(1, &textureFrameBuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);

// attach renderbuffer
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture.name, 0);

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
    NSLog(@"incomplete");

glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO);

さて、いつものように自分のシーンを画面に描くだけで、うまくいきます:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// draw some triangles, complete with vertex normals
[contentDelegate draw];
[self swapBuffers];

しかし、「textureFrameBuffer」にレンダリングしてから「テクスチャ」を画面に描画すると、結果の画像は上下逆になり、「裏返し」になります。つまり、3D オブジェクトの法線が外側ではなく内側を向いているように見えます。各オブジェクトの最前面は透明で、背面の内側が見えます。コードは次のとおりです。

GLint oldFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// draw some polygons
[contentDelegate draw];

glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glColor4f(1, 1, 1, 1);
[texture drawInRect:CGRectMake(0, 0, 320, 480)];    
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);

[self swapBuffers];

それに応じて (glTexCoordPointer) 座標を (Texture2D の drawInRect メソッドで) 並べ替えることで、画像の上下を簡単に反転できますが、「裏返し」の問題は解決しません。

Texture2D テクスチャを手動で作成した OpenGL テクスチャに置き換えてみましたが、結果は同じでした。PNG 画像から読み込まれた Texture2D の描画は正常に機能します。

オブジェクトの描画に関しては、各頂点には単位法線が指定されており、GL_NORMALIZE有効になっています。

glVertexPointer(3, GL_FLOAT, 0, myVerts);
glNormalPointer(GL_FLOAT, 0, myNormals);
glDrawArrays(GL_TRIANGLES, 0, numVerts);

画面にレンダリングされると、すべてがうまく描画されます。GL_DEPTH_TEST有効になっており、うまく機能しています。

これを修正する方法に関する提案はありますか? ありがとう!

4

1 に答える 1

3

これの興味深い部分は、バックバッファーに直接描画すると異なる結果が表示されることです。iPhone プラットフォームを使用しているため、バックバッファーに描画している場合でも、常にFBO に描画しています。

オフスクリーン FBO に深度バッファが接続されていることを確認してください。初期化コードで、次のスニペットをglBindFramebufferOES(...)の直後に追加することができます。

// attach depth buffer
GLuint depthRenderbuffer;
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
于 2009-10-30T21:21:40.617 に答える