3

すぐに:バッファイメージのサイズを変更してから、ピクセルをファイルなどに保存するためにピクセルを返す簡単な方法が必要です。

現在、私は最初にglReadPixels()を使用し、次に自分でピクセルを調べて、自分のサイズ変更関数でピクセルのサイズを変更しています。

このサイズ変更を高速化する方法はありますか?たとえば、OpenGLに作業を任せることはできますか?miplevelとmipmappingを有効にしてglGetTexImage()を使用できると思いますが、前に気付いたように、その関数はGFXカードでバグがあり、使用できません。

GPUメモリを節約するために必要なのは、1から4までの1つのmiplevelだけですが、すべてではありません。では、必要なサイズのミップレベルを1つだけ生成することは可能ですか?

注:ステンシルテストにはピクセル精度のレンダリングが必要なため、マルチサンプリングを使用できるとは思いません。マルチサンプリングでレンダリングすると、ピクセルがぼやけ、ステンシルテストとマスキングで失敗し、結果が正しくなくなります(AFAIK) 。編集:色(RGBA)バッファーのみをスケーリングしたい!

4

2 に答える 2

2

目的のターゲット サイズのフレーム バッファを作成し、フルサイズのバッファ サイズのテクスチャ クワッドでソース イメージを描画します。次に、glReadPixels を使用して、サイズ変更されたフレーム バッファの内容を読み取ります。

疑似コード:

unbind_texture(OriginalSizeFBOattachmentColorTex);

glBindFramebuffer(OriginalSizeFBO);
render_picture();

glBindFramebuffer(TargetSizeFBO); // TargetSizeFBO used a Renderbuffer color attachment
glBindTexture(OriginalSizeFBOattachmentColorTex);
glViewport(TargetSize);
render_full_viewport_quad_with_texture();

glReadPixels(...);
于 2012-10-12T13:30:51.777 に答える
2

OpenGL 3.0 または別の方法EXT_framebuffer_blitで利用できる場合 (非常に可能性が高い -- 2005 年頃以降のすべての nVidia カード、2008 年頃以降のすべての ATI カードに搭載されており、Intel HD グラフィックスでさえそれをサポートすると主張している)、glBlitFramebuffer[EXT]より小さなフレームバッファーに入ることができます (それぞれ小さい四角形) を作成し、グラフィックス カードに作業を行わせます。オーバーラップされたブリットは未定義(許可され
ていますが、未定義) であるため、「オリジナルは必要ありません」と言ったとしても、同じframbuffer内で安全に再スケーリングできないことに注意してください。

または、もちろん、単純なダウンスケーリング ピクセル シェーダー (必要に応じてaniso デシメーション) を使用してフルスクリーン クワッドを描画することもできます。

実際、最後の段落でステンシルについて言及しているので... 再スケーリングするのがステンシル(または深さ) である場合は、シェーダーを使用してフルスクリーンのクワッドを描画することを最も決定的に望んでいます。そうでなければ望ましい結果。通常、そのmaxような場合は補間ではなくフィルタを選択します (たとえば、0 のステンシル値と 10 の値を補間すると、合理的で意味のある結果が得られます。「0 以外の任意の値」や「最大値」など、他の何かが必要です)。サンプル領域の値")。

于 2012-10-12T12:23:48.443 に答える