1

xnaでピクセルシェーダーを使い始めたばかりですが、頭を包むことができず、明確な答えがどこにもないようです...

使用spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);していて、描画している特定のスプライトにシェーダーを適用してから、キャンセルしてデフォルトのシェーダーに戻すか、シェーダーを使用しないようにします。

それで、あなたは私がフォローするのを手伝ってくれますか?

  • エフェクトファイルにいくつかのテクニックがある場合、特定のテクニックを呼び出すにはどうすればよいですか?なぜなら、現時点で私がしていることは次のとおりshaders.CurrentTechnique.Passes[0].Apply();です。1つのテクニックで機能しますが、多くのテクニックが必要です。

  • テクニックに複数のパスがある場合、それらすべてをどのように適用しますか?

  • すでにシェーダーを適用している場合、どうすればキャンセルできますか?もちろん、現在のスプライトバッチを終了して、別のバッチを開始することもできます。しかし、それが最も効率的に行われるべき方法であるかどうかは本当にわかりません。

ピクセルシェーダーを操作するための他のヒントはありますか?

4

1 に答える 1

3

次のように、エフェクトファイルでさまざまなテクニックを定義できます。

// shading code ...

technique Technique1
{
    pass Pass1
    {
        // VertexShader = ...
        // PixelShader = ...
    }

    pass Pass2
    {
        // VertexShader = ...
        // PixelShader = ...
    }

    // more passes if you want
}

technique Technique2
{
    pass Pass1
    {
        // VertexShader = ...
        // PixelShader = ...
    }

    // more Passes if you want ...
}

C#コードから、エフェクトファイルを次のように使用します。

// declar your variable by loading the effect file from the content pipeline
Effect effect = ContentManager.Load<Effect>("NameOfMyEffectFile");

// use a particular technique
effect.CurrentTechnique = effect.Techniques["Technique1"];

// apply a particular pass
effect.CurrentTechnique.Passes[1].Apply();

// begin some drawing
effect.Begin();

// draw ...

// end some drawing
effect.End();

複数のパスを適用する場合は、次のようにすべてのパスを繰り返し処理します。

foreach(EffectPass p in effect.CurrentTechnique.Passes)
{
    // begin some drawing
    p.Begin();

    // draw ...

    // end some drawing
    p.End();
}
于 2012-12-30T12:02:59.870 に答える