XNA 3.1 转换到 XNA4.0 的备忘录
xna3.1与4.0的区别不小,但也不是很大,在转换一些项目时候下面的tip能给些帮助。原文地址是:http://blogs.msdn.com/b/shawnhar/archive/2011/01/04/xna-3-1-to-4-0-cheat-sheet.aspx?utm_source=twitterfeed&utm_medium=twitter
遇到如下问题,该备忘录将解决的问题:
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
PS:其他问题,如xna模型画出边界,看起来透明或者丢失顶点以及看起来不对劲。
----------------------------------------------------------------------------------------
XNA 3.1 转为 XNA4.0 的例子:
SpriteBlendMode, SaveStateMode
// XNA 3.1 sprite.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Deferred, SaveStateMode.SaveState); // XNA 4.0 sprite.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend); // XNA 3.1 // 通过深度排列场景对象
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.BackToFront, SaveStateMode.None); // XNA 4.0 // 通过深度排列场景对象
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); // XNA 3.1 sprite.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.SaveState); // XNA 4.0 sprite.Begin(SpriteSortMode.Immediate, BlendState.Opaque); // XNA 3.1 // 画背景图
spriteBatch.Begin(SpriteBlendMode.None); Viewport viewport = GraphicsDevice.Viewport; spriteBatch.Draw(background, new Rectangle(0, 0, viewport.Width, viewport.Height), Color.White); spriteBatch.End(); // XNA 4.0 // 画背景图
spriteBatch.Begin(0, BlendState.Opaque); spriteBatch.Draw(background, GraphicsDevice.Viewport.Bounds, Color.White); spriteBatch.End();
RenderState
// XNA 3.1 // 启用alpha混合和深度写
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; // XNA 4.0 // 启用alpha混合和深度写
GraphicsDevice.BlendState = BlendState.AlphaBlend; GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead; // XNA 3.1 // 重置混合和深度写
GraphicsDevice.RenderState.AlphaBlendEnable = false; GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = false; GraphicsDevice.RenderState.DepthBufferWriteEnable = true; // XNA 4.0 // 重置混合和深度写
GraphicsDevice.BlendState = BlendState.Additive; GraphicsDevice.DepthStencilState = DepthStencilState.Default; // XNA 3.1 // 启用深度缓冲
GraphicsDevice.RenderState.DepthBufferEnable = true; // XNA 4.0 // 启用深度缓冲
GraphicsDevice.DepthStencilState = DepthStencilState.Default; // XNA 3.1 // 禁用深度缓冲
GraphicsDevice.RenderState.DepthBufferWriteEnable = false; GraphicsDevice.RenderState.DepthBufferEnable = false; // XNA 4.0 // 禁用深度缓冲
GraphicsDevice.DepthStencilState = DepthStencilState.None; // XNA 3.1 // 累加混合(zero on alpha) GraphicsDevice.RenderState.DepthBufferWriteEnable = false; GraphicsDevice.RenderState.AlphaBlendEnable = true; GraphicsDevice.RenderState.SourceBlend = Blend.One; GraphicsDevice.RenderState.DestinationBlend = Blend.One; // XNA 4.0 // 累加混合(zero on alpha) GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead; GraphicsDevice.BlendState = BlendState.AlphaBlend; // XNA 3.1 // 恢复混合模式
GraphicsDevice.RenderState.DepthBufferWriteEnable = true; GraphicsDevice.RenderState.AlphaBlendEnable = false; GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = false; // XNA 4.0 // 恢复混合模式
GraphicsDevice.BlendState = BlendState.Opaque; GraphicsDevice.DepthStencilState = DepthStencilState.Default; // XNA 3.1 // 设置alpha混合,无深度测试和深度写
GraphicsDevice.RenderState.DepthBufferEnable = false; GraphicsDevice.RenderState.DepthBufferWriteEnable = false; GraphicsDevice.RenderState.AlphaBlendEnable = true; GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha; GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha; // XNA 4.0 // 设置alpha混合,无深度测试和深度写
GraphicsDevice.DepthStencilState = DepthStencilState.None; GraphicsDevice.BlendState = BlendState.AlphaBlend; // XNA 3.1 // 绘制3D模型时设置合适渲染模式
GraphicsDevice.RenderState.AlphaBlendEnable = false; GraphicsDevice.RenderState.AlphaTestEnable = false; GraphicsDevice.RenderState.DepthBufferEnable = true; // XNA 4.0 // 绘制3D模型时设置合适渲染模式
GraphicsDevice.BlendState = BlendState.Opaque; GraphicsDevice.DepthStencilState = DepthStencilState.Default; // XNA 3.1 // 加性混合
GraphicsDevice.RenderState.AlphaBlendEnable = true; GraphicsDevice.RenderState.SourceBlend = Blend.One; GraphicsDevice.RenderState.DestinationBlend = Blend.One; // XNA 4.0 // 加性混合
GraphicsDevice.BlendState = BlendState.Additive; // XNA 3.1 // 设置加性混合
GraphicsDevice.RenderState.DestinationBlend = Blend.One; // XNA 4.0 // 设置加性混合
GraphicsDevice.BlendState = BlendState.Additive; // XNA 3.1 // 设置alpha混合
GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha; // XNA 4.0 // 设置alpha混合
GraphicsDevice.BlendState = BlendState.AlphaBlend; // XNA 3.1 GraphicsDevice.RenderState.CullMode = CullMode.CullCounterClockwiseFace; // XNA 4.0 GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; // XNA 3.1 // 设置渲染状态
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.. // 恢复状态
GraphicsDevice.RenderState.DepthBufferEnable = true; GraphicsDevice.RenderState.DepthBufferWriteEnable = true; GraphicsDevice.RenderState.AlphaBlendEnable = false; GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = false; // XNA 4.0 //存储状态
DepthStencilState ds = GraphicsDevice.DepthStencilState; BlendState bs = GraphicsDevice.BlendState; //设置渲染状态
GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead; GraphicsDevice.BlendState = BlendState.AlphaBlend; // drawing code here.. // 恢复状态
GraphicsDevice.DepthStencilState = ds; GraphicsDevice.BlendState = bs;
Effect, EffectPass, Begin(), End(), CommitChanges(), Clone()
// 应用效果 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 // 当任何效果属性改变需要调用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 // 启用效果中的tech
postprocessEffect.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 // 启用效果中的tech
postprocessEffect.CurrentTechnique = postprocessEffect.Techniques[effectTechniqueName]; // 用预处理效果画一个全屏的精灵.
spriteBatch.Begin(0, BlendState.Opaque, null, null, null, postprocessEffect); spriteBatch.Draw(sceneRenderTarget, Vector2.Zero, Color.White); spriteBatch.End();
ShaderProfile, TotalRealTime, TransparentBlack
// XNA 3.1 graphics.MinimumPixelShaderProfile = ShaderProfile.PS_3_0; //any PS number... graphics.MinimumVertexShaderProfile = ShaderProfile.VS_3_0;//any VS number... // XNA 4.0 // 不再需要该语句
// XNA 3.1 float myTime = (float)gameTime.TotalRealTime.TotalSeconds * 0.2f; // XNA 4.0 float myTime = (float)gameTime.TotalGameTime.TotalSeconds * 0.2f; // XNA 3.1 GraphicsDevice.Clear(Color.TransparentBlack); // XNA 4.0 GraphicsDevice.Clear(Color.Transparent);
ResolveTexture2D, ResolveBackBuffer, RenderTarget2D, GetTexture, DepthStencilBuffer, PresentationParameters, MultiSampleType, MultiSampleQuality, SetRenderTarget
// XNA 3.1 ResolveTexture2D sceneMap; // XNA 4.0 RenderTarget2D sceneMap; // XNA 3.1 // 查询主缓冲的分辨率和格式. PresentationParameters pp = GraphicsDevice.PresentationParameters; // 从缓冲读取一个材质数据. sceneMap = new ResolveTexture2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1, pp.BackBufferFormat); // XNA 4.0 // 查询主缓冲的分辨率和格式. PresentationParameters pp = GraphicsDevice.PresentationParameters; // 从缓冲读取一个材质数据. 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); // XNA 3.1 GraphicsDevice.ResolveBackBuffer(sceneMap); // XNA 4.0 GraphicsDevice.SetRenderTarget(sceneMap); // XNA 3.1 int width = GraphicsDevice.Viewport.Width; int height = GraphicsDevice.Viewport.Height; // 创建渲染对象
myRenderTarget = new RenderTarget2D(GraphicsDevice, width, height, 1, SurfaceFormat.Color); // XNA 4.0 int width = GraphicsDevice.Viewport.Width; int height = GraphicsDevice.Viewport.Height; // 创建渲染对象
myRenderTarget = new RenderTarget2D(GraphicsDevice, width, height, true, SurfaceFormat.Color, DepthFormat.Depth24); // XNA 3.1 PresentationParameters pp = GraphicsDevice.PresentationParameters; // 创建自动以渲染对象
sceneRenderTarget = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1, pp.BackBufferFormat, pp.MultiSampleType, pp.MultiSampleQuality); // XNA 4.0 PresentationParameters pp = GraphicsDevice.PresentationParameters; // 创建自动以渲染对象
sceneRenderTarget = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, false, pp.BackBufferFormat, pp.DepthStencilFormat, pp.MultiSampleCount, RenderTargetUsage.DiscardContents); // XNA 3.1 PresentationParameters pp = GraphicsDevice.PresentationParameters; // 配置一个深度缓冲
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); // XNA 4.0 PresentationParameters pp = GraphicsDevice.PresentationParameters; // 配置一个深度缓冲
drawBuffer = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, true, SurfaceFormat.Color,DepthFormat.Depth24Stencil8, pp.MultiSampleCount, RenderTargetUsage.DiscardContents); //NOTE: DepthStencilBuffer 类不再存在
// XNA 3.1 spriteBatch.Draw(myRenderTarget.GetTexture(), Vector2.Zero, Color.White); // XNA 4.0 spriteBatch.Draw(myRenderTarget, Vector2.Zero, Color.White); // NOTE: ".GetTexure()" 不再需要
// XNA 3.1 Texture2D myTexture = myRenderTarget.GetTexture(); // XNA 4.0 Texture2D myTexture = myRenderTarget; // NOTE: ".GetTexure()" No longer needed // XNA 3.1 GraphicsDevice.SetRenderTarget(0, myRenderTarget); // XNA 4.0 GraphicsDevice.SetRenderTarget(myRenderTarget); // XNA 3.1 // 设置两个渲染目标
GraphicsDevice.SetRenderTarget(0, colorRT); GraphicsDevice.SetRenderTarget(1, depthRT); // XNA 4.0 // 设置两个渲染目标
GraphicsDevice.SetRenderTargets(colorRT, depthRT); // XNA 3.1 GraphicsDevice.SetRenderTarget(0, null); // XNA 4.0 GraphicsDevice.SetRenderTarget(null); // XNA 3.1 // 将深度缓冲解析为深度图
GraphicsDevice.ResolveBackBuffer(depthMap); // 绘制场景图, 用深度图模糊它
GraphicsDevice.Textures[1] = depthMap; Viewport viewport = GraphicsDevice.Viewport; dofEffect.CurrentTechnique = depthBlurTechnique; DrawFullscreenQuad(sceneMap, viewport.Width, viewport.Height, dofEffect); // XNA 4.0 // 将深度缓冲解析为深度图
GraphicsDevice.SetRenderTarget(null); // 绘制场景图, 用深度图模糊它
GraphicsDevice.Textures[1] = depthMap; GraphicsDevice.SamplerStates[1] = SamplerState.PointClamp; Viewport viewport = GraphicsDevice.Viewport; dofEffect.CurrentTechnique = depthBlurTechnique; DrawFullscreenQuad(sceneMap, viewport.Width, viewport.Height, dofEffect); // XNA 3.1 ResolveTexture2D resolveTarget; RenderTarget2D renderTarget1; RenderTarget2D renderTarget2; // 查找主缓冲的分辨率和格式. PresentationParameters pp = GraphicsDevice.PresentationParameters; int width = pp.BackBufferWidth; int height = pp.BackBufferHeight; SurfaceFormat format = pp.BackBufferFormat; // 创建一个材质读取缓冲中的内容. 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... // XNA 4.0 RenderTarget2D sceneRenderTarget; RenderTarget2D renderTarget1; RenderTarget2D renderTarget2; // 查找主缓冲的分辨率和格式. . 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
// XNA 3.1 // Vertex declaration for rendering our 3D model. GraphicsDevice.VertexDeclaration = new VertexDeclaration(VertexPositionTexture.VertexElements); // XNA 4.0 // Delete it. No longer needed. // XNA 3.1 // set vertex buffer and declaration GraphicsDevice.VertexDeclaration = vertexDeclaration; GraphicsDevice.Vertices[0].SetSource(vertexBuffer, 0, VertexPositionTexture.SizeInBytes); // XNA 4.0 // set vertex buffer and declaration GraphicsDevice.SetVertexBuffer(vertexBuffer); // XNA 3.1 // create vertex declaration vertexDeclaration = new VertexDeclaration(GraphicsDevice, VertexPositionTexture.VertexElements); // XNA 4.0 // create vertex declaration vertexDeclaration = new VertexDeclaration(VertexPositionTexture.VertexDeclaration.GetVertexElements()); // XNA 3.1 // reset vertex buffer declaration GraphicsDevice.VertexDeclaration = null; GraphicsDevice.Vertices[0].SetSource(null, 0, 0); // XNA 4.0 // reset vertex buffer declaration GraphicsDevice.SetVertexBuffer(null); // 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); // 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
// 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; ... // 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; ... // XNA 3.1 // draw primitives GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, meshPart.BaseVertex, 0, meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount); // XNA 4.0 // draw primitives GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, meshPart.VertexOffset, 0, meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount);
Points, PointSpriteEnable, PointSizeMax, PointList
// XNA 3.1 // create the vertex buffer vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionNormalTexture), 250, BufferUsage.WriteOnly | BufferUsage.Points); // XNA 4.0 // create the vertex buffer vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionNormalTexture), 250, BufferUsage.WriteOnly | BufferUsage.None); // XNA 3.1 // enable point sprite 3.1 GraphicsDevice.RenderState.PointSpriteEnable = true; GraphicsDevice.RenderState.PointSizeMax = 128; // XNA 4.0 // Delete it. No longer available. // XNA 3.1 // draw the point sprites GraphicsDevice.DrawPrimitives(PrimitiveType.PointList, vertexPosition, numberVertices); // XNA 4.0 // draw the point sprites GraphicsDevice.DrawPrimitives(PrimitiveType.LineList, vertexPosition, numberVertices);
OpenContainer, BeginShowStorageDeviceSelector, EndShowStorageDeviceSelector, Path, TitleLocation, FileStream
// XNA 3.1 // open the container StorageContainer storageContainer = storageDevice.OpenContainer("YourGameName"); // 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"); // XNA 3.1 // retrieve the storage device Guide.BeginShowStorageDeviceSelector(GetStorageDeviceResult, retrievalDelegate); // XNA 4.0 // retrieve the storage device if (!Guide.IsVisible) { StorageDevice.BeginShowSelector(GetStorageDeviceResult, retrievalDelegate); } // XNA 3.1 // retrieve and store the storage device storageDevice = Guide.EndShowStorageDeviceSelector(result); // XNA 4.0 // retrieve and store the storage device storageDevice = StorageDevice.EndShowSelector(result); // XNA 3.1 // get the level setup files string[] filenames = Directory.GetFiles(storageContainer.Path, "LevelSetup*.xml"); // XNA 4.0 // get the level setup files string[] filenames = storageContainer.GetFileNames("LevelSetup*.xml""); // 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); } // XNA 4.0 // save game level data using (Stream stream = storageContainer.OpenFile(levelFilename, FileMode.Create)) { new XmlSerializer(typeof(SaveGameLevel)).Serialize(stream, levelData); } // 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")); } // 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"); } // 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); // 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); // 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); } } // 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
// XNA 3.1 VertexShaderOutput VertexShader(...) { //some code } float4 PixelShader(...) { // some code } // XNA 4.0 // VertexShader can not be used VertexShaderOutput VertexShaderFunction(...) { // some code } // PixelShader can not be used 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(); //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
// Set suitable renderstates for drawing a 3D model GraphicsDevice.BlendState = BlendState.Opaque; GraphicsDevice.DepthStencilState = DepthStencilState.Default; // your model draw code starts here...
posted on 2011-02-01 22:57 Meta.Grfx 阅读(6063) 评论(3) 编辑 收藏 举报