问题是内置SpriteBatch
着色器是2.0。如果仅指定像素着色器,SpriteBatch
仍会使用其内置的顶点着色器。因此版本不匹配。
那么,解决方案是自己也指定一个顶点着色器。幸运的是,Microsoft 提供了XNA 内置着色器的源代码。它所涉及的只是矩阵变换。这是代码,已修改,因此您可以直接使用它:
float4x4 MatrixTransform;
void SpriteVertexShader(inout float4 color : COLOR0,
inout float2 texCoord : TEXCOORD0,
inout float4 position : SV_Position)
{
position = mul(position, MatrixTransform);
}
然后 - 因为SpriteBatch
不会为你设置它 -MatrixTransform
正确设置你的效果。这是“客户”空间的简单投影(来自这篇博文)。这是代码:
Matrix projection = Matrix.CreateOrthographicOffCenter(0,
GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, 0, 0, 1);
Matrix halfPixelOffset = Matrix.CreateTranslation(-0.5f, -0.5f, 0);
effect.Parameters["MatrixTransform"].SetValue(halfPixelOffset * projection);