В этой статье будут рассмотрены 11 самых распространённых проблем связанных с переходм на XNA 4.0 с более ранних версий (XNA 3.x)
Чаще всего проблемы возникают именно при при адаптации XNA 3.х кода к новой версии API. Мы рассмотрим конкертные примеры таких проблем. Приведённые ниже решения помогут вам быстро исправить многие ошибки компиляции. Вот их общий список -
The name ‘SpriteBlendMode‘ does not exist in the current contextThe name ‘SaveStateMode‘ does not exist in the current context‘Microsoft.Xna.Framework.Graphics.GraphicsDevice‘ does not contain a definition for ‘RenderState‘…‘Microsoft.Xna.Framework.Graphics.Effect‘ does not contain a definition for ‘Begin‘ …‘Microsoft.Xna.Framework.Graphics.Effect‘ does not contain a definition for ‘End‘..‘Microsoft.Xna.Framework.Graphics.Effect‘ does not contain a definition for ‘CommitChanges‘ …‘Microsoft.Xna.Framework.Graphics.EffectPass‘ does not contain a definition for ‘Begin‘ …‘Microsoft.Xna.Framework.Graphics.EffectPass‘ does not contain a definition for ‘End‘ ….No overload for method ‘Clone‘ takes 1 argumentsThe name ‘ShaderProfile‘ does not exist in the current context‘Microsoft.Xna.Framework.GameTime‘ does not contain a definition for ‘TotalRealTime‘ …‘Microsoft.Xna.Framework.Color‘ does not contain a definition for ‘TransparentBlack‘ …The type or namespace name ‘ResolveTexture2D‘ could not be found …‘Microsoft.Xna.Framework.Graphics.GraphicsDevice‘ does not contain a definition for ‘ResolveBackBuffer‘…The type or namespace name ‘DepthStencilBuffer‘ could not be found …‘Microsoft.Xna.Framework.Graphics.RenderTarget2D‘ does not contain a constructor that takes 5 arguments …‘Microsoft.Xna.Framework.Graphics.RenderTarget2D‘ does not contain a definition for ‘GetTexture‘ …‘Microsoft.Xna.Framework.Graphics.PresentationParameters‘ does not contain a definition for ‘MultiSampleType‘ …‘Microsoft.Xna.Framework.Graphics.PresentationParameters‘ does not contain a definition for ‘MultiSampleQuality‘ …The best overloaded method match for ‘Microsoft.Xna.Framework.Graphics.GraphicsDevice.SetRenderTarget…‘Microsoft.Xna.Framework.Graphics.GraphicsDevice‘ does not contain a definition for ‘VertexDeclaration‘‘Microsoft.Xna.Framework.Graphics.GraphicsDevice‘ does not contain a definition for ‘Vertices‘‘Microsoft.Xna.Framework.Graphics.VertexPositionTexture‘ does not contain a definition for ‘SizeInBytes‘‘Microsoft.Xna.Framework.Graphics.VertexPositionTexture‘ does not contain a definition for ‘VertexElements‘‘Microsoft.Xna.Framework.Graphics.ModelMesh‘ does not contain a definition for ‘IndexBuffer‘‘Microsoft.Xna.Framework.Graphics.ModelMesh‘ does not contain a definition for ‘VertexBuffer‘‘Microsoft.Xna.Framework.Graphics.ModelMeshPart‘ does not contain a definition for ‘BaseVertex‘‘Microsoft.Xna.Framework.Graphics.ModelMeshPart‘ does not contain a definition for ‘StreamOffset‘‘Microsoft.Xna.Framework.Graphics.ModelMeshPart‘ does not contain a definition for ‘VertexStride‘‘Microsoft.Xna.Framework.Storage.StorageContainer‘ does not contain a definition for ‘TitleLocation‘‘Microsoft.Xna.Framework.Storage.StorageContainer‘ does not contain a definition for ‘Path‘‘Microsoft.Xna.Framework.Storage.StorageDevice‘ does not contain a definition for ‘OpenContainer‘‘Microsoft.Xna.Framework.GamerServices.Guide‘ does not contain a definition for ‘BeginShowStorageDeviceSelector‘‘Microsoft.Xna.Framework.GamerServices.Guide‘ does not contain a definition for ‘EndShowStorageDeviceSelector‘syntax error: unexpected token ‘VertexShader‘syntax error: unexpected token ‘PixelShader‘error X3539: ps_1_x is no longer supported
// использование эффектов (шейдеров) XNA 3.1 blurEffect.CommitChanges();blurEffect.Begin(SaveStateMode.SaveState);blurEffect.CurrentTechnique.Passes[0].Begin();GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);blurEffect.CurrentTechnique.Passes[0].End();blurEffect.End();// использование эффектов (шейдеров) XNA 4.0 blurEffect.CurrentTechnique.Passes[0].Apply();GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);// XNA 3.1 передача значений параметров если они были изменены между пассами effect.CommitChanges();// XNA 4.0 если параметры были изменены то перед вызовом Draw*Primitives -EffectPass.Apply()// XNA 3.1 начинаем использовать эффект effect.Begin(SaveStateMode.SaveState);effect.CurrentTechnique.Passes[0].Begin();// XNA 4.0 начинаем использовать эффект effect.CurrentTechnique.Passes[0].Apply();// XNA 3.1 завершаем effect.CurrentTechnique.Passes[0].End();effect.End();// XNA 4.0 больше не используется. нет такого понятия - "завершить эффект" // XNA 3.1 копируем эффект Effect newEffect = replacementEffect.Clone(replacementEffect.GraphicsDevice);// XNA 4.0 копируем эффект Effect newEffect = replacementEffect.Clone();// XNA 3.1 выбор техники эффекта для SpriteBatchpostprocessEffect.CurrentTechnique= postprocessEffect.Techniques[effectTechniqueName];// Рисуем полноэкранный спрайт (для постпроцессинга)spriteBatch.Begin(SpriteBlendMode.None,SpriteSortMode.Immediate, SaveStateMode.None);postprocessEffect.Begin();postprocessEffect.CurrentTechnique.Passes[0].Begin();spriteBatch.Draw(sceneRenderTarget.GetTexture(), Vector2.Zero, Color.White);spriteBatch.End();postprocessEffect.CurrentTechnique.Passes[0].End();postprocessEffect.End();// XNA 4.0 выбор техники эффекта для SpriteBatch postprocessEffect.CurrentTechnique= postprocessEffect.Techniques[effectTechniqueName];// Рисуем полноэкранный спрайт (для постпроцессинга) spriteBatch.Begin(0, BlendState.Opaque, null, null, null, postprocessEffect);spriteBatch.Draw(sceneRenderTarget, Vector2.Zero, Color.White);spriteBatch.End();
// XNA 3.1 формат вершин для вывода моделей GraphicsDevice.VertexDeclaration= http://static.8gamers.net/images/otherimages/art2/new VertexDeclaration(VertexPositionTexture.VertexElements);// XNA 4.0 формат вершин более отдельно не используется // XNA 3.1 установка буфера и формата вершин GraphicsDevice.VertexDeclaration= vertexDeclaration;GraphicsDevice.Vertices[0].SetSource(vertexBuffer, 0, VertexPositionTexture.SizeInBytes);// XNA 4.0 установка буфера и формата вершин GraphicsDevice.SetVertexBuffer(vertexBuffer);// XNA 3.1 создание формата вершин vertexDeclaration = http://static.8gamers.net/images/otherimages/art2/new VertexDeclaration(GraphicsDevice, VertexPositionTexture.VertexElements);// XNA 4.0 создание формата вершин vertexDeclaration = http://static.8gamers.net/images/otherimages/art2/new VertexDeclaration(VertexPositionTexture.VertexDeclaration.GetVertexElements());// XNA 3.1 сброс формата и буфера GraphicsDevice.VertexDeclaration= null;GraphicsDevice.Vertices[0].SetSource(null, 0, 0);// XNA 4.0 сброс формата и буфера GraphicsDevice.SetVertexBuffer(null);// XNA 3.1 передача данных в буфер VertexPositionNormalTexture[] vertices = http://static.8gamers.net/images/otherimages/art2/new VertexPositionNormalTexture[100];vertexBuffer.SetData<VertexPositionNormalTexture>(VertexPositionNormalTexture.SizeInBytes* vertexCount, vertices,vertexCount,count,VertexPositionNormalTexture.SizeInBytes);// XNA 4.0 передача данных в буфер VertexPositionNormalTexture[] vertices = http://static.8gamers.net/images/otherimages/art2/new VertexPositionNormalTexture[100];vertexBuffer.SetData<VertexPositionNormalTexture>(vertices);
// XNA 3.1 для всех частей мэша foreach(ModelMeshPart meshPart in mesh.MeshParts){if(meshPart.PrimitiveCount>0){// установка вершин и индексовGraphicsDevice.VertexDeclaration= meshPart.VertexDeclaration;GraphicsDevice.Vertices[0].SetSource(mesh.VertexBuffer, meshPart.StreamOffset, meshPart.VertexStride);GraphicsDevice.Indices= mesh.IndexBuffer;... // XNA 4.0 GraphicsDevice.SamplerStates[0]= SamplerState.LinearWrap;// may be needed in some cases... // для всех частей мэша foreach(ModelMeshPart meshPart in mesh.MeshParts){if(meshPart.PrimitiveCount>0){// установка вершин и индексовGraphicsDevice.SetVertexBuffer(meshPart.VertexBuffer);GraphicsDevice.Indices= meshPart.IndexBuffer;... // XNA 3.1 вывод примитивов GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, meshPart.BaseVertex, 0, meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount);// XNA 4.0 вывод примитивов GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, meshPart.VertexOffset, 0, meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount);
// XNA 3.1 VertexShaderOutput VertexShader(...){//some code}float4 PixelShader(...){// some code }// XNA 4.0 // "VertexShader" теперь ключевое слово VertexShaderOutput VertexShaderFunction(...){// some code }// "PixelShader" теперь ключевое слово float4 PixelShaderFunction(...){// some code}// XNA 3.1 technique{pass{ VertexShader = compile vs_1_1 VertexShader(); PixelShader = compile ps_1_1 PixelShader();}}// XNA 4.0 technique{pass{ VertexShader = compile vs_2_0 VertexShaderFunction(); PixelShader = compile ps_2_0 PixelShaderFunction();}}
11. Если 3D модель выглядит "наизнанку" или полупрозрачной
1
2
3
// установки для корректного вывода 3D модели GraphicsDevice.BlendState= BlendState.Opaque;GraphicsDevice.DepthStencilState= DepthStencilState.Default;
/span/spancolor: #008000; /spanspan style=
2186 Прочтений • [11 проблем перехода с XNA 3.x на XNA 4.0] [08.08.2012] [Комментариев: 0]