zoukankan      html  css  js  c++  java
  • xna 3.1 to xna 4.0 conversion cheat sheet.(转)

    Nelxon here again providing yet another resource for XNA Game developers. There are a few sites available to help us convert those XNA 3.1 projects to XNA 4.0, but it seems many of us are still have problems migrating successfully and easily. Its a pain to visit multiple sites and pages only to find corrections for 1 to 3 errors and still have hundreds more left.

    After losing many hours of production time, I decided it would be more convenient to have a simple cheat sheet  - (collection of code snippets XNA 3.1 to XNA 4.0)  to help me convert projects faster with less difficulty. So far, this cheat sheet has helped me convert over a dozen XNA 3.1 projects, which removed at least 90% of the errors due to the code breaking changes from XNA 4.0. The remaining errors I could resolve myself or simply ask for help on the forums. 5 errors are better than 50…

    I decided to share this cheat sheet because I am constantly reading forums where developers discuss having the same problems converting their projects. I figured maybe other developers would find this useful as well. These code snippets were created from comparing the XNA 3.1 creator’s club educational samples to the newer XNA 4.0 samples. However do not consider this page as a tutorial, it is a list of examples to help you see the difference between XNA 3.1 and XNA 4.0 syntax and provided to help you learn by example.

    DON’T FORGET TO BACKUP YOUR WORK FIRST, BEFORE YOU TRY TO CONVERT IT.

    Bookmark this page, because it may come in handy if you find a good library written in XNA 3.1. If a developer is having problems converting their projects, please send them to this page, it may help.
    List of errors resolved using this cheat sheet:

    The name ‘SpriteBlendMode‘ does not exist in the current context The 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 arguments

    The 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

    Other Issues: XNA model is drawn inside out, looks transparent, missing vertices or just doesn’t look right…

    ListofExamplesConvertingXNA3.1toXNA4.0

    SpriteBlendMode, SaveStateMode
    1
    2
    // XNA 3.1
    sprite.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Deferred, SaveStateMode.SaveState);
    1
    2
    // XNA 4.0
    sprite.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);
    1
    2
    3
    // XNA 3.1
    // Sort the object layer and player sprite according to depth
    spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.BackToFront, SaveStateMode.None);
    1
    2
    3
    // XNA 4.0
    // Sort the object layer and player sprite according to depth
    spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
    1
    2
    // XNA 3.1
    sprite.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.SaveState);
    1
    2
    // XNA 4.0
    sprite.Begin(SpriteSortMode.Immediate, BlendState.Opaque);
    1
    2
    3
    4
    5
    6
    // XNA 3.1
    // Draw the background image.
    spriteBatch.Begin(SpriteBlendMode.None);
    Viewport viewport = GraphicsDevice.Viewport;
    spriteBatch.Draw(background, new Rectangle(0, 0, viewport.Width, viewport.Height), Color.White);
    spriteBatch.End();
    1
    2
    3
    4
    5
    // XNA 4.0
    // Draw the background image.
    spriteBatch.Begin(0, BlendState.Opaque);
    spriteBatch.Draw(background, GraphicsDevice.Viewport.Bounds, Color.White);
    spriteBatch.End();
    RenderState
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // XNA 3.1
    // enable alpha blending and disable depth write
    GraphicsDevice.RenderState.AlphaBlendEnable = true;
    GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha;
    GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha;
    GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = true;
    GraphicsDevice.RenderState.AlphaBlendOperation = BlendFunction.Add;
    GraphicsDevice.RenderState.AlphaSourceBlend = Blend.One;
    GraphicsDevice.RenderState.AlphaDestinationBlend = Blend.One;
    GraphicsDevice.RenderState.DepthBufferWriteEnable = false;
    1
    2
    3
    4
    // XNA 4.0
    // enable alpha blending and disable depth write
    GraphicsDevice.BlendState = BlendState.AlphaBlend;
    GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead;
    1
    2
    3
    4
    5
    // XNA 3.1
    // reset blend and depth write
    GraphicsDevice.RenderState.AlphaBlendEnable = false;
    GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = false;
    GraphicsDevice.RenderState.DepthBufferWriteEnable = true;
    1
    2
    3
    4
    // XNA 4.0
    // reset blend and depth write
    GraphicsDevice.BlendState = BlendState.Additive;
    GraphicsDevice.DepthStencilState = DepthStencilState.Default;
    1
    2
    3
    // XNA 3.1
    // enable depth buffering
    GraphicsDevice.RenderState.DepthBufferEnable = true;
    1
    2
    3
    // XNA 4.0
    // enable depth buffering
    GraphicsDevice.DepthStencilState = DepthStencilState.Default;
    1
    2
    3
    4
    // XNA 3.1
    //disable depth buffering
    GraphicsDevice.RenderState.DepthBufferWriteEnable = false;
    GraphicsDevice.RenderState.DepthBufferEnable = false;
    1
    2
    3
    // XNA 4.0
    //disable depth buffering
    GraphicsDevice.DepthStencilState = DepthStencilState.None;
    1
    2
    3
    4
    5
    6
    // XNA 3.1
    // set additive blend (zero on alpha)
    GraphicsDevice.RenderState.DepthBufferWriteEnable = false;
    GraphicsDevice.RenderState.AlphaBlendEnable = true;
    GraphicsDevice.RenderState.SourceBlend = Blend.One;
    GraphicsDevice.RenderState.DestinationBlend = Blend.One;
    1
    2
    3
    4
    // XNA 4.0
    // set additive blend (zero on alpha)
    GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead;
    GraphicsDevice.BlendState = BlendState.AlphaBlend;
    1
    2
    3
    4
    5
    // XNA 3.1
    // restore blend modes
    GraphicsDevice.RenderState.DepthBufferWriteEnable = true;
    GraphicsDevice.RenderState.AlphaBlendEnable = false;
    GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = false;
    1
    2
    3
    4
    // XNA 4.0
    // restore blend modes
    GraphicsDevice.BlendState = BlendState.Opaque;
    GraphicsDevice.DepthStencilState = DepthStencilState.Default;
    1
    2
    3
    4
    5
    6
    7
    // XNA 3.1
    // set alpha blend and no depth test or write
    GraphicsDevice.RenderState.DepthBufferEnable = false;
    GraphicsDevice.RenderState.DepthBufferWriteEnable = false;
    GraphicsDevice.RenderState.AlphaBlendEnable = true;
    GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha;
    GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha;
    1
    2
    3
    4
    // XNA 4.0
    // set alpha blend and no depth test or write
    GraphicsDevice.DepthStencilState = DepthStencilState.None;
    GraphicsDevice.BlendState = BlendState.AlphaBlend;
    1
    2
    3
    4
    5
    // XNA 3.1
    // Set suitable renderstates for drawing a 3D model
    GraphicsDevice.RenderState.AlphaBlendEnable = false;
    GraphicsDevice.RenderState.AlphaTestEnable = false;
    GraphicsDevice.RenderState.DepthBufferEnable = true;
    1
    2
    3
    4
    // XNA 4.0
    // Set suitable renderstates for drawing a 3D model
    GraphicsDevice.BlendState = BlendState.Opaque;
    GraphicsDevice.DepthStencilState = DepthStencilState.Default;
    1
    2
    3
    4
    5
    // XNA 3.1
    // additive blend
    GraphicsDevice.RenderState.AlphaBlendEnable = true;
    GraphicsDevice.RenderState.SourceBlend = Blend.One;
    GraphicsDevice.RenderState.DestinationBlend = Blend.One;
    1
    2
    3
    // XNA 4.0
    // additive blend
    GraphicsDevice.BlendState = BlendState.Additive;
    1
    2
    3
    // XNA 3.1
    // set additive blend
    GraphicsDevice.RenderState.DestinationBlend = Blend.One;
    1
    2
    3
    // XNA 4.0
    // set additive blend
    GraphicsDevice.BlendState = BlendState.Additive;
    1
    2
    3
    // XNA 3.1
    // set alpha blend
    GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha;
    1
    2
    3
    // XNA 4.0
    // set alpha blend
    GraphicsDevice.BlendState = BlendState.AlphaBlend;
    1
    2
    // XNA 3.1
    GraphicsDevice.RenderState.CullMode = CullMode.CullCounterClockwiseFace;
    1
    2
    // XNA 4.0
    GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // XNA 3.1
    // set render states
    GraphicsDevice.RenderState.DepthBufferEnable = false;
    GraphicsDevice.RenderState.DepthBufferWriteEnable = false;
    GraphicsDevice.RenderState.AlphaBlendEnable = true;
    GraphicsDevice.RenderState.SourceBlend = Blend.One;
    GraphicsDevice.RenderState.DestinationBlend = Blend.One;
    GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = true;
    GraphicsDevice.RenderState.AlphaBlendOperation = BlendFunction.Add;
    GraphicsDevice.RenderState.AlphaDestinationBlend = Blend.Zero;
    GraphicsDevice.RenderState.AlphaSourceBlend = Blend.Zero;
     
          // drawing code here..
     
    // restore render states
    GraphicsDevice.RenderState.DepthBufferEnable = true;
    GraphicsDevice.RenderState.DepthBufferWriteEnable = true;
    GraphicsDevice.RenderState.AlphaBlendEnable = false;
    GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = false;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // XNA 4.0
    //save the states
    DepthStencilState ds = GraphicsDevice.DepthStencilState;
    BlendState bs = GraphicsDevice.BlendState;
     
    //set render states
    GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead;
    GraphicsDevice.BlendState = BlendState.AlphaBlend;
     
           // drawing code here..
     
    // restore render states
    GraphicsDevice.DepthStencilState = ds;
    GraphicsDevice.BlendState = bs;
    Effect and EffectPass, Begin(), End(), CommitChanges(), Clone()
    1
    2
    3
    4
    5
    6
    7
    // apply effect 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();
    1
    2
    3
    // apply effect XNA 4.0
    blurEffect.CurrentTechnique.Passes[0].Apply();
    GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);
    1
    2
    3
    // XNA 3.1
    // commit effect changes
    effect.CommitChanges();
    1
    2
    3
    // XNA 4.0
    //  you will need to call EffectPass.Apply() if any of the effect properties change
    // Otherwise Delete it.
    1
    2
    3
    4
    // XNA 3.1
    // begin effect
    effect.Begin(SaveStateMode.SaveState);
    effect.CurrentTechnique.Passes[0].Begin();
    1
    2
    3
    // XNA 4.0
    // begin effect
    effect.CurrentTechnique.Passes[0].Apply();
    1
    2
    3
    4
    // XNA 3.1
    // end effect
    effect.CurrentTechnique.Passes[0].End();
    effect.End();
    1
    2
    // XNA 4.0
    // Delete it. No longer needed.
    1
    2
    3
    // XNA 3.1
    // Make a clone of our replacement effect
    Effect newEffect = replacementEffect.Clone(replacementEffect.GraphicsDevice);
    1
    2
    3
    // XNA 4.0
    // Make a clone of our replacement effect. 3.1
    Effect newEffect = replacementEffect.Clone();
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // XNA 3.1
    // Activate the appropriate effect technique
    postprocessEffect.CurrentTechnique = postprocessEffect.Techniques[effectTechniqueName];    
     
    // Draw a fullscreen sprite to apply the postprocessing effect.
    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();
    1
    2
    3
    4
    5
    6
    7
    8
    // XNA 4.0
    // Activate the appropriate effect technique
    postprocessEffect.CurrentTechnique = postprocessEffect.Techniques[effectTechniqueName];
     
    // Draw a fullscreen sprite to apply the postprocessing effect.
    spriteBatch.Begin(0, BlendState.Opaque, null, null, null, postprocessEffect);
    spriteBatch.Draw(sceneRenderTarget, Vector2.Zero, Color.White);
    spriteBatch.End();
    ShaderProfile, TotalRealTime, TransparentBlack
    1
    2
    3
    // XNA 3.1
    graphics.MinimumPixelShaderProfile = ShaderProfile.PS_3_0; //any PS number...
    graphics.MinimumVertexShaderProfile = ShaderProfile.VS_3_0;//any VS number...
    1
    2
    // XNA 4.0
    // Delete it. No longer needed.
    1
    2
    // XNA 3.1
    float myTime = (float)gameTime.TotalRealTime.TotalSeconds * 0.2f;
    1
    2
    // XNA 4.0
    float myTime = (float)gameTime.TotalGameTime.TotalSeconds * 0.2f;
    1
    2
    // XNA 3.1
    GraphicsDevice.Clear(Color.TransparentBlack);
    1
    2
    // XNA 4.0
    GraphicsDevice.Clear(Color.Transparent);
    ResolveTexture2D, ResolveBackBuffer, RenderTarget2D, GetTexture, DepthStencilBuffer, PresentationParameters, MultiSampleType, MultiSampleQuality, SetRenderTarget
    1
    2
    // XNA 3.1
    ResolveTexture2D sceneMap;
    1
    2
    // XNA 4.0
    RenderTarget2D sceneMap;
    1
    2
    3
    4
    5
    6
    // XNA 3.1
    // Look up the resolution and format of our main backbuffer.
    PresentationParameters pp = GraphicsDevice.PresentationParameters;
     
    // Create a texture for reading back the backbuffer contents.
    sceneMap = new ResolveTexture2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1, pp.BackBufferFormat);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // XNA 4.0
    // Look up the resolution and format of our main backbuffer.
    PresentationParameters pp = GraphicsDevice.PresentationParameters;
     
    // Create a texture for reading back the backbuffer contents.
    sceneMap = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, false, pp.BackBufferFormat,
                                    pp.DepthStencilFormat);
    //or
     
    sceneMap = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, false, pp.BackBufferFormat,
                                    pp.DepthStencilFormat, pp.MultiSampleCount, RenderTargetUsage.DiscardContents);
    1
    2
    // XNA 3.1
    GraphicsDevice.ResolveBackBuffer(sceneMap);
    1
    2
    // XNA 4.0
    GraphicsDevice.SetRenderTarget(sceneMap);
    1
    2
    3
    4
    5
    6
    // XNA 3.1
    int width = GraphicsDevice.Viewport.Width;
    int height = GraphicsDevice.Viewport.Height;
     
    // create render target
    myRenderTarget = new RenderTarget2D(GraphicsDevice, width, height, 1, SurfaceFormat.Color);
    1
    2
    3
    4
    5
    6
    // XNA 4.0
    int width = GraphicsDevice.Viewport.Width;
    int height = GraphicsDevice.Viewport.Height;
     
    // create render target
    myRenderTarget = new RenderTarget2D(GraphicsDevice, width, height, true, SurfaceFormat.Color, DepthFormat.Depth24);
    1
    2
    3
    4
    5
    6
    // XNA 3.1
    PresentationParameters pp = GraphicsDevice.PresentationParameters;
     
    // Create custom rendertarget
    sceneRenderTarget = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1,
                                       pp.BackBufferFormat, pp.MultiSampleType, pp.MultiSampleQuality);
    1
    2
    3
    4
    5
    6
    7
    // XNA 4.0
    PresentationParameters pp = GraphicsDevice.PresentationParameters;
     
    // Create custom rendertarget
    sceneRenderTarget = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, false,
                                       pp.BackBufferFormat, pp.DepthStencilFormat, pp.MultiSampleCount,
                                       RenderTargetUsage.DiscardContents);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // XNA 3.1
    PresentationParameters pp = GraphicsDevice.PresentationParameters;
     
    // Setup a DepthBuffer
    drawBuffer = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1,
                                    SurfaceFormat.Color, pp.MultiSampleType, pp.MultiSampleQuality);
     
    drawDepthBuffer = new DepthStencilBuffer(GraphicsDevice, pp.AutoDepthStencilFormat,
                                                pp.MultiSampleType, pp.MultiSampleQuality);
    1
    2
    3
    4
    5
    6
    7
    8
    // XNA 4.0
    PresentationParameters pp = GraphicsDevice.PresentationParameters;
     
    // Setup a DepthBuffer
    drawBuffer = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, true,
                                    SurfaceFormat.Color,DepthFormat.Depth24Stencil8,
                                    pp.MultiSampleCount, RenderTargetUsage.DiscardContents);
    //NOTE:  DepthStencilBuffer class no longer exists
    1
    2
    // XNA 3.1
    spriteBatch.Draw(myRenderTarget.GetTexture(), Vector2.Zero, Color.White);
    1
    2
    // XNA 4.0
    spriteBatch.Draw(myRenderTarget, Vector2.Zero, Color.White); // NOTE: ".GetTexure()"  No longer needed
    1
    2
    // XNA 3.1
    Texture2D myTexture = myRenderTarget.GetTexture();
    1
    2
    // XNA 4.0
    Texture2D myTexture = myRenderTarget; // NOTE: ".GetTexure()"  No longer needed
    1
    2
    // XNA 3.1
    GraphicsDevice.SetRenderTarget(0, myRenderTarget);
    1
    2
    // XNA 4.0
    GraphicsDevice.SetRenderTarget(myRenderTarget);
    1
    2
    3
    4
    // XNA 3.1
    // Set the two render targets
    GraphicsDevice.SetRenderTarget(0, colorRT);
    GraphicsDevice.SetRenderTarget(1, depthRT);
    1
    2
    3
    // XNA 4.0
    // Set the two render targets
    GraphicsDevice.SetRenderTargets(colorRT, depthRT);
    1
    2
    // XNA 3.1
    GraphicsDevice.SetRenderTarget(0, null);
    1
    2
    // XNA 4.0
    GraphicsDevice.SetRenderTarget(null);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // XNA 3.1
    // resolve the backbuffer as the depth map
    GraphicsDevice.ResolveBackBuffer(depthMap);
     
    // draw the scene image again, blur it with the depth map
    GraphicsDevice.Textures[1] = depthMap;
    Viewport viewport = GraphicsDevice.Viewport;
    dofEffect.CurrentTechnique = depthBlurTechnique;
    DrawFullscreenQuad(sceneMap, viewport.Width, viewport.Height, dofEffect);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // XNA 4.0
    // resolve the backbuffer as the depth map
    GraphicsDevice.SetRenderTarget(null);
     
    // draw the scene image again, blur it with the depth map
    GraphicsDevice.Textures[1] = depthMap;
    GraphicsDevice.SamplerStates[1] = SamplerState.PointClamp;
    Viewport viewport = GraphicsDevice.Viewport;
    dofEffect.CurrentTechnique = depthBlurTechnique;
    DrawFullscreenQuad(sceneMap, viewport.Width, viewport.Height, dofEffect);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // XNA 3.1
    ResolveTexture2D resolveTarget;
    RenderTarget2D renderTarget1;
    RenderTarget2D renderTarget2;
     
    // Look up the resolution and format of our main backbuffer.
    PresentationParameters pp = GraphicsDevice.PresentationParameters;
     
    int width = pp.BackBufferWidth;
    int height = pp.BackBufferHeight;
    SurfaceFormat format = pp.BackBufferFormat;
     
    // Create a texture for reading back the backbuffer contents.
    resolveTarget = new ResolveTexture2D(GraphicsDevice, width, height, 1, format);
     
    // Create two rendertargets half size for the bloom processing.
    width /= 2;
    height /= 2;
     
    renderTarget1 = new RenderTarget2D(GraphicsDevice, width, height, 1,format);
    renderTarget2 = new RenderTarget2D(GraphicsDevice, width, height, 1,format);
     
    // ... In the Draw Method...
    GraphicsDevice.ResolveBackBuffer(resolveTarget);
    // ...apply effect and draw pass 1...
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // XNA 4.0
    RenderTarget2D sceneRenderTarget;
    RenderTarget2D renderTarget1;
    RenderTarget2D renderTarget2;
     
    // Look up the resolution and format of our main backbuffer.
    PresentationParameters pp = GraphicsDevice.PresentationParameters;
     
    int width = pp.BackBufferWidth;
    int height = pp.BackBufferHeight;
    SurfaceFormat format = pp.BackBufferFormat;
     
    // Create a texture for rendering the main scene, prior to applying bloom.
    sceneRenderTarget = new RenderTarget2D(GraphicsDevice, width, height, false,
                                           format, pp.DepthStencilFormat, pp.MultiSampleCount,
                                           RenderTargetUsage.DiscardContents);
     
    // Create two rendertargets half size for the bloom processing.
    width /= 2;
    height /= 2;
     
    renderTarget1 = new RenderTarget2D(GraphicsDevice, width, height, false, format, DepthFormat.None);
    renderTarget2 = new RenderTarget2D(GraphicsDevice, width, height, false, format, DepthFormat.None);
     
    // ...In the Draw Method...
    GraphicsDevice.SetRenderTarget(sceneRenderTarget);
    GraphicsDevice.SamplerStates[1] = SamplerState.LinearClamp;
    // ...apply effect and draw pass 1....
    VertexDeclaration, Vertices, VertexElements, SizeInBytes
    1
    2
    3
    // XNA 3.1
    // Vertex declaration for rendering our 3D model.
    GraphicsDevice.VertexDeclaration = new VertexDeclaration(VertexPositionTexture.VertexElements);
    1
    2
    // XNA 4.0
    // Delete it. No longer needed.
    1
    2
    3
    4
    // XNA 3.1
    // set vertex buffer and declaration
    GraphicsDevice.VertexDeclaration = vertexDeclaration;
    GraphicsDevice.Vertices[0].SetSource(vertexBuffer, 0, VertexPositionTexture.SizeInBytes);
    1
    2
    3
    // XNA 4.0
    // set vertex buffer and declaration
    GraphicsDevice.SetVertexBuffer(vertexBuffer);
    1
    2
    3
    // XNA 3.1
    // create vertex declaration
    vertexDeclaration = new VertexDeclaration(GraphicsDevice, VertexPositionTexture.VertexElements);
    1
    2
    3
    // XNA 4.0
    // create vertex declaration
    vertexDeclaration = new VertexDeclaration(VertexPositionTexture.VertexDeclaration.GetVertexElements());
    1
    2
    3
    4
    // XNA 3.1
    // reset vertex buffer declaration
    GraphicsDevice.VertexDeclaration = null;
    GraphicsDevice.Vertices[0].SetSource(null, 0, 0);
    1
    2
    3
    // XNA 4.0
    // reset vertex buffer declaration
    GraphicsDevice.SetVertexBuffer(null);
    1
    2
    3
    4
    5
    6
    7
    // XNA 3.1
    // the vertices array
    VertexPositionNormalTexture[] vertices = new VertexPositionNormalTexture[100];
     
    // set new particles to vertex buffer
    vertexBuffer.SetData<VertexPositionNormalTexture>(VertexPositionNormalTexture.SizeInBytes * vertexCount,
                        vertices,vertexCount,count,VertexPositionNormalTexture.SizeInBytes);
    1
    2
    3
    4
    5
    6
    // XNA 4.0
    // the vertices array
    VertexPositionNormalTexture[] vertices = new VertexPositionNormalTexture[100];
     
    // set new particles to vertex buffer
    vertexBuffer.SetData<VertexPositionNormalTexture>(vertices);
    VertexBuffer, StreamOffset, VertexStride, IndexBuffer, BaseVertex
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // XNA 3.1
    // for each mesh part
    foreach (ModelMeshPart meshPart in mesh.MeshParts)
    {
        // if primitives to render
        if (meshPart.PrimitiveCount > 0)
        {
            // setup vertices and indices
            GraphicsDevice.VertexDeclaration = meshPart.VertexDeclaration;
            GraphicsDevice.Vertices[0].SetSource(mesh.VertexBuffer, meshPart.StreamOffset, meshPart.VertexStride);
            GraphicsDevice.Indices = mesh.IndexBuffer;
            ...
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // XNA 4.0
    GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap; // may be needed in some cases...
     
    // for each mesh part
    foreach (ModelMeshPart meshPart in mesh.MeshParts)
    {
        // if primitives to render
        if (meshPart.PrimitiveCount > 0)
        {
            // setup vertices and indices
            GraphicsDevice.SetVertexBuffer(meshPart.VertexBuffer);
            GraphicsDevice.Indices = meshPart.IndexBuffer;
            ...
    1
    2
    3
    4
    5
    // XNA 3.1
    // draw primitives
    GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList,
        meshPart.BaseVertex, 0, meshPart.NumVertices,
        meshPart.StartIndex, meshPart.PrimitiveCount);
    1
    2
    3
    4
    // XNA 4.0
    // draw primitives
    GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0,
        meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount);
    Points, PointSpriteEnable, PointSizeMax, PointList
    1
    2
    3
    4
    // XNA 3.1
    // create the vertex buffer
    vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionNormalTexture),
                                    250, BufferUsage.WriteOnly | BufferUsage.Points);
    1
    2
    3
    4
    // XNA 4.0
    // create the vertex buffer
    vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionNormalTexture),
                                    250, BufferUsage.WriteOnly | BufferUsage.None);
    1
    2
    3
    4
    // XNA 3.1
    // enable point sprite 3.1
    GraphicsDevice.RenderState.PointSpriteEnable = true;
    GraphicsDevice.RenderState.PointSizeMax = 128;
    1
    2
    // XNA 4.0
    // Delete it. No longer available.
    1
    2
    3
    // XNA 3.1
    // draw the point sprites
    GraphicsDevice.DrawPrimitives(PrimitiveType.PointList, vertexPosition, numberVertices);
    1
    2
    3
    // XNA 4.0
    // draw the point sprites
    GraphicsDevice.DrawPrimitives(PrimitiveType.LineList, vertexPosition, numberVertices);
    OpenContainer, BeginShowStorageDeviceSelector, EndShowStorageDeviceSelector, Path, TitleLocation, FileStream
    1
    2
    3
    // XNA 3.1
    // open the container
    StorageContainer storageContainer = storageDevice.OpenContainer("YourGameName");
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // XNA 4.0
    //To make life easier simply create a method to replace the storageDevice.OpenContainer...
     
    /// <summary>
    /// Synchronously opens storage container
    /// </summary>
    private static StorageContainer OpenContainer(StorageDevice storageDevice, string saveGameName)
    {
        IAsyncResult result = storageDevice.BeginOpenContainer(saveGameName, null, null);
     
        // Wait for the WaitHandle to become signaled.
        result.AsyncWaitHandle.WaitOne();
     
        StorageContainer container = storageDevice.EndOpenContainer(result);
     
        // Close the wait handle.
        result.AsyncWaitHandle.Close();
     
        return container;
    }
     
    // open the container
    StorageContainer storageContainer = OpenContainer(storageDevice, "YourGameName");
    1
    2
    3
    // XNA 3.1
    // retrieve the storage device
    Guide.BeginShowStorageDeviceSelector(GetStorageDeviceResult, retrievalDelegate);
    1
    2
    3
    4
    5
    6
    // XNA 4.0
    // retrieve the storage device
    if (!Guide.IsVisible)
    {
        StorageDevice.BeginShowSelector(GetStorageDeviceResult, retrievalDelegate);
    }
    1
    2
    3
    // XNA 3.1
    // retrieve and store the storage device
    storageDevice = Guide.EndShowStorageDeviceSelector(result);
    1
    2
    3
    // XNA 4.0
    // retrieve and store the storage device
    storageDevice = StorageDevice.EndShowSelector(result);
    1
    2
    3
    // XNA 3.1
    // get the level setup files
    string[] filenames = Directory.GetFiles(storageContainer.Path, "LevelSetup*.xml");
    1
    2
    3
    // XNA 4.0
    // get the level setup files
    string[] filenames = storageContainer.GetFileNames("LevelSetup*.xml"");
    1
    2
    3
    4
    5
    6
    // XNA 3.1
    // save game level data
    using (FileStream stream = new FileStream(Path.Combine(storageContainer.Path, levelFilename), FileMode.Create))
    {
        new XmlSerializer(typeof(SaveGameLevel)).Serialize(stream, levelData);
    }
    1
    2
    3
    4
    5
    6
    // XNA 4.0
    // save game level data
    using (Stream stream = storageContainer.OpenFile(levelFilename, FileMode.Create))
    {
        new XmlSerializer(typeof(SaveGameLevel)).Serialize(stream, levelData);
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // XNA 3.1
    // Delete the saved game level data.
    using (StorageContainer storageContainer = storageDevice.OpenContainer("saveGameName"))
    {
        File.Delete(Path.Combine(storageContainer.Path, saveGameLevel.FileName));
     
        File.Delete(Path.Combine(storageContainer.Path, "SaveGameLevel" +
            Path.GetFileNameWithoutExtension(saveGameLevel.FileName).Substring(8) +".xml"));
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // XNA 4.0
    // Delete the saved game level data. NOTE: using OpenContainer method created in previous example
    using (StorageContainer storageContainer = OpenContainer(storageDevice, "saveGameName"))
    {
        storageContainer.DeleteFile(saveGameLevel.FileName);
     
        storageContainer.DeleteFile("SaveGameLevel" +
            Path.GetFileNameWithoutExtension(saveGameLevel.FileName).Substring(8) + ".xml");
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    // XNA 3.1
    //Load the Next Level...
     
    // Find the path of the next level.
    string levelPath;
     
    // Loop here so we can try again when we can't find a level.
    while (true)
    {
        // Try to find the next level. They are sequentially numbered txt files.
        levelPath = String.Format("Levels/{0}.txt", ++levelIndex);
        levelPath = Path.Combine(StorageContainer.TitleLocation, "Content/" + levelPath);
        if (File.Exists(levelPath))
            break;
     
        // If there isn't even a level 0, something has gone wrong.
        if (levelIndex == 0)
            throw new Exception("No levels found.");
     
        // Whenever we can't find a level, start over again at 0.
        levelIndex = -1;
    }
     
    // Unloads the content for the current level before loading the next one.
    if (level != null)
        level.Dispose();
     
    // Load the level.
    level = new Level(Services, levelPath);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // XNA 4.0
    // Load the Next Level...
     
    // move to the next level
    levelIndex = (levelIndex + 1) % numberOfLevels;
     
    // Unloads the content for the current level before loading the next one.
    if (level != null)
        level.Dispose();
     
    // Load the level.
    string levelPath = string.Format("Content/Levels/{0}.txt", levelIndex);
    using (Stream fileStream = TitleContainer.OpenStream(levelPath))
        level = new Level(Services, fileStream, levelIndex);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    // XNA 3.1
    //Save the current state of the session, with the given storage device.
     
    // check the parameter
    if ((storageDevice == null) || !storageDevice.IsConnected)
    {
        return;
    }
     
    // open the container
    using (StorageContainer storageContainer = storageDevice.OpenContainer(Session.SaveGameContainerName))
    {
        string filename;
        string descriptionFilename;
     
        // get the filenames
        if (overwriteDescription == null)
        {
            int saveGameIndex = 0;
            string testFilename;
            do
            {
                saveGameIndex++;
                testFilename = Path.Combine(storageContainer.Path, "SaveGame" + saveGameIndex.ToString() + ".xml");
            }
            while (File.Exists(testFilename));
            filename = testFilename;
            descriptionFilename = "SaveGameDescription" + saveGameIndex.ToString() + ".xml";
        }
        else
        {
            filename = Path.Combine(storageContainer.Path, overwriteDescription.FileName);
            descriptionFilename = "SaveGameDescription" +
                Path.GetFileNameWithoutExtension(overwriteDescription.FileName).Substring(8) + ".xml";
        }
     
        using (FileStream stream = new FileStream(filename, FileMode.Create))
        {
            using (XmlWriter xmlWriter = XmlWriter.Create(stream))
            {
                //create and write xml data...
            }
        }
     
       // create the save game description
        SaveGameDescription description = new SaveGameDescription();
        description.FileName = Path.GetFileName(filename);
        description.ChapterName = IsQuestLineComplete ? "Quest Line Complete" : Quest.Name;
        description.Description = DateTime.Now.ToString();
     
        using (FileStream stream = new FileStream(Path.Combine(storageContainer.Path, descriptionFilename), FileMode.Create))
        {
            new XmlSerializer(typeof(SaveGameDescription)).Serialize(stream, description);
        }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    // XNA 4.0
    //Save the current state of the session, with the given storage device.
     
    // check the parameter
    if ((storageDevice == null) || !storageDevice.IsConnected)
    {
        return;
    }
     
    // open the container Note: using OpenContainer method from previous examples
    using (StorageContainer storageContainer = OpenContainer(storageDevice, Session.SaveGameContainerName))
    {
        string filename;
        string descriptionFilename;
        // get the filenames
        if (overwriteDescription == null)
        {
            int saveGameIndex = 0;
            string testFilename;
            do
            {
                saveGameIndex++;
                testFilename = "SaveGame" + saveGameIndex.ToString() + ".xml";
            }
            while (storageContainer.FileExists(testFilename));
            filename = testFilename;
            descriptionFilename = "SaveGameDescription" + saveGameIndex.ToString() + ".xml";
        }
        else
        {
            filename = overwriteDescription.FileName;
            descriptionFilename = "SaveGameDescription" +
                Path.GetFileNameWithoutExtension(overwriteDescription.FileName).Substring(8) + ".xml";
        }
     
        // Note: using Stream instead of FileStream...
        using (Stream stream = storageContainer.OpenFile(filename, FileMode.Create))
        {
            using (XmlWriter xmlWriter = XmlWriter.Create(stream))
            {
                //create and write xml data...
            }
        }
     
        // create the save game description
        SaveGameDescription description = new SaveGameDescription();
        description.FileName = Path.GetFileName(filename);
        description.ChapterName = IsQuestLineComplete ? "Quest Line Complete" : Quest.Name;
        description.Description = DateTime.Now.ToString();
     
        // Note: using Stream instead of FileStream...
        using (Stream stream = storageContainer.OpenFile(descriptionFilename, FileMode.Create))
        {
            new XmlSerializer(typeof(SaveGameDescription)).Serialize(stream, description);
        }
    }
    VertexShader, PixelShader, ps_1_x Inside your shader (*.fx) files…
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // XNA 3.1
    VertexShaderOutput VertexShader(...)
    {
        //some code
    }
    float4 PixelShader(...)
    {
       // some code
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // XNA 4.0
    // VertexShader can not be used
    VertexShaderOutput  VertexShaderFunction(...)
    {
       // some code
    }
    // PixelShader can not be used
    float4 PixelShaderFunction(...)
    {
       // some code
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // XNA 3.1
    technique
    {
        pass
        {
            VertexShader = compile vs_1_1 VertexShader();
            PixelShader  = compile ps_1_1 PixelShader();
        }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // XNA 4.0
    technique
    {
        pass
        {
            VertexShader = compile vs_2_0 VertexShaderFunction(); //VertexShader can not be used & set vs higher than 1_1
            PixelShader  = compile ps_2_0 PixelShaderFunction(); //PixelShader can not be used & set ps higher than 1_1
        }
    }
    XNA Model drawn inside out, slightly transparent, missing parts or just looks wrong

    Add the following code before the XNA Model Draw code

    1
    2
    3
    4
    5
    // Set suitable renderstates for drawing a 3D model
    GraphicsDevice.BlendState = BlendState.Opaque;
    GraphicsDevice.DepthStencilState = DepthStencilState.Default;
     
    // your model draw code starts here...

    Well That’s all for now, I will continue to add more examples as needed. Good luck with your games and Remember Indie Games are the future. :)

    -Nelxon Studio

  • 相关阅读:
    Excel导入导出DataGridView
    博客开通第一天
    windows10 VM12 安装Mac OS X 10.11
    js判断IE浏览器及版本
    C# MD5 加密
    WindowsErrorCode
    localStorage,sessionStorage的使用
    js实现页面锚点定位动画滚动
    纯js实现页面返回顶部的动画
    HTML table固定表头
  • 原文地址:https://www.cnblogs.com/czjone/p/2295491.html
Copyright © 2011-2022 走看看