0

OpenGL 3200x2000 サイズのテクスチャ付きクワッドを描画します。OpenGLView のフレーム サイズは 940x560 に設定されています。必要に応じてクワッドを描画します。(glReadPixelsを使用して)画像として保存しようとすると、パンし、glReadPixelsエリアを(0,0)から(3200,2000)に設定します。ピクセル データ 3200x2000 を作成しますが、ファイルに保存すると小さな画像部分 (左下隅から 940x560) が表示され、他の領域全体が黒くなります。では、どうすればオフスクリーンエリアを読むことができますか? Framebufferを使ってみたのですが、非常に複雑で、作成中にエラーが発生したりなど...他に解決策はありますか?


状況の視覚化:

元の画像は次のようになります (3200x2000): ここに画像の説明を入力

OpenGLView は次のようになります (940x560): ここに画像の説明を入力

保存された画像は次のようになります (3200x2000): ここに画像の説明を入力

4

2 に答える 2

4

つまり、ウィンドウにレンダリングしているのです。さて、ウィンドウには特定のサイズがあります。そして、そのサイズ以外には何も存在しません。

これは、OpenGLが「ピクセル所有権テスト」と呼ぶものの一部です。ピクセルがコンテキストによって所有されていない場合、そのコンテンツは未定義です。ウィンドウの外側のピクセルはコンテキストによって所有されていないため、その内容は未定義です。

これが、フレームバッファオブジェクトが存在する理由の1つです。これにより、ウィンドウのサイズの外側にレンダリングできます。ただし、注意が必要です。ビューポートの最大サイズには制限があります。

または、画面サイズのピースでレンダリングすることもできます。各レンダリングの後に各ピースをダウンロードし、カメラを動かして次のピースをレンダリングします。

于 2012-08-01T08:22:52.650 に答える
1

コードやプラットフォームに関しては、あまり詳しく説明していません。

ただし、レンダリングされたウィンドウから読み取るだけでなく、オフスクリーン レンダリングを使用する必要があると思います。フレーム バッファ オブジェクトの使用に慣れていない場合は、最小限の例を次に示します。

https://github.com/datenwolf/codesamples/tree/master/samples/OpenGL/minimalfbo

編集#1:

OP はプラットフォームが OS X であると述べたので、iOS での最小限の FBO の例を示すコードを以下に投稿します。

https://github.com/glman74/simpleFBO

于 2012-08-01T07:18:17.723 に答える