アプリでフレームバッファの使用を開始しようとしています。フレームバッファオブジェクトをテクスチャとして使用するAppleチュートリアルを休耕しました。そして私のコードは次のようになります:
ヘッダーファイルのどこか:
GLuint framebuffer, texture;
GLenum status;
および.mファイル:
-(void)initFBO {
glGenFramebuffersEXT(1, &framebuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
GL_TEXTURE_2D, texture, 0);
status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
NSLog(@"failed");
} else {
NSLog(@"success");
}
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
-(void)someDrawingFunc {
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
glClearColor(0.0, 0.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ZERO);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, someTexture);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(0.0, height);
glTexCoord2f(0.0f, 1.0f);;
glVertex2f(0.0, 0.0);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(width, 0.0);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(width, height);
glEnd();
glFlush();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
[self drawFBO];
}
-(void)drawFBO {
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glColor4f(1.0, 1.0, 1.0, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f, 0.0f);
glEnd();
glFlush();
glBindTexture(GL_TEXTURE_2D, 0);
}
コンソールには「成功」と表示されますが、アプリウィンドウには次のように表示されます。
そして、glReadPixels
それらを画像に保存して保存すると、次のようになります。
保存された画像のサイズは本来あるべきサイズで、すべて問題glClearColor
ありませんが、私が描いたものではなく、不思議な黒い線で塗りつぶされた画像を取得しますframebuffer
フレームバッファをまったく使用せずに同じコードを使用している間、私のアプリでは次のように表示されます。
そして、保存すると、次のように表示されます。
私は何が間違っているのですか?
そのため、フレームバッファは、何らかの理由で、私が描画しようとしているテクスチャGL_QUADを拒否します。したがって、問題はフレームバッファの使用のどこかにあるはずだと思います。
編集
奇妙なこと。画面にfboを描画すると、赤い色(FBOを画面に描画する場合はglClearColor)しか表示されませんが、glReadPixelsを実行すると、ピクセルが適切に読み取られます。それは私のテクスチャで画像を保存します。
デフォルト画像(テクスチャ画像、FBOに描画):
アプリウィンドウに表示されるもの:
glReadPixels結果画像(FBOから読み取られ、ファイルに保存されたテクスチャ):
はい、逆さまです。OpenGLからピクセルを読み取るための通常の方法です。問題のコードを更新して、コードが現在どのようになっているのかを確認しました