次の方法で共有


両面ステンシル

両面ステンシル

ステンシル バッファを使って影を描画するには、シャドウ ボリュームを使う。アプリケーションは、シルエットのエッジを計算し、そのエッジを光源から押し出して 3D ボリュームを生成することによって、遮蔽ジオメトリによってできるシャドウ ボリュームを計算する。このようなボリュームはステンシル バッファに 2 回レンダリングされる。

最初のレンダリングでは前向きのポリゴンが描画され、ステンシル バッファ値がインクリメントされる。2 回目のレンダリングでは、後ろ向きのポリゴンが描画され、ステンシル バッファ値がデクリメントされる。通常、インクリメントされた値とデクリメントされた値はすべて互いに打ち消し合う。しかし、シーンは既に法線ジオメトリを使ってレンダリングされているので、一部のピクセルはシャドウ ボリュームをレンダリングするときに Z バッファ テストに合格しない。ステンシル バッファに残った値が、影の中のピクセルに対応する。すべてを含む大きな四角形をシーンにアルファ ブレンディングするときに、この残ったステンシル バッファの内容がマスクとして使われる。ステンシル バッファをマスクとして使うと、影の中にあるピクセルが暗くなる。

つまり、影のジオメトリは光源ごとに 2 回描画されるため、GPU の頂点の描画に関するスループットを圧迫する。両面ステンシル機能は、この問題を緩和するために設計された。このアプローチでは、以下に示すステンシル ステートのセットが 2 つ存在する。1 つのセットはそれぞれ前向きの三角形用で、もう 1 つは後ろ向きの三角形用である。これによって、1 つのボリュームと 1 つのライトについて、単一のパスで描画できる。

アプリケーション プログラミング インターフェイス (API) の変更は、新しいレンダリング ステートのセットに制限されている。新しいレンダリング ステート D3DRS_TWOSIDEDSTENCILMODE は TRUE または FALSE に設定できる。デフォルトでは false で、現在の Microsoft® DirectX® 8.x の動作を意味する。これを TRUE に設定すると (D3DSTENCILCAPS_TWOSIDED が設定されている場合のみ機能する)、次のレンダリング ステートは前向きの (時計回りの) 三角形にのみ適用される。

レンダリング ステート 説明
D3DRS_STENCILFAIL ステンシル テストに失敗した場合に実行する D3DSTENCILOP。
D3DRS_STENCILZFAIL ステンシル テストにパスし、Z テストに失敗した場合に実行する D3DSTENCILOP。
D3DRS_STENCILPASS ステンシル テストと Z テストの両方にパスした場合に実行する D3DSTENCILOP。
D3DRS_STENCILFUNC D3DCMPFUNC 関数。ステンシル テストは、((ref & mask) stencilfn (stencil & mask)) が true の場合はパスする。

新しいレンダリング ステートのセットは、後ろ向きの (反時計回りの) 三角形に適用される。

レンダリング ステート 説明
D3DRS_CCW_STENCILFAIL ステンシル テストに失敗した場合に実行する D3DSTENCILOP。
D3DRS_CCW_STENCILZFAIL ステンシル テストにパスし、Z テストに失敗した場合に実行する D3DSTENCILOP。
D3DRS_CCW_STENCILPASS ステンシル テストと Z テストの両方にパスした場合に実行する D3DSTENCILOP。
D3DRS_CCW_STENCILFUNC D3DCMPFUNC 関数。ステンシル テストは、((ref & mask) stencilfn (stencil & mask)) が true の場合はパスする。

残りのステンシル レンダリング ステートは、常に時計回りの三角形と反時計回りの三角形の両方に適用される。

D3DRS_TWOSIDEDSTENCILMODE は、ラインおよびポイント スプライトについては無視される。つまり、その動作は DirectX 8.x から変更されていない。D3DRS_CCW_STENCIL* レンダリング ステートは無視される。

新しい能力ビットは、デバイスがこの機能をサポートしているかどうかを示す。この機能をサポートしていないドライバは、これらの新しいレンダリング ステートを無視するはずである。その他のすべてのステンシル能力ビットは、両方のモードのステンシル バッファリングに適用される。TWOSIDEDSTENCIL は、D3DCULLMODE_NONE を設定して描画する能力を暗示するので、ドライバがこの新しいステンシル モードをサポートしている場合は、ドライバが対応する能力ビットを設定する必要がある。Microsoft Windows® Hardware Quality Labs (WHQL) では、これを要件としている。

新しいレンダリング ステート

    D3DRS_TWOSIDEDSTENCILMODE // BOOL (default is FALSE)
    D3DRS_CCW_STENCILFAIL     // Same default as D3DRS_STENCILFAIL
    D3DRS_CCW_STENCILZFAIL    // Same default as D3DRS_STENCILZFAIL
    D3DRS_CCW_STENCILPASS     // Same default as D3DRS_STENCILPASS
    D3DRS_CCW_STENCILFUNC     // Same default as D3DRS_STENCILFUNC

新しい能力

    D3DSTENCILCAPS_TWOSIDED // a flag on D3DCAPS9.StencilCaps

関連項目