Two-Sided ステンシル (Direct3D 9)
シャドウ ボリュームは、ステンシル バッファーで影を描画するために使用します。 オクルーディング ジオメトリによってキャストされたシャドウ ボリュームは、シルエットの縁を計算し、ライトと反対側の 3D ボリューム セットに押し出すことによって計算されます。 これらのボリュームはその後、ステンシル バッファーに 2 回レンダリングされます。
最初のレンダリングでは、前向きのポリゴンが描画され、ステンシル バッファーの値が増加します。 2 回目のレンダリングでは、シャドウ ボリュームの後ろ向きのポリゴンが描画され、ステンシル バッファーの値が減少します。 通常、値の増減は、互いに相殺になります。ただし、通常のジオメトリでシーンが既にレンダリングされているため、シャドウ ボリュームがレンダリングされるときに、ピクセルのいくつかが Z バッファー テストで不合格になります。 ステンシル バッファーに残された値は、シャドウのピクセルに対応します。 ステンシル バッファーの残りの内容は、すべてを覆う大きな黒のクワッドをシーンにアルファ ブレンディングするために、マスクとして使用されます。 マスクとして機能するステンシル バッファーを使用すると、シャドウ内のピクセルが暗くなります。
これは、シャドウ ジオメトリが光源ごとに 2 回描画されることを意味するため、GPU の頂点処理のスループットに影響します。 2 面ステンシル機能は、この状況を軽減することを目的として設計されています。 この方法には、(次の) 2 組のステンシル ステートがあります。一方は前向きの三角形のそれぞれに設定され、もう一方は後ろ向きの三角形に設定されます。 このようにして、光源ごとにシャドウ ボリューム単位で 1 つのパスのみが描画されます。
API の変更は、新しいレンダリング状態のセットに制限されます。 新しいレンダリング状態D3DRS_Two_Sided_StencilMODEは TRUE または FALSE に設定できます。 既定では FALSE であり、現在の (DirectX 8) 動作を意味します。 これが TRUE に設定されている場合 (D3DSTENCILCAPS_TWOSIDEDが設定されている場合にのみ機能します)、次のレンダリング状態は、前面 (時計回り) の三角形にのみ適用されます。
レンダリングの状態 | 説明 |
---|---|
D3DRS_STENCILFAIL | ステンシル テストが失敗した場合に実行する D3DSTENCILOP。 |
D3DRS_STENCILZFAIL | ステンシル テストに合格し、z テストが失敗した場合に実行する D3DSTENCILOP。 |
D3DRS_STENCILPASS | ステンシルテストと z テストの両方に合格した場合に実行する D3DSTENCILOP。 |
D3DRS_STENCILFUNC | D3DCMPFUNC fn。 ステンシル テストは、((ref & mask) ステンシルfn (ステンシル & マスク)) が true の場合に合格します。 |
レンダリング状態の新しいセットは、背面 (反時計回り) の三角形に適用されます。
レンダリングの状態 | 説明 |
---|---|
D3DRS_CCW_STENCILFAIL | ステンシル テストが失敗した場合に実行する D3DSTENCILOP。 |
D3DRS_CCW_STENCILZFAIL | ステンシル テストに合格し、z テストが失敗した場合に実行する D3DSTENCILOP。 |
D3DRS_CCW_STENCILPASS | ステンシルテストと z テストの両方に合格した場合に実行する D3DSTENCILOP。 |
D3DRS_CCW_STENCILFUNC | D3DCMPFUNC 関数。 ステンシル テストは、((ref & mask) stencilfn (ステンシル & マスク)) が true の場合に合格します。 |
残りのステンシル レンダリング状態は、常に時計回りと反時計回りの両方の三角形に適用されます。
D3DRS_Two_Sided_StencilMODEは、行とポイント スプライトでは無視されます。つまり、動作は DirectX 8 から変更されません。 D3DRS_CCW_STENCIL* レンダリング状態は無視されます。
新しいキャップ ビットは、デバイスがこの機能をサポートしているかどうかを示します。 この機能をサポートしていないドライバーは、これらの新しいレンダリング状態を無視する必要があります。 他のすべてのステンシル キャップ ビットは、ステンシル バッファリングの両方のモードに適用されます。 Two_Sided_Stencilは、D3DCULLMODE_NONEセットで描画する機能を意味するため、この新しいステンシル モードをサポートしている場合は、対応するキャップをドライバーによって設定する必要があります。 Microsoft Windows Hardware Quality Labs (WHQL) では、これを適用する必要があります。
新しいレンダリング状態:
D3DRS_Two_Sided_StencilMODE // 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
関連トピック