10

私は OpenGL オフスクリーン フレームバッファ オブジェクトにレンダリングしており、それを画像として保存したいと考えています。FBOは表示サイズよりも大きいことに注意してください。オフスクリーン バッファにレンダリングし、それをテクスチャとして使用できます。オフセットを使用して、ディスプレイ全体でこの大きなテクスチャを「スクロール」できます。これにより、ウィンドウよりも大きなコンテキストにレンダリングすることを確信できます。

オフスクリーン バッファを画像ファイルに保存すると、常にトリミングされます。保存用のコード フラグメントは次のとおりです。

void ofFBOTexture::saveImage(string fileName) { 
    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
    // get the raw buffer from ofImage
    unsigned char* pixels = imageSaver.getPixels();
    glReadPixels(0, 0, 1024, 1024, GL_RGB, GL_UNSIGNED_BYTE, pixels); 

    imageSaver.saveImage(fileName); 
} 

画像の内容は切り取られ、表示されている部分は正しく保存されます (つまり、ピクセル形式のエラーや GL_RGB の問題などはありません) が、残りのスペースは 1 つの色で塗りつぶされます。

だから、私の質問は - 私が間違っているのは何ですか?

4

4 に答える 4

11

ついに問題を解決しました。

その内容を保存するためにfboをアクティブ化する必要があります:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
// save code
...
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

glReadPixels経由でfboを選択するだけです

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);

十分ではありません。

(ビューポートのサイズ、バッファの幅と高さ、画像のテクスチャなど、正しくテストされている他のすべてのもの)

于 2009-03-26T09:31:39.397 に答える
0

あなたは何も悪いことをしていません.これは長い間OpenGLグラフィックスドライバーで非常に一般的な動作でした-少なくとも10年前にnVidia Geforce 3カードでまったく同じ問題に遭遇したことを思い出し、同様の解決策を採用しました-オフスクリーン テクスチャへのレンダリング。

于 2009-03-25T17:40:57.530 に答える
0

開始するための 2 つの質問: imageSaver をどのように作成していますか? また、幅と高さが正しいことを確認していますか?

于 2009-03-25T17:16:35.217 に答える