質問

私は現在、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で掛けます。それらを新しい目的地に結合します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top