我对着色器非常新,并且对整个事情感到非常困惑,即使在完成了几个教程之后(实际上这是我今天关于着色器的第二个问题)。
我正试图通过两次传递制作着色器:
technique Technique1
{
pass Pass1
{
PixelShader = compile ps_2_0 HorizontalBlur();
}
pass Pass2
{
PixelShader = compile ps_2_0 VerticalBlur();
}
}
但是,这仅适用于VerticalBlur()。如果我删除Pass2,它将回退到Pass1中的HorizontalBlur()。我错过了什么吗?也许它只是没有将第一遍的结果传递给第二遍,在这种情况下我该怎么做?
另外,在我读过的大多数教程中,我被告知在我开始使用效果后的spritebatch之后放effect.CurrentTechnique.Passes[0].Apply();
。但是,这似乎没有改变任何东西;我可以将它设置为Passes [1]甚至完全删除它,我仍然只获得Pass2。 (但是当我尝试将它设置为Passes [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,带有标识世界,视图和投影矩阵,并将您的汽车场景作为纹理,并应用水平模糊传球。这将渲染为一个新的纹理,现在有一个水平模糊的汽车。
最后,渲染相同的矩形,但使用“水平钻孔的汽车”纹理,并应用垂直模糊传递。将其渲染到后台缓冲区。你现在画了一个模糊的汽车场景。