1

我刚开始使用带有 xna 的像素着色器,但我无法理解几件事,而且似乎在任何地方都没有明确的答案......

我使用spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);并且我想将着色器应用于我正在绘制的特定精灵,然后将其取消回默认着色器或无着色器。

那么,你能帮我关注吗?

  • 如果我在效果文件中有几种技术 - 我如何调用特定的技术?因为目前我所做的是:shaders.CurrentTechnique.Passes[0].Apply();它适用于一种技术,但我想拥有很多。

  • 如果技术有几次通过,我如何应用所有这些?

  • 如果我已经应用了着色器,我该如何取消它?我当然可以结束当前的精灵批次并开始另一个。但我真的不知道是否应该这样做以提高效率。

还有其他使用像素着色器的技巧吗?

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 回答