1

ID3D11Texture2Dステンシルバッファを使用して、あるテクスチャの一部を別のテクスチャにオーバーレイしようとしています。これを行うには、ステンシルバッファに目的の形状を描画してから、テクスチャをコピーします。ステンシルバッファの使用法を学ぶための2Dテクスチャのサンプルコードを含むいくつかの良いチュートリアルを提案してください。(またはこれを行う別の方法)

4

1 に答える 1

15

ステンシル マスク 101:

  • すべての主流の GPU は 8 ビットのステンシル バッファーを使用し、深度バッファーに関連付けられているため、ステンシル (主に D24S8) を含むバッファー形式を選択する必要があります。
  • フレーム間のパフォーマンスの問題を回避するために、各フレームの最初の深度とステンシルの両方をクリアします *(以下の注を参照)
  • 何をしているのかわからない場合は、読み取りマスクと書き込みマスクに常に 0xFF を使用してください。
  • パフォーマンス上の理由から、ステンシル読み取りテストを実行するときは深度書き込みを有効にしないでください
  • パフォーマンス上の理由から、可能であれば、ステンシル読み取りテストを ==0 および !=0 に制限し、ゼロにクリアしてください。
  • D3D9 を使用している場合は、ステンシル バッファーのクリアと組み合わせてシザー四角形を使用できます。これは、四角形を手動でレンダリングしてバッファーをゼロに戻すよりもかなり高速です。
  • シェーダーでステンシル情報にアクセスする方法がないため、ポストプロセス エフェクトは、マスクが通常のレンダー ターゲットにあり、テクスチャとしてサンプリングされていないと、隣接するピクセルのステンシル状態を判断できません。
  • ステンシル バッファーの値は、次の条件から変更できます。
    1. ステンシル テストに失敗しました
    2. 深度テストに失敗しました
    3. ステンシル テストとデプス テストの両方に合格
  • どちらの条件が最初であるかに関係なく、アクションが決定されます。
    1. keep (ステンシル値をそのままにしておく)
    2. 置換 (ステンシル値を 'stencilref' 値に置き換えます)
    3. 増分 (現在のバッファに 1 を追加)
    4. デクリメント (ステンシル バッファからサブ 1)
    5. zero (値を直接ゼロに設定します。他の条件のいずれかで現在の stencilref 値を使用する必要がある場合に役立ちます)

*これらのルールのほとんどに従わないと、通常、最悪の場合のステンシル パフォーマンスが発生します。ピクセル シェーダーはすべてのピクセルに対して実行され、ステンシル マスクされたピクセルに対して早期リジェクトが実行されません。さらに、古い Geforce カードでは、これにより、後続のすべての描画呼び出しで初期の深度拒否が中断される可能性があり、次のフレームまたは深度バッファーとステンシルがクリアされるまで修正されません。

ステンシル マスクは、実際には非常に簡単に生成できます。

  • ステンシル バッファをクリアする
  • ステンシル書き込み用のステンシル状態を有効にします (stencilref 1 で「replace」するか、「keep」ではなく「increment」)
  • 多角形を描画します。シェーダーで「破棄」を使用すると、ステンシルが更新されなくなります。これは、テクスチャをステンシル バッファーにロードする方法です (ただし、バイナリ マスクとしてのみ)。

  • ステンシル書き込みを無効にし、ステンシル テストを有効にする

  • (理想的には) 深度書き込みも無効にする
  • ステンシル マスキングが必要なエフェクトを描画する
于 2011-06-20T23:44:59.947 に答える