2009-03-25 24 views
10

OpenGLのオフスクリーンフレームバッファオブジェクトにレンダリングして、イメージとして保存したい。 FBOが表示サイズより大きいことに注意してください。私は、オフスクリーンのバッファにレンダリングして、テクスチャとして使うことができます。私はこの大きなテクスチャをオフセットを使ってディスプレイにスクロールすることができます。これは、私がウィンドウよりも大きなコンテキストにレンダリングすることを私に自信を持たせるものです。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つの色で満たされています。

私の質問は - 私は間違っているのですか?

答えて

11

最後に私はこの問題を解決しました。

私はその内容を保存するためのFBOを有効にする必要があります:

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

だけでは十分ではありません

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 

経由glReadPixelsためのFBOを選択しながら。

(他のすべてのものが正しいと試験、例えば、ビューポートのサイズ、幅及びバッファの高さ、画像テクスチャ等)

+0

私はあなたと同じ問題を抱えています。 fbo変数の取得方法を拡張できますか?私はglGenFrameBuffersにアクセスするために何を含めるべきかを見つけることができません。これは私が使用していると思われるものです。 –

+1

1.ここには良い説明があります:http://www.songho.ca/opengl/gl_fbo.html – razong

+1

2. GLuint fbo; glGenFramebuffersEXT(1、&fbo);)作成するfboの番号 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT、fbo); – razong

0

2つの質問:imageSaverをどのように作成していますか?幅と高さが正しいことを確認してください(1024×1024の画像を保存しようとしていますか?

+0

1 imageSaverがopenframeworks画像オブジェクトです。エラーが発生するのを避けるために、空のビットマップファイルをロードして、目標とするイメージのサイズと深さを作成することで作成しました。 2.レンダリングされたウィンドウと同じ内容の、1024x1024のイメージを表示します。それ以外はすべて「空」 – razong

0

OpenGLグラフィックドライバでは、これはかなり長い間、よく起こっている動作です。少なくとも10年前にnVidia Geforce 3カードとまったく同じ問題を抱えていたことを思い出しました。同様のソリューション - オフスクリーンテクスチャへのレンダリング。

0

ビューポートサイズなどが間違っているようです。

関連する問題