65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.04/5 (12投票s)

2006年2月3日

4分钟阅读

viewsIcon

74305

downloadIcon

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 WindowedSwapEffect swapEffect

SwapEffect 是“翻转”屏幕方式的枚举。这意味着,要更新或刷新游戏中的当前帧,我们可以这样做:

public PresentParameters SetPParams() { 
  PresentParameters pp = new PresentParameters(); 
  return pp;
}

这将设置为创建我们引擎中演示参数的函数的框架。现在,如前所述,我们需要输入两个变量并相应地编辑它们,因此只需在函数参数中添加一个 boolSwapEffect,然后在主体中,在 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

  • 创建上面函数的重载,该重载设置后备缓冲区的数量以及后备缓冲区的宽度和高度。
  • 创建一个合并 DevicePresentParameter 初始化函数的函数。

做得好 - 您现在应该拥有一个可正常工作的 Direct3D 应用程序以及一个基本框架!

准备进入教程 3 - 我们将在屏幕上实际渲染一些东西!

联系方式

请将所有电子邮件发送至 xpyder@magclan.cwhnetworks.com。我也有 MSN Messenger,我的电子邮件地址是 jamespraveen@aol.com

历史

  • 06 年 1 月 19 日:将教程 1-3 提交给 CodeProject。
© . All rights reserved.