XNA:2D图元与3D模型共存时的渲染问题
本文为Rumon863原创翻译,此处为收藏,转载请按如下方式显式标明原创作者以及文章出处,以示尊重!!
翻译:Rumon863
文章出处:http://blog.csdn.net/rumon863/archive/2010/07/15/5737324.aspx
在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 到底修改了哪些渲染状态呢?以下是完整列表:
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
常规SpriteBatch渲染状态恢复函数:
void RestoreRenderStates() renderState.DepthBufferEnable = true; SamplerState samplerState = GraphicsDevice.SamplerStates[0]; samplerState.AddressU = TextureAddressMode.Wrap; |
XNA:2D图元与3D模型共存时的渲染问题相关推荐
- 2D图片转3D模型软件介绍
原文http://protoduct.com/post/2012-09-28/40038833931 如果说3D打印是从虚拟到现实的桥梁,那么3D扫描就是那段回程.3D打印要想得到普及,普通消费者能够 ...
- 2D 照片变身 3D 模型,来看英伟达的 AI 新“魔法”!
整理 | 郑丽媛 出品 | CSDN 在本周举办的计算机视觉和模式识别会议(CVPR)上,英伟达推出了一种名为 3D MoMa 的 AI "魔法":将静态 2D 照片转换为可轻松编 ...
- Unity Render Streaming,3D模型流式云渲染的解决方案
Unity Render Streaming是Unity开源的一个高质量.高复杂的3D模型在云端渲染,手机端侧.浏览器显示的解决方案.此解决方案的流技术利用了WebRTC,开发人员甚至可以使用WebR ...
- Unity 2D平面显示3D模型(RenderTextrue)
先创建一个 RawImage 再在文件里创建一个RenderTextrue 在RawImage组件上添加RenderTexture 再创建个Camera(相机)相机对准模型,相机的ClearFlags ...
- 3D卷积GAN飞起!微软“可缩放”新框架只需2D数据即可生成逼真3D模型
点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自新智元. 新智元报道 来源:VB 编辑:元子 [新智元导读]Microsoft Research近日发表论文介绍了一种通过2D数据生成 ...
- 2D景观转3D风景大片,无惧复杂光线与遮挡,人类离「躺着旅行」的梦想又近了一步...
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 整理:公众号@机器之心 本文仅做学术分享,如有侵权,请联系删除. 万物皆可转 3D. 上班的时候想旅行 ...
- 在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图
在Jerry写这篇文章时,通过Google才知道,SAP其实是有自己的3D模型视图显示解决方案的. 故事要从Right Hemisphere说起,这是一家专业的企业级2D/3D模型浏览及转换的软件供应 ...
- 谷歌2D景观转3D风景大片,无惧复杂光线与遮挡
本文转自机器之心. 编辑:张倩.小舟.蛋酱 万物皆可转 3D. 上班的时候想旅行,休假的时候想躺着,这是大多数年轻人的状态.如果能够躺在床上旅行,岂不美哉? 在古代中国也有「卧游」的典故,凡所游履,皆 ...
- 2D游戏比3D游戏哪个更好做?游戏行业什么职业最吃香?
通常情况下,同样档次2D游戏,开发成本和难度低于3D游戏. 对比两组共六个游戏,分别说明目前业界在2D游戏和3D游戏不同做法. 2D游戏(征途) 2D游戏(龙之皇冠) 2D游戏(奥利和迷雾森林) 3D ...
最新文章
- SaaS加速器 I 商业中心:提供商业助力 共享商业成功
- 关于MYSQL中like 检索汉字问题。
- 计划订单号码范围用完导致MRP无法运行
- 【黑马程序员】————预处理指令1-宏定义
- SpringBoot_数据访问-整合MyBatis(二)-配置版MyBatis
- 蓝牙技术的工作原理及用途
- C和指针之高级指针话题通过函数指针实现在链表中找到特定的值
- 计算机与生命科学专业排名,2019软科世界一流学科排名发布,54个专业TOP10牛校榜单全给你...
- 实验吧web-中-忘记密码了
- 万人马拉松,人脸识别系统如何又快又准完成校验?
- 左耳朵耗子:聊聊分布式系统架构
- 网际协议IP与其配套协议
- 每天一道算法题:无重复字符的最长子串
- Julia: ...的作用,有意思!
- pbrt3在windows10环境中的编译、安装及测试教程
- Android Webview下载Blob文件
- win10显卡驱动怎么装_既然大家都说装了win10,就不用鲁大师监测显卡温度,为什么呢?...
- excel制作表格的详细步骤
- 统计模型——贝叶斯统计模型,负二项分布
- 企业微信群发消息提醒
热门文章
- ❤️《小黄鸭调试法》程序员必备技能!!!❤️
- 2D 转换之 scale
- html选择器 并列,CSS 中的选择器 (二)- 组合选择器
- pyaudio usb playback_电脑USB接口怎么禁用?系统禁用USB端口的两种方法
- linux下ssh/sftp配置和权限设置
- 浅谈vue —— 生命周期
- CentOS 7 多网卡绑定
- 《强化学习》中的第10章:基于函数逼近的同轨策略控制
- Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战
- 邮件怎发送HTML,请问怎么发送HTML电子邮件