1

アプリでフレームバッファの使用を開始しようとしています。フレームバッファオブジェクトをテクスチャとして使用する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からピクセルを読み取るための通常の方法です。問題のコードを更新して、コードが現在どのようになっているのかを確認しました

4

1 に答える 1

0

私はそれを解決しました。問題は私のglTranslatefにありました。glPushMatrix()FBOにレンダリングするときに必要なマトリックスパラメータを設定して設定しましたが、すべてが正常に機能するようになりました。

于 2012-08-20T09:33:04.247 に答える