7

連続するレンダー パスのシェーダーで深度バッファーとステンシル バッファーにアクセスする方法に関する情報を見つけるのは難しいようです。

最初のレンダリング パスでは、色と深度の情報をレンダリングするだけでなく、ステンシル操作を使用してオブジェクトをカウントします。これにはマルチ レンダー ターゲット FBO を使用し、カラー バッファーと組み合わせた深度ステンシル バッファーをアタッチします。それらはすべてテクスチャの形式です (レンダリング バッファ オブジェクトは含まれません)。

2 番目のレンダー パス (画面にレンダリングするとき) で、以前に計算されたステンシル インデックスにピクセル単位でアクセスしたい (ただし、そのときに描画しているピクセルと同じであるとは限りません)。以前にレンダリングされたカラー バッファを使用して、後処理効果を適用します。

しかし、2 番目のパスで深度ステンシル テクスチャを均一としてシェーダー プログラムにバインドできません。少なくとも黒の値のみが読み取られるため、正しくバインドされていないと思います。

  • シェーダー プログラムで使用するテクスチャ ユニットに深度ステンシル テクスチャをバインドすることは可能ですか? 「通常の」サンプラーを使用して深度とステンシル テクスチャにアクセスすることは不可能ですか? 「特別な」サンプラーで可能ですか?テクスチャに設定されている補間モードなどに依存しますか?

  • そうでない場合、これら 2 つのレンダー パス間でステンシル情報を別のカラー テクスチャにコピーする最善の (最速の) 方法は何ですか? おそらく、ステンシル テストを使用して単一の色を描画する 3 番目のレンダー パスが必要です (正確には、値がゼロかどうかをテストする必要があるため、最終レンダー パスでステンシル バッファーのバイナリバージョンのみが必要です)。

中間 FBO によって使用されるテクスチャのセットアップは次のとおりです。

// The textures for color information (GL_COLOR_ATTACHMENT*):
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
// The texture for depth and stencil information (GL_DEPTH_STENCIL_ATTACHMENT*):
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, w, h, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0);

2 番目のレンダー パスでは、現在、すべてのテクスチャの内容を「デバッグ」することだけを試みています。したがって、シェーダーを次の値でセットアップします。

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, <texture>);
glUniform1i(texLocation, 0);

シェーダー プログラムでテクスチャを画面にコピーするだけです。

uniform sampler2D tex;
in vec2 texCoord;
out vec4 fragColor;

void main() {
    fragColor = texture2D(tex, texCoord);
}

結果は次のとおりです。

  • <texture>上記で私のカラー テクスチャの 1 つを参照すると、最初のレンダー パスでレンダリングされたカラー出力が表示されます。これは期待どおりです。

  • 上記が深度ステンシル テクスチャを参照している場合<texture>、シェーダーは何もしません (画面をクリアする色が表示されます)。

  • 深度ステンシル テクスチャを CPU にコピーして調べると、期待どおりにパックされた 24 + 8 ビット データに深度とステンシルの両方の情報が表示されます。

4

1 に答える 1

2

ステンシルをテクスチャとして使用した経験はありませんが、次の拡張機能をご覧になることをお勧めします。

http://www.opengl.org/registry/specs/ARB/stencil_texturing.txt

別のオプションは、次を使用してテクスチャのビューを作成することです。

http://www.opengl.org/registry/specs/ARB/texture_view.txt

または、ステンシル バッファーなしでオブジェクトをカウントすることもできます。おそらく、MRT と 2 番目のレンダー ターゲットでの加算ブレンドを使用して、次のようにします。

http://www.opengl.org/registry/specs/EXT/draw_buffers2.txt

しかし、残念ながらこれらのオプションは純粋な GL3.3 には含まれていません...

于 2013-10-03T21:49:31.293 に答える