尽管我面临的问题很简单,但我无法在互联网上找到任何答案。我有一个源纹理,我从我正在使用的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 :(得分:2)
我不知道你做错了什么,因为你还没有说过你是如何渲染的。我假设您正在使用SpriteBatch
,这是一个坐标系问题。
您可以在the XNA Stock Effects下载中找到SpriteBatch
内部使用的着色器。
你会注意到它有一个投影变换。您在客户端空间中将坐标输入SpriteBatch
。但渲染实际上发生在栅格空间中(投影矩阵将顶点转换为此空间)。
客户端空间从左上角的(0,0)变为视口右下角的(宽度,高度)。
投影空间从左下角的(-1,-1)变为视口右上角的(1,1)。
通常,对于全屏效果,最简单的方法是简单地渲染到覆盖栅格空间的固定四边形(即:不使用SpriteBatch
,而是使用顶点缓冲区)。您不需要任何投影矩阵,并且顶点着色器可以为空。
SpriteBatch
,This blog post可能会有用。请注意,为顶点着色器指定的代码实际上是错误的 - 它不包括投影变换。
另外,我怀疑你的着色器不会传递TEXCOORD0
(也许是COLOR0
)会出现问题。