尽管我面临的问题很简单,但我在互联网上的任何地方都找不到答案。我有一个从我正在使用的 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;
}
请注意,模糊部分已被注释掉以进行测试。
那我做错什么了???
PS 我什至使用顶点着色器的唯一原因是因为 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 不向后兼容较低的顶点着色器,所以我不得不制作自己的顶点着色器。但是,我不希望这个顶点着色器做任何事情,因为所有的工作都是在我的像素着色器中完成的。我希望这能解决问题。