2012-10-10 69 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