0

現在、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);

影は正しく見えませんが、目的の結果に近づいています。

これ以上のアドバイスは素晴らしいでしょう、

ありがとう、

マーク

4

1 に答える 1

1

また、アルファブレンド状態が間違って設定されていると思います。SRCブレンドを実行し、古い画像を新しい画像に置き換え、アルファブレンドを実行しないことを前提としています。あなたはあなたが欲しいものについて考える必要があります。SRC_OVERブレンディングが必要だと思います。Porter Duff
ルール はヒントを与えることができ、directXでの実装は非常に簡単です。例については、こちらをご覧ください。[編集]もっと注意深く読む必要があります。

アルファブレンディングとピクセルシェーダーは独立しています。したがって、もちろん、ピクセルシェーダーを使用して、ソースのカラー値を変更できます。たぶん、いくつかの特殊効果やあなたが試したいものを追加するために。ただし、ソースをデスティネーション上でブレンドしたいが、すべてのピクセルを新しいピクセルに置き換えたくない場合は、アルファブレンディングを有効にする必要があります。例:このように

hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

このコードは、すべてのソースピクセルにアルファ値を乗算し、すべての宛先ピクセルに1-source_alphaを乗算します。そして、それらを新しい目的地に結合します。

于 2011-05-05T11:54:55.653 に答える