XNA Shader编程教程23 – 模糊
原文地址:http://digierr.spaces.live.com/blog/cns!2B7007E9EC2AE37B!855.entry。

本教程将要实现一个简单的模糊,它是一个后期处理shader,可以对任意给定纹理进行模糊处理。
实现Shader
要模糊一个场景,我们需要实现一个新的后期处理shader,它会获取一个像素的临近像素颜色的平均值,并将这个颜色作为最终颜色返回。模糊shader会使用一个距离变量调整包含场景的查询纹理的坐标,它会提取当前像素的左上、右上、左下和右下的像素,相加并除以4,这样就获得了它们的平均值。
上图中我们可以看到实际的模糊效果。这个shader根据给定距离(本例中为0.002)计算了周围像素的平均值,而这个距离可以在shader中或程序中设定。 下图显示了模糊效果:

下面的代码查询当前处理的像素的周围像素。
Color = tex2D( ColorMapSampler, float2(Tex.x+BlurDistance, Tex.y+BlurDistance)); Color += tex2D( ColorMapSampler, float2(Tex.x-BlurDistance, Tex.y-BlurDistance)); Color += tex2D( ColorMapSampler, float2(Tex.x+BlurDistance, Tex.y-BlurDistance)); Color += tex2D( ColorMapSampler, float2(Tex.x-BlurDistance, Tex.y+BlurDistance));
我们只是简单地获取周围像素的颜色并将它们添加到最终颜色中。然后,我们需要将这个颜色除以4以获得平均颜色。
Color = Color / 4;
下面是effect文件的完整代码:
// The blur amount( how far away from our texel will we look up neighbour texels? )
float BlurDistance = 0.002f;
// This will use the texture bound to the object( like from the sprite batch ).
sampler ColorMapSampler : register(s0);
float4 PixelShader(float2 Tex: TEXCOORD0) : COLOR
{
float4 Color;
// Get the texel from ColorMapSampler using a modified texture coordinate. This
// gets the texels at the neighbour texels and adds it to Color.
Color = tex2D( ColorMapSampler, float2(Tex.x+BlurDistance, Tex.y+BlurDistance));
Color += tex2D( ColorMapSampler, float2(Tex.x-BlurDistance, Tex.y-BlurDistance));
Color += tex2D( ColorMapSampler, float2(Tex.x+BlurDistance, Tex.y-BlurDistance));
Color += tex2D( ColorMapSampler, float2(Tex.x-BlurDistance, Tex.y+BlurDistance));
// We need to devide the color with the amount of times we added
// a color to it, in this case 4, to get the avg. color
Color = Color / 4;
if(Tex.x > 0.495 && Tex.x < 0.505)
{
Color = float4(1,0,0,0);
}
if(Tex.x > 0.5)
{
Color = tex2D( ColorMapSampler, float2(Tex.x, Tex.y));
}
// returned the blurred color
return Color;
}
technique PostProcess
{
pass P0
{
// A post process shader only needs a pixel shader.
PixelShader = compile ps_2_0 PixelShader();
}
}
这是一个非常简单的模糊效果,你还可以使用这个shader对纹理进行多次模糊处理让效果更好。我在这个程序中添加了一条竖线,线的左边是模糊过的场景,右边是原始场景。
这个shader的效果不是很漂亮,以后我会写一个高斯模糊的教程,如果你想使用这个shader获得更好的效果,可以对场景模糊多次。
文件下载(已下载 1939 次)发布时间:2010/6/25 下午12:05:03 阅读次数:9797
