日历

2008 7.5 Sat
  12345
6789101112
13141516171819
20212223242526
2728293031  
«» 2008 - 7 «»

文章搜索

日志文章

2007年11月19日 20:24:18

directx9 编程1

看了一段时间的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编程的学习。

类别: VC |  评论(1) |  浏览(1123) |  收藏
1楼 [匿名]hyl2099 2008年02月04日 20:54:21 Says:
谢谢楼主..有时间交流。呵呵。
发表评论