如何在XNA中创建具有多个过程的像素着色器?

如何在XNA中创建具有多个过程的像素着色器?,xna,shader,Xna,Shader,我对着色器非常陌生,对整个过程非常困惑,即使在完成了几篇教程之后(事实上,这是我今天关于着色器的第二个问题) 我正在尝试使用两个过程制作着色器: technique Technique1 { pass Pass1 { PixelShader = compile ps_2_0 HorizontalBlur(); } pass Pass2 { PixelShader = compile ps_2_0 V

我对着色器非常陌生,对整个过程非常困惑,即使在完成了几篇教程之后(事实上,这是我今天关于着色器的第二个问题)

我正在尝试使用两个过程制作着色器:

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

    pass Pass2
    {  
        PixelShader = compile ps_2_0 VerticalBlur();  
    }
}
但是,这仅适用于VerticalBlur()。如果删除Pass2,它将返回到Pass1中的HorizontalBlur()。我错过什么了吗?也许只是没有把第一次传球的结果传给第二次传球,在这种情况下我该怎么做

此外,在我读过的大多数教程中,我被告知要将
effect.currentTechnical.Passes[0].Apply()在我启动具有此效果的spritebatch之后。然而,这似乎没有改变任何事情;我可以将它设置为pass[1],甚至可以完全删除它,但仍然只能获得Pass2。(但是,当我尝试将其设置为passs[2]时,确实会出现错误。)那么,该行有什么用呢?在最近的版本中是否已删除了对它的需求


非常感谢

以下原因是什么

effect.CurrentTechnique.Passes[0].Apply(); 
很多特效只有一次通过

要运行多个过程,我认为您必须这样做:

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

    //Your draw code here:

}

原因如下:

effect.CurrentTechnique.Passes[0].Apply(); 
很多特效只有一次通过

要运行多个过程,我认为您必须这样做:

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

    //Your draw code here:

}

要渲染多个过程,请执行以下操作:

对于第一个过程,将场景渲染到纹理上

对于第二、第三、第四等通行证:

  • 绘制一个使用上一个过程中的纹理的四边形。如果有更多的过程,则随后将此过程渲染到另一个纹理,否则,如果这是最后一个过程,则将其渲染到后缓冲区
在您的示例中,假设您正在渲染一辆汽车

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

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

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


要渲染多个过程:

对于第一个过程,将场景渲染到纹理上

对于第二、第三、第四等通行证:

  • 绘制一个使用上一个过程中的纹理的四边形。如果有更多的过程,则随后将此过程渲染到另一个纹理,否则,如果这是最后一个过程,则将其渲染到后缓冲区
在您的示例中,假设您正在渲染一辆汽车

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

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

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


@Orteil-你已经达到了我对着色器知识的极限。看起来确实需要在通道上使用循环(如我上面所示)。此外,需要使用渲染目标将结果从一个过程传递到下一个过程。请参见此示例:注意,它使用的是旧版本的XNA,它使用
pass.Begin
pass.End
而不是
pass.Apply
。祝你好运。谢谢你,我看看我能做些什么。“我只是希望我能利用多通道系统来保持它整洁。”Ortil-你已经达到了我对着色器知识的极限。看起来确实需要在通道上使用循环(如我上面所示)。此外,需要使用渲染目标将结果从一个过程传递到下一个过程。请参见此示例:注意,它使用的是旧版本的XNA,它使用
pass.Begin
pass.End
而不是
pass.Apply
。祝你好运。谢谢你,我看看我能做些什么。我只是希望我能利用多重通行系统来保持它整洁。哦,谢谢。是的,我最终就是这么做的。但是,有一个问题,使用不同的过程应用两次着色器与仅应用两个不同的着色器之间有什么区别?据我所知,除了以不同的方式组织着色器之外,没有其他区别。但是,平台支持着色器脚本,您可以在着色器中编写脚本,其中(将pass0渲染到渲染目标,然后将pass1渲染到后台缓冲区)…甚至在for循环中渲染过程,等等。如果您感兴趣,请查看示例着色器。后处理示例中有一个使用脚本的具有多个过程的着色器。哦,谢谢。是的,这就是我最终所做的。但有一个问题,使用不同过程应用两次着色器与仅应用两个dif之间有什么区别不同的着色器?据我所知,除了以不同的方式组织着色器之外,没有什么。但是,平台支持着色器脚本,您可以在着色器中编写脚本(将pass0渲染到渲染目标,然后将pass1渲染到后缓冲区)…甚至在for循环中渲染过程等。如果感兴趣,请查看示例着色器。后处理示例中有一个使用脚本的具有多个过程的着色器。