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

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

  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) ),
上海徐汇企业网站制作"color: #000000;">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 上海闵行企业网站设计与制作 style="color: #000000;">. 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 上海企业网站制作pan style="color: #000000;">. 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.
目录
相关文章
|
7月前
|
开发框架 安全 .NET
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
.NET Framework是Windows平台的开发框架,包含CLR和FCL,支持多种语言开发桌面、Web应用。常用版本有3.5、4.5.2、4.8.1,系统可同时安装多个版本,确保软件兼容运行。
1790 0
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
|
10月前
|
Linux API iOS开发
Blender 4.5 (Linux, macOS, Windows) - 开源 3D 创意软件 (渲染 建模 雕刻)
Blender 4.5 (Linux, macOS, Windows) - 开源 3D 创意软件 (渲染 建模 雕刻)
467 1
Blender 4.5 (Linux, macOS, Windows) - 开源 3D 创意软件 (渲染 建模 雕刻)
|
人工智能 芯片
D1net阅闻|OpenAI员工疯狂暗示,内部已成功开发ASI?被曝训出GPT-5但雪藏
D1net阅闻|OpenAI员工疯狂暗示,内部已成功开发ASI?被曝训出GPT-5但雪藏
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
569 0
|
区块链 C# Windows
PasteEx:一款.NET开源的Windows快捷粘贴神器
PasteEx:一款.NET开源的Windows快捷粘贴神器
323 17
|
Linux API C#
基于 .NET 开发的多功能流媒体管理控制平台
基于 .NET 开发的多功能流媒体管理控制平台
307 9
|
Web App开发 前端开发 调度
一款基于 .NET + Blazor 开发的智能访客管理系统
一款基于 .NET + Blazor 开发的智能访客管理系统
263 8
|
前端开发 JavaScript C#
基于.NET8+Vue3开发的权限管理&个人博客系统
基于.NET8+Vue3开发的权限管理&个人博客系统
261 7
|
Web App开发 C# Windows
一款.NET开源的Windows资源管理器标签页工具
一款.NET开源的Windows资源管理器标签页工具
323 5
|
人工智能 机器人
D1net阅闻 | 谷歌DeepMind研究发现LLM新特性
D1net阅闻 | 谷歌DeepMind研究发现LLM新特性

热门文章

最新文章