3d游戏框架(第一个3d游戏实例)中

本文详细介绍了使用Direct3D9进行窗口创建及设备初始化的过程,包括窗口类的设计与注册、窗口创建与显示,以及Direct3D9对象创建、设备兼容性检查、参数配置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在d3d::InitD3D中我们谈到它完成了主显示窗口的创建,下面我们了解下窗口是如何被创建的。

窗口创建的步骤如下:

1.设计一个窗口类。

2.注册窗口。

3.创建窗口。

4.显示及更新窗口。

在d3d::InitD3D  的代码中:

// Create the main application window.
 //设计窗口类

 WNDCLASS wc;

 wc.style         = CS_HREDRAW | CS_VREDRAW; //窗口类的类型
 wc.lpfnWndProc   = (WNDPROC)d3d::WndProc; //窗口过程函数
 wc.cbClsExtra    = 0; //用于设置窗口结构体附加内存空间
 wc.cbWndExtra    = 0; //用于设置窗口注册时分配的附加内存空间
 wc.hInstance     = hInstance; //窗口句柄
 wc.hIcon         = LoadIcon(0, IDI_APPLICATION); //窗口图标句柄
 wc.hCursor       = LoadCursor(0, IDC_ARROW); //鼠标句柄
 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置画刷句柄
 wc.lpszMenuName  = 0; //窗口菜单名
 wc.lpszClassName = "Direct3D9App"; //窗口类名

//注册窗口类

 if( !RegisterClass(&wc) )
 {
  ::MessageBox(0, "RegisterClass() - FAILED", 0, 0);
  return false;
 }
  //创建窗口
 HWND hwnd = 0; //初始化句柄
 hwnd = ::CreateWindow("Direct3D9App",  //注册的窗口类的名字

"Direct3D9App",  //窗口名,即窗口显示时看到的名字
  WS_EX_TOPMOST, //窗口类型
  0, 0, width, height, //前两参数是设置窗口初始的坐标,后两参数是设置窗口初始的宽长
  0 /*父窗口的句柄*/, 0 /* 菜单的句柄 */, hInstance, 0 /*extra*/);

 if( !hwnd )
 {
  ::MessageBox(0, "CreateWindow() - FAILED", 0, 0);
  return false;
 }

//显示及更新窗口

 ::ShowWindow(hwnd, SW_SHOW);
 ::UpdateWindow(hwnd);

——————————————————————————————

d3d::InitD3D完成的另一个功能是初始化Driect3D,

初始化Driect3D的步骤如下:

1.获得一个IDirect3D9接口指针,通过这个接口获得设备信息(后面检查设备的兼容性会用到)和创建IDirect3DDevice接口。

2.检查硬件的兼容性(显卡是否支持某种特性)。

3.填充D3DPRESENT_PARAMETERS结构。

4.创建设备。

以下是初始化Driect3D代码:

 

// Step 1: Create the IDirect3D9 object.

 IDirect3D9* d3d9 = 0;
    d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

    if( !d3d9 )
 {
  ::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
  return false;
 }

 // Step 2: Check for hardware vp.

 D3DCAPS9 caps;
 d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

 int vp = 0;
 if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
  vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
 else
  vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

 // Step 3: Fill out the D3DPRESENT_PARAMETERS structure.
 
 D3DPRESENT_PARAMETERS d3dpp;
 d3dpp.BackBufferWidth            = width;
 d3dpp.BackBufferHeight           = height;
 d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;
 d3dpp.BackBufferCount            = 1;
 d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
 d3dpp.MultiSampleQuality         = 0;
 d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;
 d3dpp.hDeviceWindow              = hwnd;
 d3dpp.Windowed                   = windowed;
 d3dpp.EnableAutoDepthStencil     = true;
 d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
 d3dpp.Flags                      = 0;
 d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
 d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;

 // Step 4: Create the device.

 hr = d3d9->CreateDevice(
  D3DADAPTER_DEFAULT, // primary adapter
  deviceType,         // device type
  hwnd,               // window associated with device
  vp,                 // vertex processing
     &d3dpp,             // present parameters
     device);            // return created device

 if( FAILED(hr) )
 {
  // try again using a 16-bit depth buffer
  d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
  
  hr = d3d9->CreateDevice(
   D3DADAPTER_DEFAULT,
   deviceType,
   hwnd,
   vp,
   &d3dpp,
   device);

  if( FAILED(hr) )
  {
   d3d9->Release(); // done with d3d9 object
   ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
   return false;
  }
 }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值