ステンシルバッファーとは


26

ウィキペディアで、ステンシルバッファーはシェーダーが使用できる任意のバッファーであると述べています。

ただし、クリッピングや、深度バッファーとピクセルバッファーの "緊密なバインド"に使用されていることを示唆しており、わずかに矛盾しています。

ステンシルバッファーは実際に何をしますか。また、現代のアプリケーションで実際にどのように使用されていますか

回答:


31

ウィキペディアによるステンシルバッファの定義は、実際には素晴らしいものではなく、最新の実装(OpenGL)の詳細に焦点を合わせすぎています。明確なバージョンの方がわかりやすいと思います。

ステンシルは、使用されるたびに同一の文字、記号、形状、またはパターンを描画またはペイントするために使用されるテンプレートです。このようなテンプレートによって作成されたデザインは、ステンシルとも呼ばれます。

それが、コンピューターグラフィックス以前のステンシルの意味です。Google Imagesにステンシルを入力すると、これは最初の結果の1つです。

ステンシルマスク

ご覧のとおり、パターンのネガを何かに「ペイント」するために使用できるのは、単にマスクまたはパターンです。

ステンシルバッファは、まったく同じように動作します。ステンシルレンダーパスを実行することにより、選択したパターンでステンシルバッファを埋めてから、後続の図面でパターンを解釈する方法を定義する適切なステンシル関数を設定し、最終シーンをレンダリングできます。比較機能に従って、ステンシルマスクの拒否された領域に入るピクセルは描画されません。


ステンシルバッファの実装に関しては、実際には深度バッファと結合している場合があります。ほとんどのグラフィックハードウェアは1バイト(8ビット)のステンシルバッファーを使用します。これはほとんどのアプリケーションに十分です。深度バッファは通常、3バイト(24ビット)を使用して実装されます。これも、通常、ほとんどの種類の3Dレンダリングに十分です。したがって、8ビットのステンシルバッファーを他の24の深度バッファーと一緒にパックするだけで、各深度+ステンシルピクセルを32ビット整数に格納できます。それがウィキペディアの意味するところです:

深度バッファとステンシルバッファは、多くの場合、グラフィックスハードウェアのRAMで同じ領域を共有します。


ステンシルバッファがかつてキングだったアプリケーションの1つは、シャドウボリュームと呼ばれる手法でのシャドウレンダリング、またはステンシルシャドウと呼ばれることもありました。これはバッファの非常に巧妙な使用方法でしたが、今日ではほとんどのレンダリングフィールドが深度ベースのシャドウマップにシフトしているようです。


1文字ですが、cleaver-> cleverです。編集できませんD:ところで、すばらしい答えです。これは今のところ最も理にかなっています。
Qix

3
高価なピクセルごとのシェーダーがある場合は、ステンシルバッファーを使用して同様のスレッドをバッチ処理することもできます。このOITのセクション2.6のように、発散を減らし占有率を高めることができます(免責事項:私は著者です)。
jozxyqk

@jozxyqk、それはすぐそこに考えているいくつかの外側です!非常に素晴らしい。
-glampert

13

ステンシルバッファーは、現在では通常8ビットの符号なし整数バッファーであり、ステンシルテスト後のさまざまな操作(ここではOpenGL Opsなど)の使用に基づいて、必要に応じてピクセルごとの情報を入力できます。

ステンシルテストは、ピクセルごとの操作であり、現在のピクセルステンシル値がステンシルバッファーの内容に対してテストされます。ステンシルテストに合格する条件を設定します(たとえば、ALWAYS、LESSなど)。

テストの結果に応じて、ステンシル値に何が起こるかを決定できます(OpenGLでは、上記でリンクした操作を使用します)。

ステンシルバッファには多くの用途がありますが、最初に思い浮かぶのは次のとおりです。

  • フレームバッファの特定の部分を選択的にレンダリングし、残りを破棄するマスクとして使用できます。たとえば、これは反射に役立ちますが、さらに多くのことにも役立ちます。複数の解像度のレンダリングを処理する場合、高解像度でレンダリングする必要があるエッジをマークアップするために使用できます。マスキングの使い方は本当にたくさんあります。
  • たとえば、非常に単純なオーバードローフィルター。ステンシルテストを設定して、常にパスし、常に値をインクリメントすることができます。ステンシルバッファーで終わる値は、オーバードローを表します。[*]

過去には、シャドウボリュームなどのシャドウイングテクニックにも使用されていました。

貧弱なステンシルバッファは、しばしばかなり過小評価されますが、グラフィックプログラマの武器庫では良い武器になる可能性があります。

[*]正しいSRVを使用した後処理で読み返される値!

編集:また、Shader Model 5.1(つまりD3D11.3およびD3D12)では、ステンシル参照値にアクセスできることに言及する価値があります。 SV_StencilRef


6

ステンシルバッファには、ピクセルごとの整数データが​​含まれています。このデータを使用して、レンダリングするピクセルをさらに制御できます。

ステンシルバッファは、深度バッファと同様に動作します。同様に、そのステンシルデータは深度バッファに格納されます。深度データはカメラに最も近いピクセルを決定しますが、ステンシルデータはピクセルを保存または破棄するためのより汎用的なピクセルごとのマスクとして使用できます。マスクを作成するには、ステンシル関数を使用して、ピクセルがレンダリングされるたびに、参照ステンシル値(グローバル値)をステンシルバッファーの値と比較します。

出典:ステンシルバッファーとは | マイクロソフト開発者ネットワーク

一般的な考え方は、各ピクセルの値を設定してから、操作(設定できることでGREATERSMALLEREQUALtrueに評価さは、画素が網掛けして示している場合、など)。

1つのアプリケーションはリアルタイムの反射です。反射テクスチャをレンダリングする場合、ステンシルバッファーを使用して、反射が適用される場所のマスクを作成します。たとえば、ガラス素材の影付き三角形にのみ反射を適用します。フレームバッファ全体に対して任意の2次元マスクを作成するためにも使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.