1

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

我正在尝试用两个通道制作一个着色器:

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

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

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

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

非常感谢!

4

2 回答 2

2

以下原因

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

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

要运行多次传递,我认为您必须这样做:

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

    //Your draw code here:

}
于 2013-02-23T22:27:06.540 回答
2

渲染多个通道:

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

对于第二、第三、第四等通道:

  • 绘制一个使用上一遍纹理的四边形。如果还有更多通道,则将其渲染到另一个纹理,否则如果这是最后一个通道,则将其渲染到后台缓冲区。

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

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

  • 然后绘制一个大矩形,屏幕大小(以像素为单位),放置在 0.5 的 z 深度,具有身份世界、视图和投影矩阵,并以您的汽车场景作为纹理,并应用水平模糊通道。这被渲染到一个新的纹理,现在有一个水平模糊的汽车。

  • 最后,使用“水平毛刺汽车”纹理渲染相同的矩形,并应用垂直模糊通道。将此渲染到后台缓冲区。您现在已经绘制了一个模糊的汽车场景。

于 2013-02-25T19:55:13.490 回答