的問題是,內置SpriteBatch
着色器是2.0。如果僅指定像素着色器,則SpriteBatch
仍使用其內置頂點着色器。因此版本不匹配。
的解決方案的話,同時指定一個頂點着色器自己。幸運的是,微軟提供了source to XNA's built-in shaders。它涉及的只是一個矩陣變換。下面的代碼,修改,以便您可以直接使用它:
float4x4 MatrixTransform;
void SpriteVertexShader(inout float4 color : COLOR0,
inout float2 texCoord : TEXCOORD0,
inout float4 position : SV_Position)
{
position = mul(position, MatrixTransform);
}
然後 - 因爲SpriteBatch
不會將它適合你 - 你的設置效果的MatrixTransform
正確。這是「客戶」空間的簡單投影(源自this blog post)。代碼如下:
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);
不要忘記「VertexShader = compile vs_3_0 SpriteVertexShader();」 'vs'vs'ps'滑倒了我的視線片刻! (很好的回答,http://gamedev.sleptlate.org/blog/165-implementing-a-pass-through-3vertex-shader-for-games-without-vertices/幫助你或其他方式?) – Lodewijk 2013-10-26 21:31:00
@Lodewijk獨立 - 我以前沒見過這篇博文(雖然他的發佈日期早幾個月)。他們幾乎相同並不令人驚訝 - 看起來我們都使用了相同的源材料(請參閱我的鏈接)。 – 2014-05-06 04:56:14
感謝您的回答。看到一些代碼集有這樣的生活,總是在博客中傳播很有趣。非常奇特的同時。 – Lodewijk 2014-05-06 22:33:14