1

私はシェーダーに非常に慣れておらず、いくつかのチュートリアルを実行した後でも、全体について非常に混乱しています(実際、これは今日のシェーダーに関する2番目の質問です)。

2つのパスでシェーダーを作成しようとしています:

technique Technique1  
{  
    pass Pass1
    {  
        PixelShader = compile ps_2_0 HorizontalBlur();  
    }  

    pass Pass2
    {  
        PixelShader = compile ps_2_0 VerticalBlur();  
    }
}

ただし、これはVerticalBlur()にのみ適用されます。Pass2を削除すると、Pass1のHorizo​​ntalBlur()にフォールバックします。私は何かが足りないのですか?たぶん、それは単に最初のパスの結果を2番目のパスに渡さないのですが、その場合、どうすればよいでしょうか?

また、私が読んだほとんどのチュートリアルではeffect.CurrentTechnique.Passes[0].Apply();、効果を使ってスプライトバッチを開始した後に置くように言われています。ただし、これは何も変わらないようです。Passes [1]に設定することも、完全に削除することもできますが、それでもPass2しか取得できません。(ただし、Passes [2]に設定しようとするとエラーが発生します。)その場合、その行はどのように使用されますか?最近のバージョンではその必要性がなくなりましたか?

本当にありがとう!

4

2 に答える 2

2

次の理由

effect.CurrentTechnique.Passes[0].Apply(); 

多くのエフェクトにはパスが1つしかないということです。

複数のパスを実行するには、代わりにこれを実行する必要があると思います。

foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
    pass.Apply();

    //Your draw code here:

}
于 2013-02-23T22:27:06.540 に答える
2

複数のパスをレンダリングするには:

最初のパスでは、シーンをテクスチャにレンダリングします。

2番目、3番目、4番目などのパスの場合:

  • 前のパスのテクスチャを使用するクワッドを描画します。さらにパスがある場合は、このパスを別のテクスチャにレンダリングします。それ以外の場合は、これが最後のパスである場合は、バックバッファにレンダリングします。

あなたの例では、車をレンダリングしているとしましょう。

  • まず、車をテクスチャにレンダリングします。

  • 次に、画面のサイズ(ピクセル単位)の大きな長方形を描画し、azの深さ0.5に配置し、アイデンティティワールド、ビュー、および投影マトリックスを使用し、車のシーンをテクスチャとして使用して、水平ブラーパスを適用します。これは、水平方向にぼやけた車を持つ新しいテクスチャにレンダリングされます。

  • 最後に、同じ長方形を「水平方向にバリのある車」のテクスチャでレンダリングし、垂直ブラーパスを適用します。これをバックバッファにレンダリングします。これで、ぼやけた車のシーンが描画されました。

于 2013-02-25T19:55:13.490 に答える