連続するレンダー パスのシェーダーで深度バッファーとステンシル バッファーにアクセスする方法に関する情報を見つけるのは難しいようです。
最初のレンダリング パスでは、色と深度の情報をレンダリングするだけでなく、ステンシル操作を使用してオブジェクトをカウントします。これにはマルチ レンダー ターゲット 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 ビット データに深度とステンシルの両方の情報が表示されます。