如何在Windows Phone 7 3D开发中使用纹理贴图
创始人
2024-07-23 06:31:22
0

Windows Phone 7对3D的支持还是不错的,据说是用OpenGL/ES做的,使用起来倒是也有点那种感觉。本文就不讲XNA 4.0的游戏框架了,直接上一段代码,该代码使用VertexPositionColor渲染了一个三角形,程序运行一切正常。

  1. + expand sourceview plaincopy to clipboardprint?  
  2.  

运行结果如下:

运行结果

在确认了3D开发的这种代码结构以后,用VertexPositionTexture渲染同样的三角形,只是这次采用纹理贴图,代码如下:

  1.    
  2. view plaincopy to clipboardprint?  
  3. VertexPositionTexture[] trangleTexture;    
  4.     
  5. protected override void LoadContent()    
  6. {    
  7.     spriteBatch = new SpriteBatch(GraphicsDevice);    
  8.     
  9.     image = Content.Load(@"Images/Tulips");    
  10.     trangleTexture = new VertexPositionTexture[]{    
  11.         new VertexPositionTexture(new Vector3(0, 1, 0),new Vector2(0.5f,0) ),    
  12.         new VertexPositionTexture(new Vector3(1, -1, 0),new Vector2(1,1f) ),    
  13.         new VertexPositionTexture(new Vector3(-1,-1, 0),new Vector2(0,1f) )    
  14.     };    
  15.     
  16.     vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionTexture), trangleTexture.Length, BufferUsage.None);    
  17.     vertexBuffer.SetData(trangleTexture);    
  18.     
  19.     basicEffect = new BasicEffect(GraphicsDevice);    
  20.     
  21.     GraphicsDevice.SetVertexBuffer(vertexBuffer);    
  22. }    
  23.     
  24. protected override void Draw(GameTime gameTime)    
  25. {    
  26.     GraphicsDevice.Clear(Color.CornflowerBlue);    
  27.     
  28.     basicEffect.World = world;    
  29.     basicEffect.View = camera.view;    
  30.     basicEffect.Projection = camera.projection;    
  31.     basicEffect.Texture = image;    
  32.     basicEffect.TextureEnabled = true;    
  33.     
  34.     foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes)    
  35.     {    
  36.         pass.Apply();    
  37.         GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleStrip, trangleTexture, 0, 1);    
  38.     }    
  39.     base.Draw(gameTime);    
  40. }    

啰嗦一句,在此代码中VertexPositionTexture的第二个Vetex2代表的是UV坐标,对应的含义是(0,0)点对应了纹理图片的左上角,(1,1)点对应了纹理图片的右下角。

上述代码在运行的时候会在VS2010的输出窗口中显示:

A first chance exception of type 'System.NotSupportedException' occurred in Microsoft.Xna.Framework.Graphics.dll
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in Microsoft.Xna.Framework.dll
同时模拟器里的程序直接退出,看不到结果。原因是什么呢?疑惑并仔细检视代码中……

与前一个彩色三角形对比,顶点顺序没变,摄像机位置没变,投影矩阵没变,按说是不可能出现这种问题的,而且程序直接崩了,没有信息抛出,真是很郁闷。

经过不断的试错,在宣布放弃之前,忽然想起来关于纹理方面的一个注意事项。有过3D开发经验的朋友都知道,纹理是要求符合2的整数次方对齐的,而我所加载的来自于外部任意图片的纹理不符合这一要求,所以程序挂了。

又查了一些资料,找到了准确的原因。原来是Windows Phone 7 的XNA中默认的纹理寻址模式使用了Wrap,造成了与GPU的不兼容,如果改成Clamp就好了。

看来在这个地方微软得要有文档说明才好,否则还真是难找问题所在。修改后的代码如下:

  1. view plaincopy to clipboardprint?  
  2. protected override void LoadContent()    
  3. {    
  4.     // Create a new SpriteBatch, which can be used to draw textures.    
  5.     spriteBatch = new SpriteBatch(GraphicsDevice);    
  6.     
  7.     image = Content.Load(@"Images/Tulips");    
  8.     
  9.     trangleTexture = new VertexPositionTexture[]{    
  10.         new VertexPositionTexture(new Vector3(0, 1, 0),new Vector2(0.5f,0) ),    
  11.         new VertexPositionTexture(new Vector3(1, -1, 0),new Vector2(1,1f) ),    
  12.         new VertexPositionTexture(new Vector3(-1,-1, 0),new Vector2(0,1f) )    
  13.     };    
  14.     
  15.     vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionTexture), trangleTexture.Length, BufferUsage.None);    
  16.     vertexBuffer.SetData(trangleTexture);    
  17.     
  18.     basicEffect = new BasicEffect(GraphicsDevice);    
  19.     
  20.     GraphicsDevice.SetVertexBuffer(vertexBuffer);    
  21.     GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp;    
  22. }    
  23.  

最终的模拟器结果是:

最终的模拟器结果

不管怎么说,Windows Phone 7的XNA游戏开发框架以及3D方面的开发接口还是很出色的,顶一下微软,并希望这个平台能尽快发展起来。

附Camera的代码:

  1. view plaincopy to clipboardprint?  
  2. using System;    
  3. using System.Collections.Generic;    
  4. using System.Linq;    
  5. using Microsoft.Xna.Framework;    
  6. using Microsoft.Xna.Framework.Audio;    
  7. using Microsoft.Xna.Framework.Content;    
  8. using Microsoft.Xna.Framework.GamerServices;    
  9. using Microsoft.Xna.Framework.Graphics;    
  10. using Microsoft.Xna.Framework.Input;    
  11. using Microsoft.Xna.Framework.Media;    
  12.     
  13.     
  14. namespace WindowsPhoneGame1    
  15. {    
  16.     public class Camera : Microsoft.Xna.Framework.GameComponent    
  17.     {    
  18.         public Matrix view{get;protected set;}    
  19.         public Matrix projection { get; protected set; }    
  20.     
  21.         public Camera(Game game,Vector3 pos,Vector3 target,Vector3 up)    
  22.             : base(game)    
  23.         {    
  24.             view = Matrix.CreateLookAt(pos, target, up);    
  25.             projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (float)game.Window.ClientBounds.Width / (float)game.Window.ClientBounds.Height, 1, 100);    
  26.         }    
  27.     
  28.         public override void Initialize()    
  29.         {    
  30.             base.Initialize();    
  31.         }    
  32.     
  33.         public override void Update(GameTime gameTime)    
  34.         {    
  35.             base.Update(gameTime);    
  36.         }    
  37.     }    
  38. }    
  39.  

本文转自http://blog.csdn.net/caowenbin

【编辑推荐】

  1. Windows Phone 7中用好Silverlight开发利器
  2. Windows Phone 7的地图控件
  3. Windows Phone 7的枢轴控件
  4. Windows Phone 7的全景视图控件
  5. 使用独立存储开发Windows Phone 7应用程序

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...