最近感觉有点荒废,为了让自己充实点,本人决定在csdn上写博客,学习directx9.0,为了游戏梦想。
由于自己也是初学,可能会犯很多错误,欢迎网友报错,欢迎前辈指点。
学习的参考书目为《Directx 游戏开发终极指南》,其实自己也买了龙书,但是感觉龙书相对比这本难理解,看完这个再学龙书。
一.先来介绍下directx
directx微软公司的DirectX是一个多媒体应用编程接口(API)工具包,DirectX主要用于游戏开发,但其中部分(而不是全部)用于开发其他类型软件,这些软件包括游戏虚拟角色、网络游戏和与游戏无关的图形软件。DirectX通过和底层硬件打交道,从而获取软件的最大性能。API DirectX主要由DirectGraphics、DirectInput、DirectPlay、DirectMusic和DirectSound组成。DirectX中的每个API都可以通过硬件加速。
DirectGraphics是DirectX API,主要负责向屏幕上渲染二维图形和三维图形。有经验的程序员会认为DirectGraphics是Direct3D。
DirectInput是Direct API,可以直接使用所有与计算机关联的输入设备。这些设备包括键盘、鼠标和游戏控制器设备。
DirectPlay控制台DirectX中网络功能的API。
DirectMusic是DirectX API中的一员,负责声音的处理。
DirectX中的DirectSound API提供了更高级声音处理能力。
要进行directx开发,首先去微软下载directxsdk。
二.初始化win窗口,由于d3d是微软的东西,自然也要在windows平台上开发了,我们的开发平台为vs2010-win32平台,所以我们先来初始化一个windows窗口
(和vc++游戏编程第一节有点重复,所以这里不讲了)我们主要来初始化一个d3d窗口;
首先你要引用d3d里面的lib,这时你 必须先安装好directxsdk,然后在vs2010项目中加载链接项
#include<d3d9.h> //头文件
#pragma comment(lib, "d3d9.lib") //调用库
#pragma comment(lib, "d3dx9.lib")
#define WINDOW_CLASS "UGPDX" //宏
#define WINDOW_NAME "D3D Window"
// 定义顶点格式标识符,即灵活顶点格式
#define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
// Function Prototypes... 声明
bool InitializeD3D(HWND hWnd, bool fullscreen);
bool InitializeObjects(); // 用于创建演示程序中要绘制在屏幕上的物体
LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL; // 定义了一个顶点缓存对象
void RenderScene();
void Shutdown();
// Direct3D object and device.
LPDIRECT3D9 g_D3D = NULL; //初始化D3D对象
LPDIRECT3DDEVICE9 g_D3DDevice = NULL;
// 定义场景中单个3D点的结构
struct stD3DVertex
{
float x, y, z, rhw; // 点的x,y,z坐标值
unsigned long color; // 点的颜色
};
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) //消息回调函数
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYUP:
if(wParam == VK_ESCAPE) PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam); //销毁
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
{
// Register the window class
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,WINDOW_CLASS, NULL }; //创建窗口类
RegisterClassEx(&wc); //注册窗口类
// Create the application's window 创建窗口
HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW,
100, 100, 640, 480, GetDesktopWindow(), NULL,
wc.hInstance, NULL);
// Initialize Direct3D初始化
if(InitializeD3D(hWnd, false))
{
// Show the window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
// Enter the message loop
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
RenderScene(); //渲染屏幕
}
}
// Release any and all resources.
Shutdown(); //释放D3D对象
// Unregister our window.
UnregisterClass(WINDOW_CLASS, wc.hInstance);
return 0;
}
bool InitializeD3D(HWND hWnd, bool fullscreen) //初始化D3D
{
D3DDISPLAYMODE displayMode;
// Create the D3D object.
g_D3D = Direct3DCreate9(D3D_SDK_VERSION); //创建D3D接口对象
if(g_D3D == NULL) return false;
// Get the desktop display mode.显卡信息
if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
return false;
// Set up the structure used to create the D3DDevice
//建立D3DPRESENT_PARAMETERS结构,用于定义Direct3D窗口的显示信息
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
if(fullscreen)
{
d3dpp.Windowed = FALSE;
d3dpp.BackBufferWidth = 640;
d3dpp.BackBufferHeight = 480;
}
else
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = displayMode.Format;
// Create the D3DDevice
if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))
{
return false;
}
return true;
}
void RenderScene()
{
// Clear the backbuffer.
g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
// Begin the scene. Start rendering.
g_D3DDevice->BeginScene();
// End the scene. Stop rendering.
g_D3DDevice->EndScene();
// Display the scene.
g_D3DDevice->Present(NULL, NULL, NULL, NULL);
}
void Shutdown()
{
if(g_D3DDevice != NULL) g_D3DDevice->Release();
if(g_D3D != NULL) g_D3D->Release();
g_D3DDevice = NULL;
g_D3D = NULL;
}
InitializeD3D()函数开始先调用Direct3DCreate9()函数。Direct3DCreate9()函数将创建一个Direct3D接口对象,并返回该对象。该函数所带的参数值为D3D_SDK_VERSION。如果从该函数创建的接口不为NULL(空),那么接口创建成功。如果是NULL,那么创建接口时就会出现一些错误,并且由于其余步骤在很大程度上取决于是否成功调用Direct3DCreate9()函数,所以一旦出现错误,就会立刻退出Direct3D初始化程序。
接下来调用的是GetAdapterDisplayMode()函数,该函数的参数包括正在查询的适配器以及保存信息的显示模式对象。