Managed DirectX 教程:第二部分 - 初始化 Direct3D






4.04/5 (12投票s)
2006年2月3日
4分钟阅读

74305

897
这是系列教程中的第二篇,旨在向您展示如何创建一个基本的地形引擎。
引言
这是系列教程中的第二篇,它将使您能够创建自己的游戏引擎(从初始化到完全可旋转、带有高度图的 3D 世界!)。
在本教程中,我们将实际编写代码来创建与计算机图形卡的链接。为此,我们将初始化 Direct3D,并创建一个 Device
对象来表示用户的图形卡。
背景
这些教程中的代码取自我自己的游戏引擎:MAGEngine.NET 在开发过程的不同阶段。
使用代码
您可以根据自己的需要使用我提供的所有代码,但不能用于创建另一个教程。您可以将其作为自己应用程序的一个坚实(ish ;)框架,或者打印大量副本,以便在我致富成名时,您可以以每份 100 美元的价格出售它们 ;)
必备组件
要学习本系列教程,您将需要
- C# 编译器(最好是 Visual C# 2005 Express)
- 托管 DirectX 9.0 十月 SDK
教程 1:设置 DirectX
Direct3D 是 DirectX 图形的主要组成部分。使用它,您可以渲染和初始化 3D 对象。在本教程中,我们不会渲染任何内容,但我们会设置 D3D,以便在下一个教程中轻松完成此操作。
初始化
初始化 Direct3D 的目的是获取一个 Device
对象。它代表用户的图形卡,并拥有一组用于发送和返回数据的函数。要获得此对象,您需要设置一些变量。
初始化函数如下:
public Device(
int adapter,
DeviceType deviceType,
Control renderWindow,
CreateFlags behaviorFlags,
PresentParameters[] presentationParameters );
好的,这乍一看可能很复杂,但我们可以将其分解。
adapter
仅表示要使用的设备 - 因此,在我们的目的中,这将始终为 0。deviceType
是设备的枚举。例如,软件或硬件。renderWindow
只是对其创建它的窗口的引用。behaviourFlags
是一组定义设备使用方式的标志。presentationParameters
只是一个结构,您需要用有关设备如何使用的更详细选项来填充它。
因此,我们的初始化过程将分为两部分:
- 初始化
presentationParameters
- 初始化
device
首先,在窗口类的顶部添加以下变量:
public Device device;
public PresentParameters presentParams;
现在,在我们开始创建一个类和函数来初始化 Direct3D 之前,我们应该更详细地探讨 PresentParameters
结构。
对于此应用程序,我们只需要从 PresetnParameters
结构中分配两个成员 - bool Windowed
和 SwapEffect swapEffect
。
SwapEffect
是“翻转”屏幕方式的枚举。这意味着,要更新或刷新游戏中的当前帧,我们可以这样做:
public PresentParameters SetPParams() {
PresentParameters pp = new PresentParameters();
return pp;
}
这将设置为创建我们引擎中演示参数的函数的框架。现在,如前所述,我们需要输入两个变量并相应地编辑它们,因此只需在函数参数中添加一个 bool
和 SwapEffect
,然后在主体中,在 PresentParameters()
初始化和返回代码之间,放入分配演示参数的代码行。完成的函数(和类)应如下所示(将其放在一个名为 Engine.cs 的单独代码文件中):
public partial class cEngine
// the partial keyword specifies that this
// class is declared in multiple files
{
public PresentParameters SetPParams (bool wind, SwapEffect swap)
{
PresentParameters pp = new PresentParameters();
pp.Windowed = wind; // Is our device going to be running
// in a windowed or full screen application?
pp.SwapEffect = swap;
// How should we handle the refreshing of our application?
return pp;
}
}
因此,这涵盖了 PresentationParameters
- 但现在我们需要创建一个类来初始化设备。
如前所述,设备代表 GPU 或图形卡。在本教程的较早部分,您看到了 Device
构造函数的布局。它有一些重载,但上面选择的那个最适合我们的需求。在我们 cEngine
类中创建一个处理设备的函数应该不难 - 但如果您好奇的话:
public partial class cEngine
// the partial keyword specifies that
// this class is declared in multiple files
{
public Device SetDevice( Control wnd, PresentParameters pp)
{
Device device = new Device(0, DeviceType.Hardware,
wnd, CreateFlags.HardwareVertexProcessing, pp);
return device;
}
}
此函数通过限制参数数量来简化设备创建,因为几乎始终相同的参数被省略了。
有了这两个方法,您要运行 D3D 应用程序所需做的就是在 Form
类中添加必需的变量,然后像这样调用这两个方法:
//Form1
public cEngine Engine = new cEngine();
//Main
using (Form1 GameWindow = new Form1())
{
GameWindow.presentParams =
GameWindow.Engine.SetPParams(true,
SwapEffect.Discard);
GameWindow.device =
GameWindow.Engine.SetDevice(GameWindow,
GameWindow.presentParams);
Application.Run(GameWindow);
}
如果出现错误,请确保您在 Form
类中为包含您的引擎声明的命名空间添加了 using
语句。
现在,当您运行此应用程序时,您所做的工作将无处显现 - 我个人觉得这很烦人。因此,请为窗体添加一个 paint 事件处理程序。
X-CHALLENGE
- 创建上面函数的重载,该重载设置后备缓冲区的数量以及后备缓冲区的宽度和高度。
- 创建一个合并
Device
和PresentParameter
初始化函数的函数。
做得好 - 您现在应该拥有一个可正常工作的 Direct3D 应用程序以及一个基本框架!
准备进入教程 3 - 我们将在屏幕上实际渲染一些东西!
联系方式
请将所有电子邮件发送至 xpyder@magclan.cwhnetworks.com。我也有 MSN Messenger,我的电子邮件地址是 jamespraveen@aol.com。
历史
- 06 年 1 月 19 日:将教程 1-3 提交给 CodeProject。