ユーザーがシェーダー (.fx HLSL またはアセンブリ ファイル、複数のパスを使用する可能性がありますが、すべてのピクセル シェーダーのみ) を選択してプレビューできるようにする必要がある単純なアプリケーションがあります。
アプリケーションが実行され、シェーダーのリストが表示され、ボタンで「プレビュー ウィンドウ」が起動します。このプレビュー ウィンドウ (DirectX ビューポートを含む) から、ユーザーが画像を選択すると、その画像に対してシェーダーが実行されて表示されます。1 つのフレームのみをレンダリングする必要があります (リアルタイムではありません)。
クワッドを取得して画面にレンダリングし、選択した画像でテクスチャリングする頂点/ピクセル シェーダーの組み合わせをセットアップしました。これは完全に機能します。次に、最初の効果からの出力に対して別の効果 (純粋なピクセル シェーダー) を実行し、最終的な画像 (後処理) を画面に表示する必要があります。これはまったく機能しません。
過去数日間、それを機能させようとしましたが、明らかな理由もなく、各エフェクトのレンダリングに使用される同一のコード ブロックは最初のエフェクトのみをレンダリングします。最初のシェーダー ファイルの 2 番目のパスとして 2 番目のシェーダー ファイルを追加すると、完全に実行されます (ただし、ユーザーが作成したシェーダーをプレビューするという私の目標は完全に無効になります)。2 番目のエフェクト (正常にロードおよびコンパイルされる) を使用しようとすると、何も実行されません。最初のシェーダーの結果を (GetRenderTargetData を使用して) 取得し、それらをテクスチャとサーフェス (destTex および destSur) に配置し、そのテクスチャを 2 番目のパスの入力として設定しました (dev->SetTexture を使用し、後で effect-> を使用します)。 SetTexture("thisframe", destTex))。
すべての呼び出しが成功し、エフェクトがコンパイルされ、テクスチャがロードされ、四角形が描画されますが、エフェクトは表示されません。最初はデバイス (ソフトウェア頂点処理で作成) が問題の原因ではないかと疑っていましたが、そうではないようです (ハードウェアと混合で試しました)。さらに、HAL デバイスと REF デバイスの両方を使用すると (アプリはリアルタイムではないので問題ありません)、その 2 番目のシェーダーは表示されません。すべてが Direct3D 9 用の C++ で記述されています。