您的位置:首页 > 其它

directx-01-梦开始的地方

2012-03-19 01:32 453 查看
最近感觉有点荒废,为了让自己充实点,本人决定在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()函数,该函数的参数包括正在查询的适配器以及保存信息的显示模式对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: