如何在XNA中使用多个通道制作像素着色器?

时间:2013-02-23 22:01:56

标签: xna shader

我对着色器非常新,并且对整个事情感到非常困惑,即使在完成了几个教程之后(实际上这是我今天关于着色器的第二个问题)。

我正试图通过两次传递制作着色器:

technique Technique1  
{  
    pass Pass1
    {  
        PixelShader = compile ps_2_0 HorizontalBlur();  
    }  

    pass Pass2
    {  
        PixelShader = compile ps_2_0 VerticalBlur();  
    }
}

但是,这仅适用于VerticalBlur()。如果我删除Pass2,它将回退到Pass1中的Horizo​​ntalBlur()。我错过了什么吗?也许它只是没有将第一遍的结果传递给第二遍,在这种情况下我该怎么做?

另外,在我读过的大多数教程中,我被告知在我开始使用效果后的spritebatch之后放effect.CurrentTechnique.Passes[0].Apply();。但是,这似乎没有改变任何东西;我可以将它设置为Passes [1]甚至完全删除它,我仍然只获得Pass2。 (但是当我尝试将它设置为Passes [2]时,我确实会收到错误。)那么该行的用途是什么?是否需要在最近的版本中删除它?

非常感谢!

2 个答案:

答案 0 :(得分:2)

以下原因

effect.CurrentTechnique.Passes[0].Apply(); 

是许多效果只有一次通过。

要运行多个通行证,我认为你必须这样做:

foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
    pass.Apply();

    //Your draw code here:

}

答案 1 :(得分:2)

渲染多次传递:

对于第一遍,将场景渲染到纹理上。

对于第二,第三,第四等传球:

  • 绘制一个使用上一遍纹理的四边形。如果要传递更多传球,则将此传递渲染到另一个纹理,否则如果这是最后一次传递,则将其渲染到后缓冲区。

在您的示例中,假设您正在渲染汽车。

  • 首先将汽车渲染为纹理。

  • 然后绘制一个大矩形,屏幕大小,以像素为单位,放置在az深度为0.5,带有标识世界,视图和投影矩阵,并将您的汽车场景作为纹理,并应用水平模糊传球。这将渲染为一个新的纹理,现在有一个水平模糊的汽车。

  • 最后,渲染相同的矩形,但使用“水平钻孔的汽车”纹理,并应用垂直模糊传递。将其渲染到后台缓冲区。你现在画了一个模糊的汽车场景。