2012-10-11 58 views
4

儘管我面對的問題很簡單,但我無法在互聯網上找到任何答案。我有我從我使用的RenderTarget中獲得的源紋理,然後傳遞給我的效果。我的效果有一個頂點着色器和一個像素着色器,但像素着色器是最重要的一個。我希望頂點着色器對輸入頂點不做任何事情。然後輸出應該傳遞給我的像素着色器,它將在圖像上執行圖像處理(如模糊等)。這個結果將被繪製到屏幕上。因此,基本上,我只想要一個頂點着色器,它接受一個紋理並將其完全不改變地傳遞出去。這裏沒有3D幾何可以說。你怎麼寫一個什麼都不做的頂點着色器?

這裏是我寫這樣做代碼:


float4 VSBasic(float4 vin : POSITION) : POSITION 
{ 
    return vin; 
} 

這裏是我的像素着色器,它應該把所有的像素紅:


float4 PS_GaussianBlur(float2 texCoord : TEXCOORD) : COLOR0 
{ 
    float4 color = float4(0.0f, 0.0f, 0.0f, 1.0f); 

    //int kernelLength = min(31, kernelRadius * 2 + 1); 
    //for (int i = 0; i < kernelLength; i++) 
     //color += tex2D(colorMap, texCoord + offsets[i]) * kernel[i]; 

    color = float4(1.0f, 0.0f, 0.0f, 1.0f); 
    return color; 
} 

需要注意的是模糊的部分被註釋掉供測試用。

那麼我在做什麼錯了!

P.S.我甚至使用頂點着色器的唯一原因是因爲XNA會抱怨我使用衝突的像素/頂點着色器版本,除非我在效果中指定我應該編譯PS_3_0和VS_3_0(因爲我需要PS_3_0,我沒有在PS_2_0中工作,沒有一個頂點着色器)。因此,如果有一種不同的方式來指定頂點着色器版本而不實際實現頂點着色器,請告訴我。

編輯:爲了澄清,我的解決方案在PS_2_0中效果很好,但PS_2_0在我看來沒有足夠的常量寄存器。我想要做的就是將我的着色器擴展到PS_3_0,以便我可以使用更多的寄存器。但是,當我這樣做時,XNA抱怨PS_3_0不能向下兼容較低的頂點着色器,所以我必須製作自己的頂點着色器。但是,我不希望這個頂點着色器做任何事情,因爲所有的工作都是在我的像素着色器中完成的。我希望這可以清除事情。

+0

你能澄清一下這個問題嗎?目前的解決方案是否有效?爲什麼它不適合你? –

+0

你確定這是C#嗎?代碼似乎不是C#。 – devuxer

+0

這是HLSL。我刪除了C#標籤。 XNA是C#,但問題根本不在於C#。 –

回答

2

我不能說你在做什麼錯,因爲你沒有說你如何渲染。我假設你正在使用SpriteBatch,這是一個座標系問題。

您可以在the XNA Stock Effects下載內部找到SpriteBatch內部使用的着色器。

你會注意到它有一個投影變換。您在客戶端空間中輸入座標爲SpriteBatch。但渲染實際上發生在柵格空間中(投影矩陣將頂點轉換到該空間中)。

客戶端空間從左上角的(0,0)變爲視口右下角的(寬度,高度)。

投影空間從左下角的(-1,-1)到視口右上角的(1,1)。

通常,對於全屏效果,最簡單的方法是簡單地渲染到覆蓋柵格空間的固定四邊形(即:不要使用SpriteBatch,而是使用頂點緩衝區代替)。你不需要任何投影矩陣,並且你的頂點着色器可以是空的。

This blog post如果您想使用SpriteBatch可能會對您有所幫助。請注意,爲頂點着色器提供的代碼實際上是錯誤的 - 它不包括投影變換。

此外,我懷疑它會是一個問題,你不通過TEXCOORD0(也許COLOR0),雖然你的着色器。

+0

我使用SpriteBatch繪製,我想保持這種方式,這樣我就可以旋轉,縮放和着色任何我通過着色器運行的圖像(這通過sprite變得非常簡單批量)。我試着用我的頂點着色器中的視圖和投影矩陣乘以我的輸入頂點,但它仍然失敗,僅供參考 – Darkhydro

+0

在搜索博客文章中的評論後,我找到了答案!非常感謝安德魯。如果你有時間,我有一個快速的問題。我有一個名爲內核的float []。爲什麼在循環中使用if(kernel [i]!= 0)會顯着增加寄存器的使用數量? – Darkhydro

+0

我不確定。可能最好是在最新的問題中提出更詳細的問題。 –

相關問題