1

FX フレームワークを使用して、FX フレームワークを使用してテクスチャをサンプラーにバインドするときに、少し問題が発生しました。

ID3DXEffect->SetTexture(FXShadowtex,Lights->sunlight->ShadowTex)

そのテクスチャがサンプラーにバインドされると、再度レンダリングすることはできません (たとえば、太陽の位置が変わったときなど)。私が行うと、このエラーが発生します:

Direct3D9: (警告) :テクスチャとしても使用されているレンダー ターゲットにはレンダリングできません。レンダー ターゲットがバインドされていることが検出されましたが、レンダリングでテクスチャが実際に使用されたかどうかを検出できませんでした。

ただし、FX フレームワークなどを使用して確実にテクスチャを「設定解除」する方法がわかりません。私はいくつかのことを試しました:

  • ID3DXEffect->SetTexture(FXShadowtex,NULL)。これにより、クラッシュが発生します。
  • ID3DXEffect->SetTexture(FXShadowtex,SomeDummy)。これは本当に醜いです。
  • コンパイル後に fx ファイルで定義されたサンプラーに対応するサンプラー インデックスを見つけ、それを NULL に設定します: IDirect3DDevice9->SetTexture(i,NULL)。これは明らかにあまり実用的ではありません。
  • 警告を忘れてください。これにより、D3D のデバッグ出力が無限のスパムのおかげで役に立たなくなり、非常に見苦しくなります。
  • レンダリングを行う前に、ゼロから fx ファイルで定義されているサンプラーの数までループし、それらをすべて NULL に設定します。これも醜い。

私が忘れている他のアプローチはありますか?上記の「解決策」のいずれかが必要悪である理由を説明することも問題ありません。:)

4

1 に答える 1

2

どのテクスチャ ユニットがそのサンプラー ユニフォームにバインドされているかを確認し (msdn の ID3DXEffect クラスを参照)、IDirect3DDevice9::SetTexture() でテクスチャの設定を解除します。

この場合、この解決策が最も醜くないと思います。ただし、いつでも独自のエフェクト クラスを作成できます (これは非常に簡単です)。

たとえば、D3DXCompileShaderFromFileを使用すると、返された定数テーブルを調べて、 IDirect3DDevice9::SetPixelShaderConstantFで均一な値を設定できます。この場合、行列は列優先に設定されることに注意してください (つまり、シェーダーでベクトルを左から乗算する必要があります)。効果的な解決策は、定数に連続したスペースを割り当て、それらを 1 回の呼び出しで設定することです。

于 2013-01-10T15:46:21.703 に答える