试图使高斯模糊更强/更模糊 - XNA 4.0 HLSL

时间:2012-10-10 16:00:45

标签: xna-4.0 blur hlsl gaussian pixel-shader

我正在尝试在Texture2D上实现高斯模糊,并且在尝试找到任何好的教程等时遇到了麻烦。

我终于设法找到了一个很好的单通道示例代码,它可以明显地模糊图像,但我希望能够使其更加模糊,随着时间的推移变得更模糊,我不会了解高斯模糊如何实现这一点。

我想这肯定与PixelKernel和BlurWeights有关,但我真的不知道这些值是什么/改变它们的作用。

所以我的问题基本上是:

这是在HLSL / XNA中进行高斯模糊的好方法吗?如果是这样,我如何使场景模糊?作为一个额外的奖励,你能指出我对高斯模糊在着色器环境中如何工作的一个很好的解释吗?

感谢您的时间,

TS

P.S。

刚刚实现我应该包含代码:

sampler2D Tex0;

float TintColour;
int TexHeight = 640;
int TexWidth = 480;

const int KernelSize = 7;
float2 PixelKernel[7] = 
{
    {-3, 0},
    {-2, 0},
    {-1, 0},
    {0, 0},
    {1, 0},
    {2, 0},
    {3, 0},
};

const float BlurWeights[7] = 
{
    0.064759,
    0.120985,
    0.176033,
    0.199471,
    0.176033,
    0.120985,
    0.064759,
};

struct VertexShaderOutput
{
    float2 TexCoord0 : TEXCOORD0;
};

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
float4 colour = 0;

float2 TexSize = float2(1.0/TexHeight, 1.0/TexWidth);

for(int p = 0; p < 7; p++)
{
    colour += tex2D(Tex0, input.TexCoord0 + (PixelKernel[p] * TexSize)) * BlurWeights[p];
}

colour.a = 1.0f;

return colour;
}

technique Technique1
{
    pass Pass1
    {
        // TODO: set renderstates here.

        PixelShader = compile ps_2_0 PixelShaderFunction();
    }
}

1 个答案:

答案 0 :(得分:1)

有人可能仍在寻找答案,这已经过时了:

如果你想要一些在现代市场上具有竞争力的体面质量(虚幻引擎3 - 4等),那么解决方案就是多遍2遍高斯模糊。

正如你所说的那样,使用两次通过guassian模糊减少了计算的复杂性。现在,当你有你想做的算法就是不同分辨率的多次传递时,让我们从3开始。

制作全屏的1/2渲染目标,做你的两次模糊,保持结果。 制作原始的1/4渲染目标,模糊。 制作原始的1/8渲染目标,模糊。

每个人都会有不同的内核(使用更强的模糊以获得更低的分辨率),现在你已经完成它将所有的RT组合成结果并具有不错的质量。

3个分辨率实际上是一个老派,在虚幻引擎3(udk)中用于绽放,虚幻引擎4使用5 +全分辨率缓冲模糊正在考虑中。

当然你也可以考虑盒子模糊,个人我会使用大内核的多通道盒子模糊,总体通过次数较少,但这需要一些测试。