2013-02-23 54 views
1

我對着色器很陌生,並且對整個事物感到非常困惑,即使在遵循幾個教程之後(其實這是我今天有關着色器的第二個問題)。如何在XNA中製作多個通道的像素着色器?

我試圖使着色器有兩個關:

technique Technique1 
{ 
    pass Pass1 
    { 
     PixelShader = compile ps_2_0 HorizontalBlur(); 
    } 

    pass Pass2 
    { 
     PixelShader = compile ps_2_0 VerticalBlur(); 
    } 
} 

然而,這僅適用VerticalBlur()。如果我刪除了Pass2,它將回落到Pass1中的Horizo​​ntalBlur()。我錯過了什麼嗎?也許它不會將第一次傳球的結果傳遞給第二次傳球,在這種情況下我該怎麼做?

此外,在我閱讀過的大多數教程中,我都會告訴我在開始使用效果的spritebatch之後要放入effect.CurrentTechnique.Passes[0].Apply();。但是,這似乎沒有改變任何東西;我可以將它設置爲Passes [1],甚至完全刪除它,而且我仍然只獲得Pass2。 (但是,當我嘗試將其設置爲Passes [2]時,確實出現錯誤)。那麼,那條線的用法是什麼?最近版本中是否需要刪除它?

非常感謝!

回答

2

要渲染多遍:

在第一輪,渲染場景到紋理。

對於第二,第三,第四,等傳遞:

  • 畫出使用來自前一遍紋理四。如果有更多的通行證,跟隨,將此通道渲染到另一個紋理,否則,如果這是最後一個通道,則將其渲染到後臺緩衝區。

在你的例子中,假設你正在渲染一輛汽車。

  • 首先您將汽車渲染到紋理。

  • 然後,您繪製一個大矩形,以像素爲單位的屏幕大小,以0.5的深度,以身份世界,視圖和投影矩陣以及您的汽車場景作爲紋理,並應用水平模糊通行證。這被渲染成現在具有水平模糊汽車的新紋理。

  • 最後,呈現相同的矩形,但是使用「橫向毛刺車」紋理,並應用垂直模糊通道。將其渲染到後臺緩衝區。你現在已經畫出了一個模糊的汽車場景。

+1

噢,謝謝。是的,那就是我最終做的。一個問題是,使用不同的pass傳遞兩次着色器和僅應用兩個不同的着色器有什麼區別? – Orteil 2013-02-26 22:12:59

+0

據我所知,除了組織着色器的不同方式之外,沒有其他任何東西。 – pauld 2013-02-26 22:43:38

+0

然而,這樣的平臺支持着色器腳本編寫,您可以在着色器中編寫一個腳本(渲染pass0到渲染目標,然後渲染pass1到後臺緩衝區)甚至渲染傳遞到for循環等。 – pauld 2013-02-26 22:44:44

2

的原因如下

effect.CurrentTechnique.Passes[0].Apply(); 

是很多效果只有一個單一的通行證。

要運行多遍,我認爲你必須要做到這一點,而不是:

foreach (EffectPass pass in effect.CurrentTechnique.Passes) 
{ 
    pass.Apply(); 

    //Your draw code here: 

} 
+0

謝謝!試過,但似乎並不奏效。 – Orteil 2013-02-23 22:34:17

+2

@Orteil - 你已經達到了我對着色器知識的極限。它看起來像你需要在通行證上使用循環(正如我上面所示)。另外,您需要使用渲染目標將結果從一個傳遞傳遞給下一個傳遞。看到這個例子:https://www.allegro。cc/forums/thread/602839注意它使用的是舊版本的XNA,它使用'pass.Begin'和'pass.End'而不是'pass.Apply'。祝你好運。 – 2013-02-23 22:50:56

+0

謝謝,我會看看我能做些什麼。我只是希望我可以利用多通系統保持整潔。 – Orteil 2013-02-23 23:00:52

相關問題