XNA 3.1到4.0顶点着色器没有绘制

我最近一直在把我们的XNA3.1游戏转换成XNA4.0,并且卡在着色器上。 我有游戏运行,但没有任何东西是画在屏幕上,除了不使用着色器的东西。

这只是2D绘图,使用SpriteBatch,这肯定是问题来自哪里。

在XNA 3.1中,一切正常,我的自定义顶点和像素着色器定位SM 3.0。 我无法find有关更改或为什么不工作的任何信息。 我已经把它尽可能地去掉了,但是我不确定。 这绝对看起来像一个顶点着色器的协调问题。 如果我去掉顶点着色器,并切换到像素着色器的SM 2.0,所以它使用XNA默认的顶点着色器SpriteBatch,它的工作原理,但我需要3.0和自定义顶点着色function。

这里是剥离的东西的版本,我不能让PS输出任何地方:

// Input parameters. float2 ViewportSize : register(c0); float2 TextureSize : register(c1); float4x4 MatrixTransform : register(c2); sampler TextureSampler : register(s0); struct VS_INPUT { float4 position : POSITION0; float4 color : COLOR0; float2 texCoord : TEXCOORD0; }; struct VS_OUTPUT { float4 position : POSITION0; float4 color : COLOR0; float2 texCoord : TEXCOORD0; }; struct PS_INPUT { float4 color : COLOR0; float2 texCoord : TEXCOORD0; }; VS_OUTPUT VertexTileShader(VS_INPUT input) { VS_OUTPUT output = (VS_OUTPUT)0; float4 position = input.position; // Apply the matrix transform. output.position = mul(position, transpose(MatrixTransform)); // Half pixel offset for correct texel centering. output.position.xy -= 0.5; // Viewport adjustment. output.position.xy /= ViewportSize; output.position.xy *= float2(2, -2); output.position.xy -= float2(1, -1); // Compute the texture coordinate. output.texCoord = input.texCoord / TextureSize; // Pass on color output.color = input.color; return (output); } float4 PSTileLighting(PS_INPUT input) : COLOR { return float4(1.0, 1.0, 1.0, 1.0); } technique TileLighting { pass Pass1 { VertexShader = compile vs_3_0 VertexTileShader(); PixelShader = compile ps_3_0 PSTileLighting(); } } 

C#:

 // Setup matrix transform = Matrix.CreateTranslation(-bounds.X, -bounds.Y, 0); // Setup viewport SectionViewport.X = 0; SectionViewport.Y = 0; SectionViewport.Width = bounds.Width; SectionViewport.Height = bounds.Height; Engine.GraphicsDevice.SetRenderTarget(background); Engine.GraphicsDevice.Viewport = SectionViewport; Engine.GraphicsDevice.Clear(Color.Transparent); Map.TilesEffect.CurrentTechnique = Map.TilesEffect.Techniques["TileLighting"]; Vector2 viewportSize = new Vector2(SectionViewport.Width, SectionViewport.Height); Map.TilesEffect.Parameters["ViewportSize"].SetValue(viewportSize); Map.TilesEffect.Parameters["TextureSize"].SetValue(new Vector2(2048, 2048)); Engine.SpriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, null, null, null, Map.TilesEffect, transform); DrawTiles(tileLayer, 0, 5, bounds, Color.White); Engine.SpriteBatch.End(); 

DrawTiles在边界矩形内的所有图块上调用绘图函数。 他们都在一个大的2048×2048精灵表。 映射被分解成变换matrix用来抵消的这些块。

这一切都在XNA 3.1中起作用。 我把像素着色器去掉了,只是输出白色(或者应该是)。 我确定它没有任何具体的绘图代码,因为就像我说的,如果我切换到默认的SpriteBatch顶点着色器(IE没有定义一个,并将PS回滚到2.0)。 然后它按预期工作。 它应该在任何地方绘制白色像素。

即时通讯matrix/视口操作必须有一些错误,但不知道是什么。 我查看了SpriteBatches的默认着色器,但它使用了大量的macros,并在着色器之前设置了matrix,并且不知道如何将其与我的相关联。

任何帮助表示赞赏,谢谢。

我认为你没有正确的着色。 我没有看到投影matrix的初始化。

在这里你可以find自定义着色器如何在xna 4.0中工作

http://blogs.msdn.com/b/shawnhar/archive/2010/04/05/spritebatch-and-custom-shaders-in-xna-game-studio-4-0.aspx

我相信我解决了这个直接的问题,但是现在我还有其他不相关的问题。 我不知道这是为什么,但是这固定了它。 在我无法得到任何输出之前,所有的空白/透明。 但只是改变这个固定的大部分:

从:

 // Compute the texture coordinate. output.texCoord = input.texCoord / TextureSize; 

至:

 // Compute the texture coordinate. output.texCoord = input.texCoord; 

也许这是XNA 3.1中的input纹理坐标不在0-1范围内的怪癖? Bleh,我不知道。