2012-12-30 109 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

不客氣:) –