XNA:2D图元与3D模型共存时的渲染问题
2010-07-15 15:39
501 查看
在XNA开发3D游戏过程中不可避免会用到2D纹理渲染,比如做游戏的主界面、背景图、选项框或者物品库等等,一般使用SpriteBatch方法渲染2D Texture,但这样会导致你的3D模型出错:变透明或是虚化,如果在3D空间中还有2D的图片(如作为空间内地板或者墙壁之用),这部分内容也将比例失常。究其原因是在SpriteBatch.begin()渲染完2D精灵(图片)以后你的3D图形管理器不再能正确使用,SpriteBatch 改变了一些驱动设备的渲染状态值,而这些值修改后令你的3D渲染不能正常工作。
对于XNA的初学者来说,一种避免这个问题的简易方法是在SpriteBatch.begin()中的SaveStateMode设置为SaveStateMode.SaveState,但是这样会导致一个潜在的缺陷或危险:它使得你的保存和修改驱动设备状态变得更慢。所以你如果经常这么做的话,你的帧速将会受创。
一种更为有效的方式是在你绘制任何图形图像之前总是设置这些值,而不管你所需要的渲染状态是什么。SpriteBatch将自动修改这些设置值以满足它绘制2D图形图像的需要,所以你只需要在绘制3D图形图像前将它们设置回来就行。
那SpriteBatch 到底修改了哪些渲染状态呢?以下是完整列表:
SpriteBatch 也修改了GraphicsDevice的Vertices, Indices、VertexDeclaration、VertexShader和PixelShader 属性。
对于2D和3D渲染,许多这些设置都是好的,但是在你绘制任何3D图形前可能需要重设这些状态,以使GraphicsDevice为3D模型渲染服务:
GraphicsDevice.RenderState.DepthBufferEnable = true;
GraphicsDevice.RenderState.AlphaBlendEnable = false;
GraphicsDevice.RenderState.AlphaTestEnable = false;
如果你还3D空间中渲染了立体的2D图片、纹理,那你还要设置以下属性:
对于XNA的初学者来说,一种避免这个问题的简易方法是在SpriteBatch.begin()中的SaveStateMode设置为SaveStateMode.SaveState,但是这样会导致一个潜在的缺陷或危险:它使得你的保存和修改驱动设备状态变得更慢。所以你如果经常这么做的话,你的帧速将会受创。
一种更为有效的方式是在你绘制任何图形图像之前总是设置这些值,而不管你所需要的渲染状态是什么。SpriteBatch将自动修改这些设置值以满足它绘制2D图形图像的需要,所以你只需要在绘制3D图形图像前将它们设置回来就行。
那SpriteBatch 到底修改了哪些渲染状态呢?以下是完整列表:
GraphicsDevice.RenderState.CullMode = CullMode.CullCounterClockwiseFace; GraphicsDevice.RenderState.DepthBufferEnable = false; GraphicsDevice.RenderState.AlphaBlendEnable = true; GraphicsDevice.RenderState.AlphaBlendOperation = BlendFunction.Add; GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha; GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha; GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = false; GraphicsDevice.RenderState.AlphaTestEnable = true; GraphicsDevice.RenderState.AlphaFunction = CompareFunction.Greater; GraphicsDevice.RenderState.ReferenceAlpha = 0; GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Clamp; GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Clamp; GraphicsDevice.SamplerStates[0].MagFilter = TextureFilter.Linear; GraphicsDevice.SamplerStates[0].MinFilter = TextureFilter.Linear; GraphicsDevice.SamplerStates[0].MipFilter = TextureFilter.Linear; GraphicsDevice.SamplerStates[0].MipMapLevelOfDetailBias = 0.0f; GraphicsDevice.SamplerStates[0].MaxMipLevel = 0;
SpriteBatch 也修改了GraphicsDevice的Vertices, Indices、VertexDeclaration、VertexShader和PixelShader 属性。
对于2D和3D渲染,许多这些设置都是好的,但是在你绘制任何3D图形前可能需要重设这些状态,以使GraphicsDevice为3D模型渲染服务:
GraphicsDevice.RenderState.DepthBufferEnable = true;
GraphicsDevice.RenderState.AlphaBlendEnable = false;
GraphicsDevice.RenderState.AlphaTestEnable = false;
如果你还3D空间中渲染了立体的2D图片、纹理,那你还要设置以下属性:
GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Wrap; GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Wrap;
原文:http://blogs.msdn.com/b/shawnhar/archive/2006/11/13/spritebatch-and-renderstates.aspx
相关文章推荐
- XNA:2D图元与3D模型共存时的渲染问题
- XNA:2D图元与3D模型共存时的渲染问题
- 2D纹理与3D模型共存时的渲染问题
- 关于Unity在2D的UGUI和3D模型交错时渲染顺序的一点探讨
- XNA 4.0中由于混用2D、3D绘图导致的问题解决
- xna 4.0 在3D 场景中用spritebatch 写2D文字3D显示不正常的问题
- Flash Stage3D 在2D UI 界面上显示3D模型问题完美解决
- DirectX游戏编程入门——第二部分(游戏编程工具箱) ——渲染3D模型文件
- [unity3d]设置3D模型显示在2D背景之前(多个相机分层显示)
- 【PhotoShop】【ARkit】3d模型单独渲染阴影的一种方法给ARKIT用
- Demo:无需专业知识 轻松将2D大头照变成3D模型
- 从零3D基础入门XNA 4.0(2)——模型和BasicEffect
- Hands-On Lab XNA 3D 模型浏览器
- Unity 3d导入3dMax模型 产生若干问题
- 能通过一张照片(2D)得到3D的模型吗?
- 笔记 3d模型转为 2dUI中的 坐标
- 在XNA中渲染显示3DsMax中的模型(FBX)
- 从2D地图到3D城市模型的概略路线
- XNA 的 3D 和 2D 游戏引擎(商业与开源)
- 【Metal API 教程:第二讲】编写Metal Shader并渲染3D模型(上)