3

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

我终于设法找到了一段很好的一次性示例代码,它明显地模糊了图像一点点,但我希望能够随着时间的推移使它变得更模糊和更少模糊,我不太了解高斯模糊如何实现这一点。

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

所以我的问题基本上是:

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

谢谢你的时间,

TS

附言

刚刚意识到我应该包括代码:

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();
    }
}
4

1 回答 1

1

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

如果您想要一些可以在现代市场(虚幻引擎 3-4 和类似引擎)中具有竞争力的质量,那么解决方案是多通道 2 通道高斯模糊。

正如您被告知的那样,使用两遍高斯模糊来减少计算的复杂性。现在,当您有算法时,您想要做的是在不同分辨率下多次通过,让我们从 3 开始。

制作全屏的 1/2 渲染目标,进行两次模糊,保留结果。制作原始、模糊的 1/4 渲染目标。将 1/8 渲染目标设为 origina,模糊。

每个都有不同的内核(使用更强的模糊来降低分辨率),现在您已经完成了将所有 RT 组合成具有良好质量的结果。

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

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

于 2015-03-27T09:20:51.587 回答