在XNA开发3D游戏过程中不可避免会用到2D纹理渲染,比如做游戏的主界面、背景图、选项框或者物品库等等,一般使用SpriteBatch方法渲染2D Texture,但这样会导致你的3D模型出错:变透明或是虚化或是UV贴图错误,如果在3D空间中还有2D的图片(如作为空间内地板或者墙壁之用),这部分内容也将比例失常。

究其原因是在SpriteBatch.begin()渲染完2D精灵(图片)以后你的3D图形管理器不再能正确使用,SpriteBatch 改变了一些驱动设备的渲染状态值,而这些值修改后令你的3D渲染不能正常工作。

实际上,在使用SpriteBatch方法渲染2D 材质时,我们注意下SpriteBatch.Begin()默认方法

//Begins a sprite batch operation using deferred sort and default state objects (BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullCounterClockwise).

SpriteBatch.Begin();

很显然,在3D模型绘制时,根据需要重新设置下驱动设备的渲染参数。

           RasterizerState rs = new RasterizerState();
            rs.CullMode = CullMode.None;
 /*关闭消隐模式*/

            gd.RasterizerState = rs;
            gd.BlendState = BlendState.AlphaBlend;
            gd.DepthStencilState = DepthStencilState.Default;
           gd.SamplerStates[0] = SamplerState.LinearWrap;/*Wrap模式*/

我们这里很少绘制2D纹理,一旦绘制则出现模型的UV贴图、背面消隐错误,因此, 可以在2D材质的渲染时使用改方法spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearWrap, DepthStencilState.None, RasterizerState.CullNone);3D模型绘制时不需要再修改图形设备参数。

UV显示错误

UV显示正确

我们看下Direct3D的纹理寻址模式

Direct3D定义了4种纹理寻址模式来处理纹理坐标超出[0, 1]范围的纹理映射方法,它们分别是重叠映射寻址(wrap texture address mode)、镜像纹理寻址(mirror texture address mode)、夹取纹理寻址(clamp texture address mode)、边框颜色纹理寻址(border color texture address mode)。

重叠纹理寻址模式

使用重叠纹理寻址模式时,Direct3D会在每个整数纹理坐标连接处自动重复纹理。例如,应用程序创建了一个正方形图元,并指定4个顶点的纹理坐标为(0.0, 0.0)、(0.0, 3.0)、(3.0, 3.0)、(3.0, 0.0)。使用重叠纹理寻址,Direct3D就会在u、v方向各复制3遍原始纹理,如下图所示:

重叠纹理寻址是Direct3D中缺省的寻址模式,也是三维系统中最常用的寻址模式之一。在渲染具有诸如砖墙之类纹理的物体时,如果使用包含一整张砖墙的纹理贴图会占用较多的内存,通常只需载入一张具有一块或多块砖瓦的较小的纹理贴图,再把它按照重叠纹理寻址模式在物体表面映射多次,就可以达到和使用整张砖墙贴图同样的效果。

镜像纹理寻址模式

使用镜像纹理寻址模式时,Direct3D会在每个整数纹理坐标连接处自动复制并翻转纹理。例如,应用程序创建了一个正方形图元,并指定4个顶点的纹理坐标为(0.0, 0.0)、(0.0, 3.0)、(3.0, 3.0)、(3.0, 0.0)。采用镜像纹理寻址模式,Direct3D就会在u、v方向各复制3遍并翻转原始纹理图,所有的行和列都是前一行或列的镜像,如下图所示:

夹取纹理寻址模式

夹取纹理寻址模式将纹理坐标夹取在[0.0, 1.0]范围之内。也就是说,它将纹理复制一遍,然后将纹理边缘像素的颜色延伸。例如,应用程序创建了一个正方形图元,并指定4个顶点的纹理坐标为(0.0, 0.0)、(0.0, 3.0)、(3.0, 3.0)、(3.0, 0.0)。将u、v方向上的纹理寻址模式都设置为夹取纹理寻址模式时的效果如下图所示:

原纹理

使用夹取纹理寻址模式后的效果图

用枚举类型D3DTEXTUREADDRESS的成员D3DTADDRESS_CLAMP指定夹取纹理寻址模式。下面的示例代码设置纹理层0的u、v方向寻址模式为夹取纹理寻址模式:

边框颜色纹理寻址模式

边框颜色纹理寻址模式用枚举类型D3DTEXTUREADDRESS的成员D3DTADDRESS_BORDER指定,当纹理坐标超出[0.0, 1.0]范围时,Direct3D使用边框颜色代替纹理颜色。

边框颜色通过调用函数IDirect3DDevice9::SetSamplerState()设置,第一个参数设为纹理层序号,第二个参数设为D3DSAMP_BORDERCOLOR,第三个参数设为所需的边框颜色,为D3DCOLOR类型,以32位整数表示A、R、G、B颜色。下面的示例代码指定边框颜色为红色,并设置纹理层0的u、v方向寻址模式为边框颜色纹理寻址模式。

g_device->SetSamplerState(0, D3DSAMP_BORDERCOLOR, 0xFFFF0000); g_device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); g_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);

渲染的结果如下图所示:

原纹理

使用边框颜色纹理寻址模式后的效果图

转载于:https://www.cnblogs.com/jdmei520/archive/2013/01/12/2857352.html

2D纹理与3D模型共存时的渲染问题相关推荐

  1. XNA:2D图元与3D模型共存时的渲染问题

    本文为Rumon863原创翻译,此处为收藏,转载请按如下方式显式标明原创作者以及文章出处,以示尊重!! 翻译:Rumon863 文章出处:http://blog.csdn.net/rumon863/a ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. DirectX11--深入理解与使用2D纹理资源

    前言 写教程到现在,我发现有关纹理资源的一些解说和应用都写的太过分散,导致连我自己找起来都不方便.现在决定把这部分的内容整合起来,尽可能做到一篇搞定所有2D纹理相关的内容,其中包括: 纹理映射的基础回 ...

最新文章

  1. Oracle数据库实用脚本
  2. linux查看服务器设备信息命令dmidecode
  3. Java绘图模式概述
  4. web项目没有run on server时..
  5. 美国计算机科学专业申请要求,美国计算机科学专业好申请吗?申请要求高不高...
  6. 判断一段文件是UTF-8编码还是GB2312的编码方式
  7. 毕昇 JDK:“传奇再现”华为如何打造 ARM 上最好用的 JDK?
  8. js中将有层级关系的一维数据转换为父子级关系的二维数据、菜单权限三级层级数据实现(树形结构数据)
  9. idea2020.2中@test是怎么测试的_Sklearn 划分训练集和测试集
  10. 联想战略储备看创投,联想创投All in智能互联网
  11. 郭天祥 十天搞定单片机 (1)基础知识和点亮发光二极管
  12. 护肤品html作业,聚美优品美容产品热点.html
  13. redis 的6种过期策略
  14. 速卖通API获得aliexpress商品详情,按关键词搜索,分类详情等数据
  15. (四)双击放大与缩小图片
  16. Storm学习——事务和案例
  17. 将土地利用和土壤类型导入WMS
  18. Android 应用程序
  19. Mybatis-Plus代码生成器CodeGenerator
  20. 牛津、剑桥、哈佛的血缘关系

热门文章

  1. 市场推广的及时性要素
  2. 网工必考的8个dos命令
  3. IWAM账号 HTTP500内部错误
  4. 封禁3年,微信重磅功能回归!
  5. 面试官就是这么欺负人:new Object()到底占用几个字节?
  6. 普通程序员如何向人工智能方向转型?
  7. 组了个视频号的局,汇报下数据!
  8. *第四周*数据结构实践项目一【创建单链表】
  9. P1052 过河 线性dp
  10. Linux入门:PuTTY实现Linux和Windows文件互传