儘管我面對的問題很簡單,但我無法在互聯網上找到任何答案。我有我從我使用的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不能向下兼容較低的頂點着色器,所以我必須製作自己的頂點着色器。但是,我不希望這個頂點着色器做任何事情,因爲所有的工作都是在我的像素着色器中完成的。我希望這可以清除事情。
你能澄清一下這個問題嗎?目前的解決方案是否有效?爲什麼它不適合你? –
你確定這是C#嗎?代碼似乎不是C#。 – devuxer
這是HLSL。我刪除了C#標籤。 XNA是C#,但問題根本不在於C#。 –