【问题标题】:Use multiple pixel shaders?使用多个像素着色器?
【发布时间】:2012-12-14 22:21:54
【问题描述】:

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

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

那么,你能帮我关注一下吗?

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

  • 如果技术有多个通道,我该如何应用所有通道?

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

关于使用像素着色器的任何其他提示?

【问题讨论】:

    标签: c# xna shader effect


    【解决方案1】:

    您可以像这样在效果文件中定义不同的技术:

    // 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-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    相关资源
    最近更新 更多