2012-12-30 72 views
1

我刚开始使用像素着色器与XNA,但我不能换我的头周围几件事情,似乎没有明确的答案的任何地方......使用多个像素着色器?

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

那么,你可以帮我跟随?

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

  • 如果技术有多个传递如何应用所有这些技巧?

  • 如果我已经应用了着色器,我该如何取消它?我可以结束当前的Sprite批处理,然后开始另一个。但我真的不知道这是如何实现最高效率的。

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

回答

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(); 
} 
+0

哦,这是非常深奥的!非常感谢您解释! – NewProger

+0

不客气:) –