XNA 3D渲染与内容处理入门

本文旨在为那些希望开始学习XNA的读者提供一个关于3D渲染和内容处理的示例。虽然这不是一个完整的台球游戏(这将是另一篇文章的内容),但它可以作为一个良好的起点。

本文不是要展示做事情的最佳方式,它只是一个在四到五小时内快速制作的示例。任何改进都是非常受欢迎的!

本文涵盖了以下主题:

  • 内容处理器开发
  • 从3DSMax导出内容,包括Max Shaders,准备用于XNA
  • 内容加载
  • 3D渲染,包括使用和不使用Max Shaders
  • 基础摄像机开发
  • 基础精灵管理
  • 基础自定义用户界面开发
  • 鼠标读取
  • 场景和3D模型管理
  • 使用XML进行设置序列化
  • 附加模型属性实现

压缩包分为两组:

  • Article_demo_XXX:仅包含二进制文件。(每个demo_XXX压缩文件应该解压到同一个文件夹中。)
  • Article_src_XXX:包含完整的Visual Studio项目(每个src_XXX压缩文件应该解压到同一个文件夹中)

在Article_src中找到的项目是一个Visual C# Express项目。因此,需要Visual C# Express(带有Service Pack 1)和XNAGame Studio(版本1.0 Refresh)来编译和运行它。

本项目可以作为学习中级3D渲染和场景管理概念及其在XNA中的实现的起点。

如果不知道什么是摄像机,如何渲染3D对象(由多边形组成),或者没有一些基本的代数知识,建议首先阅读一些入门教程。在Code Project有更多关于游戏开发的文章之前,一个好的起点是GameDev。

如果已经具备所有这些基础知识,请继续阅读:

尽可能地,一切都以组件化的方式实现。XNA有一个GameComponent类,可以从它继承,它指导以这种方式工作。基本上,所有功能都可以用三个阶段或步骤来表达:

  • 初始化:对象启动时调用一次,内存保留,等等
  • 更新:每帧调用一次,以进行必要的状态更新
  • 绘制:每帧调用一次,绘制可见对象、UI等

3D场景初步

任何3D应用程序都需要一些数据来组成场景,通常包括:

  • 3D或2D几何体
  • 纹理
  • 材质和着色器
  • 任何附加信息,如物理、游戏特定属性等

纹理通常在设计套件中创建,如Photoshop、Gimp或其他。材质和3D几何体通常在3D建模软件中创建,如3DSMax、Maya等。纹理也在这里加入3D场景。对于着色器的创建,有许多选择:

  • 使用特定软件,如ATI RenderMonkey或nVidia Shader FX
  • 使用3D建模软件本身
  • 手工编写(使用有史以来最强大的工具:记事本,就像这个家伙总是说的 - 嗨Chema!-;)

不太明确的是如何导出所有这些信息:所有这些都可以包含在一个文件中吗?在许多情况下,不行。

那么,是如何做到的呢?

使用代码

在Zip文件中找到的项目是一个完整的工作XNAWindows游戏项目。

会稍微谈谈它包含的类。由于空间原因,不能过多扩展这一部分,但如果有任何额外的信息需要,请随时提问:

  • PositionNormalTexture:这是一个XNA内容处理器。它用于将用于3D几何体的X文件转换为.xnb格式。它基本上以特定格式写入所有几何体,以便每个模型都以相同的方式表达。
  • TargetedCamera:一个摄像机类,可以作为轨道目标摄像机工作。只需要告诉它一个初始目标和视点,并调用Orbit方法。
  • CMouseInput:包括所有鼠标读取功能,并公开两个有用的事件:ButtonChanged和OnMouseMove。两者的工作方式与Windows Forms事件非常相似。
  • Model3D:设计为GameComponent,封装了一个3D模型。这个类准备好读取从3DS Max导出的X文件。它支持默认材质(通过BasicEffect着色器处理,XNA中的默认值)和DirectX着色器材质(在3DSMax中设计的着色器)。
  • Scene:这个类只是一个场景管理的示例。在这种情况下,房间和台球桌是不同的模型。它们都在Scene类中,因为它们是场景的一部分。如果想将这个示例扩展到一个完整的台球游戏,这个类将是放置球的集合的完美地方。
  • Settings:在项目中包含了这个类,以解释如何处理应用程序设置,使其与Windows项目和XBox项目兼容,因为正常的.NET类(System.Configuration)在Compact Framework(因此360)上不可用。
  • MySprite:这个类是一个绘制精灵的助手,将SpriteBatch、Texture2D、渲染精灵的位置和其他功能(如精灵的着色颜色)保存在单个类中。请注意,使用MySprite渲染大量精灵并不高效,因为它将需要每个精灵一个SpriteBatch。应该使用单个SpriteBatch来渲染大量精灵,但对于这个示例来说,这就足够了(而且非常简单)。它用于在光标位置渲染一个“狙击手”精灵。
  • MySpriteButton:继承自MySprite,但增加了按钮功能。它包括一个Click事件,非常像Windows Forms中的一个,以及一个鼠标悬停效果,当鼠标悬停在它上面时,改变精灵的着色颜色。它用于用户界面按钮,允许用户选择摄像机的不同目标。
  • BilliardsGame:这是XNA游戏本身。它继承自Microsoft.Xna.Framework.Game,基本上持有并使用所有其他内容:GraphicsDevice、ContentManager、Settings类的实例、CMouseInput实例、Scene实例、TargetedCamera实例、MySprites和MySpritesButtons用于用户界面等...
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485