Direct3d 9シャドウマッピングブレンドモード
質問
私は現在、Direct3D 9のシーンに影を描画しようとしています。私はいくつかのマルチパスレンダリングを実行しようとしており、ブレンドモードの使用方法/設定を理解するのに苦労しています。
深さバッファーを埋める深度パスを実行しました。その後、シーン内のすべてのライトをループするループがあります。そのループ内には、シーン内のすべての形状をループする2つのループがあります
この種のセットアップがあります
for(number of shapes)
{
//render from camera position and fill depth buffer
}
for(number of lights)
{
for(number of shapes)
{
//render to shadow map
}
for(number of shapes)
{
//render to screen
}
}
PIXでは、各ライトをループすることがわかりますが、実行すると、ライトアレイの最後のライトのみが表示されます。ブレンドモードと関係があると思います。
ブレンドモードを調べて、ソースと宛先のブレンドに関する情報を見つけました。これは私が必要なものですか、誰かがそれを説明するのを手伝ってくれませんか?
前もって感謝します、
マーク
[編集]次のコードを使用して両方のライトが表示されました
hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
影は正しく見えませんが、私は目的の結果に近づいています。
これ以上のアドバイスは素晴らしいでしょう、
ありがとう、
マーク
解決
また、間違ったアルファブレンド状態セットがあると思います。 SRCブレンドを行い、古い画像を新しい画像と交換し、アルファブレンドを行わないと思います。あなたはあなたが望むものについて考える必要があります。 src_overブレンディングが必要だと思います。
ポーターダフ ルールはヒントを与えることができ、DirectXで非常に簡単に実装できます。例として ここ.
編集 もっと注意深く読むべきです。
アルファブレンドとピクセルシェーダーは独立しています。したがって、もちろん、ピクセルシェーダーを使用して、ソースの色値を変更できます。たぶん、いくつかの特別な効果を追加するために、またはあなたが試してみたいものを何でも追加するでしょう。しかし、ソースを目的地にブレンドしたいとすぐに、すべてのピクセルを新しいピクセルに置き換えたくないので、Alphaブレンドを有効にする必要があります。たとえば、このように
hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
このコードは、すべてのソースピクセルにアルファ値とすべての宛先ピクセルを1-source_alphaで掛けます。それらを新しい目的地に結合します。