回答:
ウィキペディアによるステンシルバッファの定義は、実際には素晴らしいものではなく、最新の実装(OpenGL)の詳細に焦点を合わせすぎています。明確なバージョンの方がわかりやすいと思います。
ステンシルは、使用されるたびに同一の文字、記号、形状、またはパターンを描画またはペイントするために使用されるテンプレートです。このようなテンプレートによって作成されたデザインは、ステンシルとも呼ばれます。
それが、コンピューターグラフィックス以前のステンシルの意味です。Google Imagesにステンシルを入力すると、これは最初の結果の1つです。
ご覧のとおり、パターンのネガを何かに「ペイント」するために使用できるのは、単にマスクまたはパターンです。
ステンシルバッファは、まったく同じように動作します。ステンシルレンダーパスを実行することにより、選択したパターンでステンシルバッファを埋めてから、後続の図面でパターンを解釈する方法を定義する適切なステンシル関数を設定し、最終シーンをレンダリングできます。比較機能に従って、ステンシルマスクの拒否された領域に入るピクセルは描画されません。
ステンシルバッファの実装に関しては、実際には深度バッファと結合している場合があります。ほとんどのグラフィックハードウェアは1バイト(8ビット)のステンシルバッファーを使用します。これはほとんどのアプリケーションに十分です。深度バッファは通常、3バイト(24ビット)を使用して実装されます。これも、通常、ほとんどの種類の3Dレンダリングに十分です。したがって、8ビットのステンシルバッファーを他の24の深度バッファーと一緒にパックするだけで、各深度+ステンシルピクセルを32ビット整数に格納できます。それがウィキペディアの意味するところです:
深度バッファとステンシルバッファは、多くの場合、グラフィックスハードウェアのRAMで同じ領域を共有します。
ステンシルバッファがかつてキングだったアプリケーションの1つは、シャドウボリュームと呼ばれる手法でのシャドウレンダリング、またはステンシルシャドウと呼ばれることもありました。これはバッファの非常に巧妙な使用方法でしたが、今日ではほとんどのレンダリングフィールドが深度ベースのシャドウマップにシフトしているようです。
ステンシルバッファーは、現在では通常8ビットの符号なし整数バッファーであり、ステンシルテスト後のさまざまな操作(ここではOpenGL Opsなど)の使用に基づいて、必要に応じてピクセルごとの情報を入力できます。
ステンシルテストは、ピクセルごとの操作であり、現在のピクセルステンシル値がステンシルバッファーの内容に対してテストされます。ステンシルテストに合格する条件を設定します(たとえば、ALWAYS、LESSなど)。
テストの結果に応じて、ステンシル値に何が起こるかを決定できます(OpenGLでは、上記でリンクした操作を使用します)。
ステンシルバッファには多くの用途がありますが、最初に思い浮かぶのは次のとおりです。
過去には、シャドウボリュームなどのシャドウイングテクニックにも使用されていました。
貧弱なステンシルバッファは、しばしばかなり過小評価されますが、グラフィックプログラマの武器庫では良い武器になる可能性があります。
[*]正しいSRVを使用した後処理で読み返される値!
編集:また、Shader Model 5.1(つまりD3D11.3およびD3D12)では、ステンシル参照値にアクセスできることに言及する価値があります。 SV_StencilRef
ステンシルバッファには、ピクセルごとの整数データが含まれています。このデータを使用して、レンダリングするピクセルをさらに制御できます。
ステンシルバッファは、深度バッファと同様に動作します。同様に、そのステンシルデータは深度バッファに格納されます。深度データはカメラに最も近いピクセルを決定しますが、ステンシルデータはピクセルを保存または破棄するためのより汎用的なピクセルごとのマスクとして使用できます。マスクを作成するには、ステンシル関数を使用して、ピクセルがレンダリングされるたびに、参照ステンシル値(グローバル値)をステンシルバッファーの値と比較します。
出典:ステンシルバッファーとは | マイクロソフト開発者ネットワーク
一般的な考え方は、各ピクセルの値を設定してから、操作(設定できることでGREATER
、SMALLER
、EQUAL
trueに評価さは、画素が網掛けして示している場合、など)。
1つのアプリケーションはリアルタイムの反射です。反射テクスチャをレンダリングする場合、ステンシルバッファーを使用して、反射が適用される場所のマスクを作成します。たとえば、ガラス素材の影付き三角形にのみ反射を適用します。フレームバッファ全体に対して任意の2次元マスクを作成するためにも使用できます。
cleaver
->clever
です。編集できませんD:ところで、すばらしい答えです。これは今のところ最も理にかなっています。