質問
私は、ユーザーがシェーダ(FreeBSDのHLSLまたはアセンブリファイル、おそらく複数のパスを持つが、すべてのみピクセルシェーダ)を選択し、それをプレビューできるようにする必要のあるシンプルなアプリケーションを持っています。
アプリケーションを実行すると、シェーダのリストがアップし、そしてボタンが起動し、「プレビューウィンドウを。」 (その中のDirectXビューポートを持っている)、このプレビューウィンドウから、ユーザーが画像を選択し、シェーダはその画像上で実行されて表示されます。一つだけフレームニーズ(ないリアルタイム)レンダリングされます。
Iは、選択された画像とテクスチャクワッドを取り、画面にそれをレンダリング設定頂点/ピクセルシェーダの組み合わせを有します。これは完璧に動作します。 Iは、第1のエフェクトの出力に別の効果、純粋にピクセルシェーダーを実行する必要があり、スクリーンに最終画像(後処理)を表示します。これがすべてでは動作しません。
私はそれが働いて得るために、過去数日間試してみたが、明らかな理由もなく、同一のコードブロックは、最初のレンダリング各エフェクトのレンダリングに使用されます。私は最初のシェーダファイルの2番目のパスように、第2のシェーダファイルを追加することができますし、(完全にユーザーが作成したシェーダをプレビューの私の目標に反するが)それは完全に実行されます。私は(うまくコンパイルの負荷と)第二の効果を使用しようとすると、それは何もしません。 私は(GetRenderTargetData有する)第一のシェーダの結果を取り出し、テクスチャ&表面(destTexとdestSur)でそれらを配置した、第2パスの入力としてテクスチャ(使用するように設定DEV-> SetTexture以降effect-> SetTexture( "thisframe"、destTex))。
すべての呼び出しは効果がテクスチャの負荷は、クワッドが描かれ、コンパイルし、その効果は表示されません、成功します。 Iは、第一(ソフトウェア頂点処理で作成された)デバイスが問題を引き起こしたで疑われるが、それは(私はハードウェアと混合してみました)場合であるとは思われません。 (アプリがとにかく、リアルタイムされていないため、問題ではない)また、HAL及びREFデバイスの両方を使用して、その第二のシェーダは見えません。 すべてはDirect3Dの9のためにC ++で書かれています。
解決
あなたはクワッドをレンダリングするたびに後の深さ、ステンシルバッファをクリアしてみます。
他のヒント
まず、直接そのテクスチャに最初のシェーダをレンダリングし、その後、テクスチャを作成します。最終的バックバッファへの入力としてテクスチャを有する第二のシェーダをレンダリングします。
の順序で頂点入力と頂点処理(固定機能やシェーダのいずれか)のいくつかの種類が存在しなければなりません。あなたは頂点シェーダを供給し、あなたはそれがピクセルシェーダが期待する何を確信している場合はありますか?どのようなあなたのドローコールは次のようなものですか?
これは、ユーザーの効果を使用しようとすると、デバイスの状態が何であるかを見るためのアプリのPIXトレースで、おそらく見て価値がある。