6

OpenGL ES を使用したパフォーマンスのために、一部の画像処理作業を OpenGL に移植したいと考えています。非常に単純なしきい値処理アルゴリズムが用意されていますが、画像に追加のフィルター (コントラストなど) を組み合わせたいと考えています。

最初に考えたのは、複数のフラグメント シェーダーを使用してこれを完成させることです。ただし、これをかなり迅速に行いたいので、これにより多くの状態が変化しますか? 私が読んだ唯一の方法は、テクスチャで作業してから「プログラムを使用」を複数回呼び出すことによってこれを行うことです。

これを行うより効率的な方法はありますか?理想的には、ステップの一部としてコントラスト ストレッチとヒストグラム バランスを実行したいと考えています。

これを単一のシェーダーに組み合わせることができない限り、FBO はここで機能しますか?

私はOpenGLに少し慣れていません(わからない場合に備えて)。

ありがとう!

サイモン

4

2 に答える 2

5

手動で行わない限り、フラグメント シェーダーを「マージ」することはできないため、FBO を使用して「ピンポン」レンダリングを行うことが唯一の適切な選択です。2 つの FBO があり、一方に描画して他方から読み取り、次に FBO を切り替えて繰り返し、レンダリング間でフラグメント シェーダーを切り替えます。

于 2011-03-21T15:26:07.793 に答える
3

実際、ピンポン レンダリングはこの目的に非常に適しています。これは、実際に画面に描画する「バッチ」オブジェクトがある LibGDX 内で動作するコード サンプルです。入力は、FrameBuffers でキャプチャできます。

FrameBuffer ping = fbo; // the framebuffer containing your rendered texture
for (ShaderProgram shader : shaders) {
    pong.clear();
    pong.begin();
    batch.begin();
    batch.setShader(shader);
    batch.draw(ping.getColorBufferTexture(), 0, 0, width, height);
    batch.end();
    pong.end();
    ping = pong;
}
batch.begin();
batch.draw(pong.getColorBufferTexture(), 0, 0, width, height);
batch.end();

pong の明確な呼び出し (私の場合は、新しいフレーム バッファーの作成) はコストがかかるため、事前割り当てを行うと速度が向上する可能性があります。これは、それ自体の回答というよりは、マティアスの回答へのフォローアップですが、コメントには収まりません。

于 2015-04-15T02:55:09.547 に答える