ステンシル バッファーStencil buffers

ステンシル バッファーは、画像内のピクセルをマスクし、特殊効果を生成するために使用されます。A stencil buffer is used to mask pixels in an image, to produce special effects. このマスクは、ピクセルを描画するかどうかを制御します。The mask controls whether the pixel is drawn or not. このような特殊効果には、合成、デカール、ディゾルブ、フェード、スワイプ、輪郭とシルエット、両面ステンシルなどがあります。These special effects include compositing; decaling; dissolves, fades, and swipes; outlines and silhouettes; and two-sided stencil. 代表的な効果の一部を次に示します。Some of the more common effects are shown below.

ステンシル バッファーを使用すると、ピクセル単位でレンダー ターゲット サーフェスへの描画を有効にするか無効にするかを制御できます。The stencil buffer enables or disables drawing to the rendering target surface on a pixel-by-pixel basis. 最も基本的なレベルでは、アプリケーションによってレンダリング対象のイメージのセクションをマスクして、表示されないようにすることができます。At its most fundamental level, it enables applications to mask sections of the rendered image so that they are not displayed. アプリケーションでは、しばしば、ディゾルブ、デカール、輪郭などの特殊効果にステンシル バッファーを使用します。Applications often use stencil buffers for special effects such as dissolves, decaling, and outlining.

ステンシル バッファー情報は、z バッファー データに埋め込まれます。Stencil buffer information is embedded in the z-buffer data.

ステンシル バッファーのしくみHow the stencil buffer works

Direct3D は、ステンシル バッファーのコンテンツをピクセル単位でテストします。Direct3D performs a test on the contents of the stencil buffer on a pixel-by-pixel basis. ターゲット サーフェスのピクセルごとに、ステンシル バッファー内の対応する値、ステンシル参照の値、ステンシル マスクの値を使用してテストを実行します。For each pixel in the target surface, it performs a test using the corresponding value in the stencil buffer, a stencil reference value, and a stencil mask value. テストに合格した場合は、Direct3D は操作を実行します。If the test passes, Direct3D performs an action. テストは、次の手順に従って実行されます。The test is performed using the following steps.

  1. ステンシル マスクを使用してステンシル参照値のビット単位の AND 操作を実行します。Perform a bitwise AND operation of the stencil reference value with the stencil mask.
  2. ステンシル マスクを使用して、現在のピクセルに対してステンシル バッファー値のビット単位の AND 操作を実行します。Perform a bitwise AND operation of the stencil buffer value for the current pixel with the stencil mask.
  3. 比較関数を使用して、手順 1 の結果と手順 2 の結果を比較します。Compare the result of step 1 to the result of step 2, using the comparison function.

上記の手順は、次のコードで表されます。The above steps are shown in the following line of code:

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
  • StencilRef はステンシル参照値を表します。StencilRef represents the stencil reference value.
  • StencilMask はステンシル マスクの値を表します。StencilMask represents the value of the stencil mask.
  • CompFunc は、比較関数です。CompFunc is the comparison function.
  • StencilBufferValue は、現在のピクセルのステンシル バッファーのコンテンツです。StencilBufferValue is the contents of the stencil buffer for the current pixel.
  • アンパサンド (&) 記号はビット単位の AND 演算を表します。The ampersand (&) symbol represents the bitwise AND operation.

ステンシルのテストに合格すると、現在のピクセルは、ターゲット サーフェスに書き込まれます。合格しない場合は、無視されます。The current pixel is written to the target surface if the stencil test passes, and is ignored otherwise. 比較の既定の動作では、ビット単位の各演算がどのような結果になっても、ピクセルが書き込まれます。この動作は、列挙型の値を変更して、目的の比較関数を指定することで、変更できます。The default comparison behavior is to write the pixel, no matter how each bitwise operation turns out. You can change this behavior by changing the value of an enumerated type to identify the desired comparison function.

アプリケーションによって、ステンシル バッファーの操作をカスタマイズできます。Your application can customize the operation of the stencil buffer. 比較関数、ステンシル マスク、ステンシル参照値を設定できます。It can set the comparison function, the stencil mask, and the stencil reference value. また、ステンシル テストに合格または不合格になったときに、Direct3D が実行する操作を制御することもできます。It can also control the action that Direct3D takes when the stencil test passes or fails.


ステンシル バッファーを使えば、アプリケーションは 2D または 3D イメージを 3D シーンに合成できます。Your application can use the stencil buffer to composite 2D or 3D images onto a 3D scene. ステンシル バッファーのマスクを使って、レンダー ターゲット サーフェスの領域をオクルードします。A mask in the stencil buffer is used to occlude an area of the rendering target surface. 次に、テキストやビットマップなどの格納 2D 情報をオクルードされた領域に書き込むことができます。Stored 2D information, such as text or bitmaps, can then be written to the occluded area. 別の方法として、アプリケーションでは追加 3D プリミティブをレンダー ターゲット サーフェスのステンシル マスクされた領域にレンダリングできます。Alternately, your application can render additional 3D primitives to the stencil-masked region of the rendering target surface. この場合、シーン全体をレンダリングすることもできます。It can even render an entire scene.

ゲームでは、複数の 3D シーンを合成することがよくあります。Games often composite multiple 3D scenes together. たとえば、ドライビング ゲームでは通常バックミラーを表示します。For instance, driving games typically display a rear-view mirror. バックミラーには、運転者の背後の 3D シーンの表示が含まれます。The mirror contains the view of the 3D scene behind the driver. したがって、バックミラーは、本質的には運転者の前方の風景と合成された 第 2 の 3D シーンと言えます。It is essentially a second 3D scene composited with the driver's forward view.


Direct3D アプリケーションでは、デカールを使用して、レンダー ターゲット サーフェスに描画される特定のプリミティブ イメージのピクセルを制御します。Direct3D applications use decaling to control which pixels from a particular primitive image are drawn to the rendering target surface. アプリケーションはプリミティブのイメージにデカールを適用して、同一平面上のポリゴンを適切にレンダリングできるようにします。Applications apply decals to the images of primitives to enable coplanar polygons to render correctly.

たとえば、道路にタイヤの跡と黄色い線を付ける場合、その跡は道路の上に直接表示する必要があります。For instance, when applying tire marks and yellow lines to a roadway, the markings should appear directly on top of the road. ただし、タイヤ跡と道路の z 値は同一です。However, the z values of the markings and the road are the same. したがって、深度バッファーでは、これら 2 つを明確に分離できない場合があります。Therefore, the depth buffer might not produce a clean separation between the two. 背面のプリミティブの一部のピクセルが前面のプリミティブの手前にレンダリングされたり、その逆になったりする場合があります。Some pixels in the back primitive may be rendered on top of the front primitive and vice versa. 出力されるイメージは、フレームが変わるたびにちらついているように見えます。The resulting image appears to shimmer from frame to frame. この現象は、z ファイティングまたはフリマリングと呼ばれます。This effect is called z-fighting or flimmering.

この問題を解決するには、ステンシルを使用して、デカールが表示される背面プリミティブのセクションをマスクします。To solve this problem, use a stencil to mask the section of the back primitive where the decal will appear. z バッファリングをオフにし、レンダー ターゲット サーフェスのマスク オフされた領域に前面プリミティブのイメージをレンダリングします。Turn off z-buffering and render the image of the front primitive into the masked-off area of the render-target surface.

複数のテクスチャのブレンドを使用することでこの問題を解決できますが、その場合、アプリケーションが生成するその他の特殊効果の数が制限されます。Although multiple texture blending can be used to solve this problem, doing so limits the number of other special effects that your application can produce. ステンシル バッファーを使用してデカールを適用すると、他の効果のテクスチャ ブレンド ステージが不要になります。Using the stencil buffer to apply decals frees up texture blending stages for other effects.

ディゾルブ、フェード、およびカードDissolves, fades, and swipes

ディゾルブ、スワイプ、フェードなど、映画やビデオでよく使用される特殊効果が、ますますアプリケーションでも使用されるようになっています。Increasingly, applications employ special effects that are commonly used in movies and video, such as dissolves, swipes, and fades.

ディゾルブでは、スムーズなフレーム シーケンスで、1 つのイメージが徐々に別のイメージに置き換えられます。In a dissolve, one image is gradually replaced by another in a smooth sequence of frames. Direct3D では複数のテクスチャのブレンドを使用して同じ効果を生む方法が提供していますが、ディゾルブにステンシル バッファーを使用するアプリケーションでは、ディゾルブを使用しながら、他の効果にテクスチャ ブレンド機能を使用できます。Although Direct3D provides methods of using multiple texture blending to achieve the same effect, applications that use the stencil buffer for dissolves can use texture-blending capabilities for other effects while they do a dissolve.

アプリケーションでディゾルブを行うときは、2 つの異なるイメージをレンダリングする必要があります。When your application performs a dissolve, it must render two different images. ステンシル バッファーを使用して、レンダー ターゲット サーフェスに描画される各イメージのピクセルを制御します。It uses the stencil buffer to control which pixels from each image are drawn to the rendering target surface. 一連のステンシル マスクを定義し、後続のフレームのステンシル バッファーにコピーできます。You can define a series of stencil masks and copy them into the stencil buffer on successive frames. または、最初のフレームに基本のステンシル マスクを定義して、徐々にそれを変えていくこともできます。Alternately, you can define a base stencil mask for the first frame and alter it incrementally.

アプリケーションは、ディゾルブを開始するときに、最初のイメージのピクセルのほとんどが、ステンシル テストに合格するように、ステンシル機能とステンシル マスクを設定できます。At the beginning of the dissolve, your application sets the stencil function and stencil mask so that most of the pixels from the starting image pass the stencil test. 最後のイメージのピクセルの大半は、ステンシル テストに不合格になります。Most of the pixels from the ending image should fail the stencil test. 後続のフレームでステンシル マスクは更新されて、テストに合格する最初のイメージのピクセルは徐々に少なくなります。On successive frames, the stencil mask is updated so that fewer and fewer of the pixels in the starting image pass the test. フレームが進むにつれて、テストに不合格になる最後のイメージのピクセルは徐々に少なくなります。As the frames progress, fewer and fewer of the pixels in the ending image fail the test. この方法では、アプリケーションは任意のディゾルブ パターンを使用して、ディゾルブを実行できます。In this manner, your application can perform a dissolve using any arbitrary dissolve pattern.

フェード インやフェード アウトは、ディゾルブの特殊なケースです。Fading in or fading out is a special case of dissolving. フェード インでは、ステンシル バッファーを使用して黒または白のイメージから 3D シーンのレンダリングへとディゾルブします。When fading in, the stencil buffer is used to dissolve from a black or white image to a rendering of a 3D scene. フェード アウトは反対に、3D シーンのレンダリングから始めて、黒または白のイメージにディゾルブします。Fading out is the opposite, your application starts with a rendering of a 3D scene and dissolves to black or white. フェードは、利用したい任意のパターンを使用して実現できます。The fade can be done using any arbitrary pattern you want to employ.

Direct3D アプリケーションでは、スワイプに同様の手法を使用します。Direct3D applications use a similar technique for swipes. たとえば、アプリケーションが左から右へのスワイプを実行する場合、最初のイメージの上に最後のイメージが左から右にスライドする形で表示されます。For example, when an application performs a left-to-right swipe, the ending image appears to slide gradually on top of the starting image from left to right. ディゾルブと同様に、後続のフレームでステンシル バッファーに読み込まれる一連のステンシル マスクを定義するか、最初のステンシル マスクを順次変更します。As in a dissolve, you must define a series of stencil masks that are loaded into the stencil buffer on successive frames, or successively modify the starting stencil mask. ステンシル マスクは、最初のイメージのピクセルの書き込みを無効にし、最後のイメージのピクセルの書き込みを有効にするために使用されます。The stencil masks are used to disable the writing of pixels from the starting image and to enable the writing of pixels from the ending image.

スワイプは、ディゾルブよりもやや複雑で、アプリケーションがスワイプの逆の順序で最後のイメージのピクセルを読み取る必要があります。A swipe is somewhat more complex than a dissolve in that your application must read pixels from the ending image in the reverse order of the swipe. つまり、スワイプが左から右に移動する場合、アプリケーションは最初のイメージのピクセルを右から左に読み取る必要があります。That is, if the swipe is moving from left to right, your application must read pixels from the ending image from right to left.

シルエット、について概説しますOutlines and silhouettes

輪郭処理やシルエット処理など、より抽象的なエフェクトにステンシル バッファーを使用することができます。You can use the stencil buffer for more abstract effects, such as outlining and silhouetting.

アプリケーションがステンシル マスクを形状は同じでもやや小さいプリミティブのイメージに適用する場合、結果のイメージにはプリミティブの輪郭しか含まれません。If your application applies a stencil mask to the image of a primitive that is the same shape but slightly smaller, the resulting image contains only the primitive's outline. その場合、ステンシルでマスクされたイメージの領域を単色で塗りつぶすことで、プリミティブが浮き上がって見えるようにすることができます。The application can then fill the stencil-masked area of the image with a solid color, giving the primitive an embossed look.

ステンシル マスクが、レンダリングするプリミティブと同じサイズおよび形状の場合、出力されるイメージではプリミティブの位置が穴になります。If the stencil mask is the same size and shape as the primitive you are rendering, the resulting image contains a hole where the primitive should be. その場合、穴を黒で塗りつぶすことで、プリミティブのシルエットを作成できます。Your application can then fill the hole with black to produce a silhouette of the primitive.

両面のステンシルTwo-sided stencil

シャドウ ボリュームは、ステンシル バッファーで影を描画するために使用します。Shadow Volumes are used for drawing shadows with the stencil buffer. オクルーディング ジオメトリによってキャストされたシャドウ ボリュームは、シルエットの縁を計算し、ライトと反対側の 3D ボリューム セットに押し出すことによって計算されます。The application computes the shadow volumes cast by occluding geometry, by computing the silhouette edges and extruding them away from the light into a set of 3D volumes. これらのボリュームはその後、ステンシル バッファーに 2 回レンダリングされます。These volumes are then rendered twice into the stencil buffer.

最初のレンダリングでは、前向きのポリゴンが描画され、ステンシル バッファーの値が増加します。The first render draws forward-facing polygons, and increments the stencil-buffer values. 2 回目のレンダリングでは、シャドウ ボリュームの後ろ向きのポリゴンが描画され、ステンシル バッファーの値が減少します。The second render draws the back-facing polygons of the shadow volume, and decrements the stencil buffer values. 通常、増加したり減少したりする値はすべて、他方がない場合はキャンセルされます。ただし、通常のジオメトリでシーンが既にレンダリングされているため、シャドウ ボリュームがレンダリングされるときに、ピクセルのいくつかが Z バッファー テストで不合格になります。Normally, all incremented and decremented values cancel each other out. However, the scene was already rendered with normal geometry causing some pixels to fail the z-buffer test as the shadow volume is rendered. ステンシル バッファーに残された値は、シャドウのピクセルに対応します。Values left in the stencil buffer correspond to pixels that are in the shadow. ステンシル バッファーの残りの内容は、すべてを覆う大きな黒のクワッドをシーンにアルファ ブレンディングするために、マスクとして使用されます。These remaining stencil-buffer contents are used as a mask, to alpha-blend a large, all-encompassing black quad into the scene. マスクとして機能するステンシル バッファーを使用すると、シャドウ内のピクセルが暗くなります。With the stencil buffer acting as a mask, the result is to darken pixels that are in the shadows.

これは、シャドウ ジオメトリが光源ごとに 2 回描画されることを意味するため、GPU の頂点処理のスループットに影響します。This means that the shadow geometry is drawn twice per light source, hence putting pressure on the vertex throughput of the GPU. 2 面ステンシル機能は、この状況を軽減することを目的として設計されています。The two-sided stencil feature has been designed to mitigate this situation. この方法には、(次の) 2 組のステンシル ステートがあります。一方は前向きの三角形のそれぞれに設定され、もう一方は後ろ向きの三角形に設定されます。In this approach, there are two sets of stencil state (named below), one set each for the front-facing triangles and the other for the back-facing triangles. このようにして、光源ごとにシャドウ ボリューム単位で 1 つのパスのみが描画されます。This way, only a single pass is drawn per shadow volume, per light.

関連トピックRelated topics

深度バッファーとステンシル バッファーDepth and stencil buffers