本文为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 renderState = GraphicsDevice.RenderState;

renderState.DepthBufferEnable = true;
            renderState.AlphaTestEnable = false;
            renderState.AlphaBlendEnable = false;

SamplerState samplerState = GraphicsDevice.SamplerStates[0];

samplerState.AddressU = TextureAddressMode.Wrap;
            samplerState.AddressV = TextureAddressMode.Wrap;
        }

XNA:2D图元与3D模型共存时的渲染问题相关推荐

  1. 2D图片转3D模型软件介绍

    原文http://protoduct.com/post/2012-09-28/40038833931 如果说3D打印是从虚拟到现实的桥梁,那么3D扫描就是那段回程.3D打印要想得到普及,普通消费者能够 ...

  2. 2D 照片变身 3D 模型,来看英伟达的 AI 新“魔法”!

    整理 | 郑丽媛 出品 | CSDN 在本周举办的计算机视觉和模式识别会议(CVPR)上,英伟达推出了一种名为 3D MoMa 的 AI "魔法":将静态 2D 照片转换为可轻松编 ...

  3. Unity Render Streaming,3D模型流式云渲染的解决方案

    Unity Render Streaming是Unity开源的一个高质量.高复杂的3D模型在云端渲染,手机端侧.浏览器显示的解决方案.此解决方案的流技术利用了WebRTC,开发人员甚至可以使用WebR ...

  4. Unity 2D平面显示3D模型(RenderTextrue)

    先创建一个 RawImage 再在文件里创建一个RenderTextrue 在RawImage组件上添加RenderTexture 再创建个Camera(相机)相机对准模型,相机的ClearFlags ...

  5. 3D卷积GAN飞起!微软“可缩放”新框架只需2D数据即可生成逼真3D模型

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自新智元.   新智元报道   来源:VB 编辑:元子 [新智元导读]Microsoft Research近日发表论文介绍了一种通过2D数据生成 ...

  6. 2D景观转3D风景大片,无惧复杂光线与遮挡,人类离「躺着旅行」的梦想又近了一步...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 整理:公众号@机器之心 本文仅做学术分享,如有侵权,请联系删除. 万物皆可转 3D. 上班的时候想旅行 ...

  7. 在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图

    在Jerry写这篇文章时,通过Google才知道,SAP其实是有自己的3D模型视图显示解决方案的. 故事要从Right Hemisphere说起,这是一家专业的企业级2D/3D模型浏览及转换的软件供应 ...

  8. 谷歌2D景观转3D风景大片,无惧复杂光线与遮挡

    本文转自机器之心. 编辑:张倩.小舟.蛋酱 万物皆可转 3D. 上班的时候想旅行,休假的时候想躺着,这是大多数年轻人的状态.如果能够躺在床上旅行,岂不美哉? 在古代中国也有「卧游」的典故,凡所游履,皆 ...

  9. 2D游戏比3D游戏哪个更好做?游戏行业什么职业最吃香?

    通常情况下,同样档次2D游戏,开发成本和难度低于3D游戏. 对比两组共六个游戏,分别说明目前业界在2D游戏和3D游戏不同做法. 2D游戏(征途) 2D游戏(龙之皇冠) 2D游戏(奥利和迷雾森林) 3D ...

最新文章

  1. SaaS加速器 I 商业中心:提供商业助力 共享商业成功
  2. 关于MYSQL中like 检索汉字问题。
  3. 计划订单号码范围用完导致MRP无法运行
  4. 【黑马程序员】————预处理指令1-宏定义
  5. SpringBoot_数据访问-整合MyBatis(二)-配置版MyBatis
  6. 蓝牙技术的工作原理及用途
  7. C和指针之高级指针话题通过函数指针实现在链表中找到特定的值
  8. 计算机与生命科学专业排名,2019软科世界一流学科排名发布,54个专业TOP10牛校榜单全给你...
  9. 实验吧web-中-忘记密码了
  10. 万人马拉松,人脸识别系统如何又快又准完成校验?
  11. 左耳朵耗子:聊聊分布式系统架构
  12. 网际协议IP与其配套协议
  13. 每天一道算法题:无重复字符的最长子串
  14. Julia: ...的作用,有意思!
  15. pbrt3在windows10环境中的编译、安装及测试教程
  16. Android Webview下载Blob文件
  17. win10显卡驱动怎么装_既然大家都说装了win10,就不用鲁大师监测显卡温度,为什么呢?...
  18. excel制作表格的详细步骤
  19. 统计模型——贝叶斯统计模型,负二项分布
  20. 企业微信群发消息提醒

热门文章

  1. ❤️《小黄鸭调试法》程序员必备技能!!!❤️
  2. 2D 转换之 scale
  3. html选择器 并列,CSS 中的选择器 (二)- 组合选择器
  4. pyaudio usb playback_电脑USB接口怎么禁用?系统禁用USB端口的两种方法
  5. linux下ssh/sftp配置和权限设置
  6. 浅谈vue —— 生命周期
  7. CentOS 7 多网卡绑定
  8. 《强化学习》中的第10章:基于函数逼近的同轨策略控制
  9. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战
  10. 邮件怎发送HTML,请问怎么发送HTML电子邮件