|
看了一段时间的Directx9编程了,只是总体的把握了一下结构,从今天开始,从最基本的东西认真学起,有兴趣的朋友可以和我一起学习。 初学的人一般都认为Direct初始化太难懂,也过于复杂,确实如此,但我们初学者可以先当一个公式来套用,时间长了也会慢慢的明白了。我看过VB和VC两种语言用Direct编程,结构上都一样,我这里用VC来和大家讨论学习。 编程环境:VC6.0+directx9 sdk 今天只学习它的最基本的东西,创建设备,就是要计算机用什么设备来显示你所要描绘的图案,这是最基本的,也是每个Direct编程都必须的过程,初学者可以先当公式来记。
/**----------------------------------------------------------------------------- * \brief 创建设备 * 文件: CreateDevice.cpp * * 说明: 创建D3D设备, 学习清除画面的方法. * * **----------------------------------------------------------------------------- */ /// 使用的Direct3D9的首部 #include <d3d9.h>
/**----------------------------------------------------------------------------- * 全局参数 *------------------------------------------------------------------------------ */ LPDIRECT3D9 g_pD3D = NULL; /// 创建D3D 设备的D3D对象参数 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; /// 渲染中使用的D3D设备
/**----------------------------------------------------------------------------- * Direct3D初始化 *------------------------------------------------------------------------------ */ HRESULT InitD3D( HWND hWnd ) { /// 创建一个用来创建设备的D3D对象 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp; /// 创建设备的结构体 ZeroMemory( &d3dpp, sizeof(d3dpp) ); /// 必须调用ZeroMemory()函数将结构体清零. d3dpp.Windowed = TRUE; /// 创建窗口模式 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; /// 最有效的SWAP效果 d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; /// 建立一个与当前显示模式相匹配的后置缓冲
/// 按照以下设置,创建设备. /// 1. 使用缺省设置的显卡(大部分显卡都是一个). /// 2. 创建HAL设备(使用HW加速装置). /// 3. 顶点处理由支持所有显卡的SW创建(由HW创建性能更佳). if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; }
/// 处理设备状态信息时,从这里进行.
return S_OK; }
/**----------------------------------------------------------------------------- * 删除初始化对象. *------------------------------------------------------------------------------ */ VOID Cleanup() { if( g_pd3dDevice != NULL) g_pd3dDevice->Release();
if( g_pD3D != NULL) g_pD3D->Release(); }
/**----------------------------------------------------------------------------- * 绘图. *------------------------------------------------------------------------------ */ VOID Render() { if( NULL == g_pd3dDevice ) return;
/// 将后置缓冲清除,同时设置为蓝色(0,0,255). g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
/// 开始渲染 if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { /// 实际渲染命令列
/// 结束渲染 g_pd3dDevice->EndScene(); }
/// 显示后置缓冲的画面! g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); }
/**----------------------------------------------------------------------------- * 窗口过程 *------------------------------------------------------------------------------ */ LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: Cleanup(); PostQuitMessage( 0 ); return 0;
case WM_PAINT: Render(); ValidateRect( hWnd, NULL ); return 0; }
return DefWindowProc( hWnd, msg, wParam, lParam ); }
/**----------------------------------------------------------------------------- * 本程序的起始地址 *------------------------------------------------------------------------------ */ INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) { /// 注册窗口类 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "D3D Tutorial", NULL }; RegisterClassEx( &wc );
/// 创建窗口 HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, GetDesktopWindow(), NULL, wc.hInstance, NULL );
/// Direct3D初始化 if( SUCCEEDED( InitD3D( hWnd ) ) ) { /// 显示窗口 ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd );
/// 消息循环 MSG msg; while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } }
/// 删除注册的类 UnregisterClass( "D3D Tutorial", wc.hInstance ); return 0; }
用VC写过API程序的应该都知道这个程序的结构,如果不知道的,去看一下这方面的书籍,我不解释这些结构。Direct3D初始化中就是关键,也就是创建设备,然后在消息机制中不段的重画界面,当然,这个程序没画什么,只是清掉原来的界面,涂上了设定的颜色。对初学者可能看起来很难理解,先当个固定格式记下来则可,明天我们学习在创建完设备后怎么绘图,需要先了解顶点这个概念了。今天就到这里,只是开个头,用个公式开始我们Direct3D编程的学习。
|
一共有 1 条评论