Windows Phone 7 3D开发中使用纹理贴图

  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<Texture2D>(@"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<VertexPositionTexture>(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<VertexPositionTexture>(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<Texture2D>(@"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<VertexPositionTexture>(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. publicclass 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.

时间: 2024-10-23 20:14:46

Windows Phone 7 3D开发中使用纹理贴图的相关文章

Windows Phone 7 3D开发中使用纹“.NET研究”理贴图

Windows Phone 7对3D的支持还是不错的,据说是用OpenGL/ES做的,使用起来倒是也有点那种感觉.本文就不讲XNA 4.0的游戏框架了,直接上一段代码,该代码使用VertexPositionColor渲染了一个三角形,程序运行一切正常. 1. + expand sourceview plaincopy to clipboardprint? 2. 运行结果如下: 在确认了3D开发的这种代码结构以后,用VertexPositionTexture渲染同样的三角形,只是这次采用纹理贴图,

Windows phone 8.1开发中如何处理摄像头翻转的问题

模拟器就像我们儿时的梦境,在其上运行应用程序时,一切总是那么美好的:而真机测试如同我们这个纷乱无章的现实世界,你会遇到各种小人和畜生,常常会遭受莫名的挫折.面对挫折,有人迎难而上,或不予理采,走自己的路:有的人则打退堂鼓. 面对摄像头翻转的问题,有些人也会选择逃避.我为什么不喜欢现在的某些程序员,就是因为这些人只会逃避和制造问题,遇到问题不是去寻找解决方案,而是坐在那里喊爹骂娘.虽然不可能所有问题都可以解决,但是,有许多问题是可以解决的,而这些人总心浮气躁,不愿意静下心来好好思考. N+6年前我

Windows phone 8.1开发中如何解决摄像头翻转问题(RuntimeApp篇)

昨天,我非常马虎地给大家说了有关处理物理摄像头翻转的话题,今天,还是这个话题,而且内容不差,只是为了完整性,顺便也提供了运行时API的版本,其实实现起来与SL框架版本差不多,毕竟这两个框架都有不少API是共享的. 首先,打开清单文件,在"应用程序"选项卡上,把"支持的旋转"右面的横向选上,其他的不要选,只选横向. 开发中如何解决摄像头翻转问题(RuntimeApp篇)-runtime error解决"> 然后切换到"功能"选项卡,

Windows Phone 7 XNA开发中使用游戏组件

在做复杂的XNA应用时,单独的Game1类是无法满足众多物件摆放在一起同时进行处理的,就象面向过程到面向对象的进步一样,也就是我们不能把每个物件的创建与处理都在Game1中进行,那样的话Game1类将的重构和复用将无法进行,因为太乱了. 在早期的XNA中,我们需要使用一些设计模式来解决物件对象化的问题,但是在目前的版本中,微软提供给我们一个"游戏组件"的项可选择添加到游戏项目中,从而解决了复杂的物件问题.具体步骤如下: 1.在解决方案资源管理器的项目中点右建->添加新建项->

Windows phone 8.1开发中解决调用真实摄像头会死机的问题

无论你是用Silverlight还是用RT的API来开发,在使用MediaCapture拍照片或录视频时,要是在模拟器上运行会万事大吉:但是,一旦放到真实手机上运行,肯定有人发现了,细心的朋友肯定发现了--不知道为什么,会经常导致手机重启,或者死机. 啊,顺便给大家说说,死机不可怕,也不用重置,也不用刷机,不会丢失资料的,你只要同时按下"音量减"+"电源"两个键,要同时按住,不要放开,大约等10多秒后,会关机,然后你再放开这两个键,这样手机就软启了,不会丢失数据.

Windows Phone 8.1开发中如何把自定义字体塞进应用里

或许,系统自带的字体不足以体现应用程序的魅力,对于表现极强的汉字来说,更是如此.这时候,我们就会想,要是能把网上下载的艺术字体塞到应用包中,那岂不美哉?那么,这可以实现吗?答案是Yes的. 接下来,阿拉就给大家分别演示WP 8.1两个开发框架中如何嵌入自定义字体. 为啥是两大框架?我们知道从7x到8.0的开发框架是Silverlight for Windows Phone,为了便于兼容和直接项目升级,在8.1中,微软的开发团队依然保留了这个框架:另外一个框架是从Win RT应用移植的API集,这

Windows 8开发中文件的Read和Write

文件的读写对我们来说不应该陌生,而应该说是非常熟悉了.在学习.NET其他开发技术的时候,IO是我们必须学习的,毕竟那是数据存储与处理的最基本操作. 在Windows Store应用程序开发中,同样需要对文件的读写,但由于安全与权限的限制,我们不可能像以前那样"自由干活"了.这是有好处的,我们要知道,"板砖"应用是针对移动平台的,至少通常情况下是这样的.如果我们希望像过去一样可以自由地读写各种路径,那不妨考虑使用传统桌面应用. 其实,什么叫Windows 8应用程序开

安卓应用和Windows商店应用在开发工具上的差异

比较于安卓应用开发工具,Visual Studio 2012是一个功能齐全的集成开发环境 (IDE), 使用Visual Studio 2012,我们可以方便地快捷地设计.开发和调试Windows 8商店应用.且Windows 8商店应用的开发工具还提供了更丰富的功能.下表概述了他们在开发工具上在功能上的区别,同时,表格中也包含了在Windows 8中开发应用和安卓开发应用时相互对应的开发工具. 功能 使用者 安卓工具 Windows 8工具 软件开发套件(SDK) 开发人员 安卓SDK以及面向

OpenGL ES 纹理贴图的重复与嵌位概念理解

OpenGL ES 纹理贴图的重复与嵌位概念理解 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 以下有一篇转载的Android中关于纹理贴图规则的文章,很不多. 不过我这里是想要深入研究如果让