4

複数のレイヤーをレンダリングしていますが、変更がその下にある他のすべてのレイヤーに影響するため、1 つのフレーム バッファーだけでレンダリングすることはできません。

これらのレイヤーを 1 つの最終レイヤーに結合できるように、これらのレイヤーを個別にレンダリングするにはどうすればよいですか? レイヤーは透明度でレンダリングされるため、それらを組み合わせると、下のすべてのレイヤーに応じてブレンドされます。

私は現在、FBO を使用してそれらすべてを 1 つのレイヤーでオフスクリーン レンダリングしていますが、上で述べたように、最上層のレイヤーがすべての最下層にも影響を与える場合、うまく機能しません。

では、どうすれば 2 つ (またはそれ以上? (どちらの方法が速いか)) の FBO (または FBO のより良い方法?) をできるだけ効率的に組み合わせることができますか? 現在、それらを 1 つずつレンダリングし、RAM に入れ、ピクセルごとに自分で結合することはできますが、それは遅い方法のようです。

これを行う最速の方法は何ですか?

4

3 に答える 3

4

2D テクスチャ配列を使用します。配列の各レイヤーは 1 つのレンダー レイヤーです。

各レイヤーを独自のカラー アタッチメント テクスチャ レイヤーにレンダリングします (いつでも FBO カラー アタッチメントを切り替えることができます) glFramebufferTexture3D。ターゲット レイヤーを選択できます。

次に、フラグメント シェーダーで、必要に応じて 2D 配列テクスチャのレイヤーを結合します。

異なるテクスチャ レイヤーを異なるレンダー ターゲットにバインドすることで、マルチ レンダー ターゲットを使用することもできます。

于 2012-10-10T10:49:03.393 に答える
3

MRT (複数のレンダー ターゲット) を使用できます。フレームバッファを作成してバインドする必要があります(その方法はすでに知っているようです)。次に、いくつかのテクスチャを次のようにアタッチします。

glFramebufferTexture2DEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texA, 0 );
glFramebufferTexture2DEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, texB, 0 );

ここでは、2 つのテクスチャ (を使用して作成されたtexA& ) をカラー アタッチメント番号およびとしてアタッチしました。次に、出力変数ではなく、最初の色のアタッチメントと2 番目の色のアタッチメントを使用して、シェーダーに色を書き込むだけです。texBglGenTextures01gl_FragColorgl_FragData[0]gl_FragData[1]

texA次に、2 番目のパスを使用して、とtexBテクスチャに保存されている画像を組み合わせることができます。

PS これらは OpenGL 2 の関数呼び出しです。OpenGL 3 を使用する場合、関数呼び出しは似ています ( を除いてEXT) が、シェーダーの出力を手動で指定する必要があります。必要に応じて、これに対する解決策を投稿できます。

于 2012-10-10T10:38:08.470 に答える
0


間違っているかもしれませんが、レベル別にソートされたレイヤー管理を作成できます。次に、最初のレイヤーを最後のレイヤーに描画するだけで、適切なブレンド機能があれば、目的のアルファ効果を実現できます...また、すべてのシーンの合計アルファを制御できます. すべてのレイヤーを個別にレンダリングするには、DEPTH BIT BUFFERをクリアすることが重要です。

このアイデアの擬似コードは次のようになります。

Total Alpha = 0.9
For l in layer_list // render layers
    // clear depth bit (important before render every layer)
    glClear(GL_DEPTH_BIT_BUFFER)   

    // render all objects layer of layer 'l' with alpha = layer_alpha * total_alpha
    renderLayer(l, TotalAlpha*l.getAlpha())

End For
于 2013-10-03T22:33:04.997 に答える