2012-10-10 71 views
2

我想实现在一个Texture2D高斯模糊,并有麻烦试图找到任何好的教程等试图让高斯模糊强/越模糊 - XNA 4.0 HLSL

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

我想它必须是与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(); 
    } 
} 
+0

看看[3D Graphics with XNA Game Studio 4.0](http://www.google.co.il/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CCQQFjAB&url=http%3A %2F%2Fvrac.castelbrazelbub.net%2FGentoomen%2520Library%2FComputer%2520Graphics%2FPackt .-。3D.Graphics.with.XNA.Game.Studio.4.0.pdf&EI = U5x1UKqQBsjMsgaZ14CIAg&USG = AFQjCNHTf0gc6mssUlaDwZ5OYmpRwQKICA&SIG2 = 8o0V0d2yKGZ_lXhLos8-ZA及CAD = RJA),第2章&8,特别是第214页。 –

+0

要获得任何强/宽和正确的模糊,你将需要一个2通效果。一次通过不能采样足够的像素(当然不能足够快);两次通过将复杂度从n^2降低到2n,允许更大的采样区域和更强的模糊。 – ssube

+0

啊好的@peachykeen谢谢你的回复,我听说2-pass的方式更高效,更好,但我找不到任何地方的好教程/例子 - 特别是对于HLSL(因为我还没有完成多通道的东西在HLSL之前)。 – poncho

回答

1

这是相当有人过时可能仍然在寻找答案这样:

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

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

使全屏1/2渲染目标,做你的两个通过模糊,保持结果。 使1/4渲染目标的原始,模糊。 使1/8呈现原始目标,模糊。

每个人都会有不同的内核(对较低分辨率使用更强的模糊),现在您已经完成了将所有RT合并为质量不错的结果。

3个解决方案实际上有点旧派,在虚幻引擎3(udk)中用于开花,虚幻引擎4使用5 +全分辨率缓冲区模糊正在考虑之中。

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

+0

感谢@ user3821985的信息 - 我设法让它与标准的XNA框架一起工作,因为它可以很容易地获得c#中的kinect数据,但不真实的听起来像是一种很酷/更强大的方式来做到这一点(如果kinect数据可直接访问)。 – poncho