次の方法で共有


Two-Sided ステンシル (Direct3D 9)

シャドウ ボリュームは、ステンシル バッファーを使用してシャドウを描画するために使用されます。 アプリケーションは、シルエットエッジを計算し、光から離れて3Dボリュームのセットに押し出すことによって、ジオメトリを隠すことによって投影されたシャドウボリュームを計算します。 その後、これらのボリュームはステンシル バッファーに 2 回レンダリングされます。

最初のレンダリングでは、前方向きの多角形が描画され、ステンシル バッファーの値がインクリメントされます。 2 番目のレンダーは、シャドウ ボリュームの背面のポリゴンを描画し、ステンシル バッファー値をデクリメントします。 通常、インクリメントされた値とデクリメントされた値はすべて、互いに取り消されます。ただし、シーンは既に通常のジオメトリでレンダリングされているため、シャドウ ボリュームがレンダリングされるときに、一部のピクセルが z バッファー テストに失敗します。 ステンシル バッファーに残っている値は、シャドウ内のピクセルに対応します。 これらの残りのステンシル バッファー の内容はマスクとして使用され、大きく、すべてを含む黒いクワッドをシーンにアルファ ブレンドします。 ステンシル バッファーがマスクとして機能すると、シャドウ内のピクセルが暗くなります。

つまり、シャドウ ジオメトリは光源ごとに 2 回描画されるため、GPU の頂点スループットが低下します。 両面ステンシル機能は、この状況を軽減するように設計されています。 この方法では、ステンシル状態の 2 つのセット (下の名前) があり、1 つは前面の三角形にそれぞれ設定され、もう 1 つは背面の三角形に対して設定されます。 この方法では、シャドウ ボリュームごとに、ライトごとに 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 fn を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_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

ステンシル バッファー手法の

D3DRENDERSTATETYPE