D3D 初始化


#include <d3dx9.h>
#include <string>

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")


#define ASSERT(value) if (!(value)) { /
 _asm{int 3};}


IDirect3DDevice9* Device = 0;


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch( msg )
 {
 case WM_DESTROY:
  ::PostQuitMessage(0);
  break;

 case WM_KEYDOWN:
  if( wParam == VK_ESCAPE )
   ::DestroyWindow(hwnd);
  break;
 }
 return ::DefWindowProc(hwnd, msg, wParam, lParam);
}

bool Display(float timeDelta)
{
 if( Device )
 {
  Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);

  // 提交后台缓存
  // 这会导至后台缓存变成前台缓存,而前台缓存变成后台缓存
  Device->Present(0, 0, 0, 0);
 }
 return true;
}


int WINAPI WinMain(HINSTANCE hinstance,
       HINSTANCE prevInstance,
       PSTR cmdLine,
       int showCmd)
{
 //
 // 创建主窗口
    //

 // 初始化窗口类
 WNDCLASS wc;

 wc.style         = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc   = (WNDPROC)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) ) ASSERT(false);

 // 创建窗口
 HWND hwnd = 0;
 hwnd = ::CreateWindow("Direct3D9App", "Direct3D9App",
  WS_EX_TOPMOST,
  0, 0, 640, 480,
  0, 0, hinstance, 0);

 if( !hwnd ) ASSERT(false);

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

 

 //
 // 初始化D3D
 //

 HRESULT hr = 0;

 // 创建IDirect3D9 对象
 IDirect3D9* d3d9 = 0;
 d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

 if( !d3d9 ) ASSERT(false);

 // 检查硬件性能
 // 决定是否使用硬件顶点运算
 D3DCAPS9 caps;
 d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);

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


 // 初始化 D3DPRESENT_PARAMETERS 结构
 D3DPRESENT_PARAMETERS d3dpp;
 d3dpp.BackBufferWidth            = 640;
 d3dpp.BackBufferHeight           = 480;
 d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;
 d3dpp.BackBufferCount            = 1;
 d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
 d3dpp.MultiSampleQuality         = 0;
 d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;
 d3dpp.hDeviceWindow              = hwnd;
 d3dpp.Windowed                   = true;
 d3dpp.EnableAutoDepthStencil     = true;
 d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
 d3dpp.Flags                      = 0;
 d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
 d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;

 // 创建D3D设备
 hr = d3d9->CreateDevice(
  D3DADAPTER_DEFAULT,   // 主显卡
  D3DDEVTYPE_HAL,       // 设备类型
  hwnd,                 // 欲与D3D设备相关联的窗体
  vp,                   // 顶点运算方式,硬件顶点运算或软件顶点运算
  &d3dpp,               // D3DPRESENT_PARAMETERS 结构,这个结构就是一大堆参数的集合
  &Device);             // 返回创建好的D3D设备

 // 如果前面D3D设备创建不成功
 // 以16 位深度缓存为参数再试一次
 if( FAILED(hr) )
 {
  d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

  hr = d3d9->CreateDevice(
   D3DADAPTER_DEFAULT,
   D3DDEVTYPE_HAL,
   hwnd,
   vp,
   &d3dpp,
   &Device);

  if( FAILED(hr) ) ASSERT(false);
 }

 // 释放D3D9 对象
 d3d9->Release();


 // 进入消息循环
 MSG msg;
 ::ZeroMemory(&msg, sizeof(MSG));

 static float lastTime = (float)timeGetTime();

 while(msg.message != WM_QUIT)
 {
  if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
  {
   ::TranslateMessage(&msg);
   ::DispatchMessage(&msg);
  }
  else
  { 
   float currTime  = (float)timeGetTime();
   float timeDelta = (currTime - lastTime)*0.001f;

   Display(timeDelta);

   lastTime = currTime;
  }
 }

 Device->Release();

 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值