Direct3D9 教程01

准备条件:VS2005、Microsoft DirectX SDK (April 2007)
测试环境:Xp SP2、M440、GF7300go、1G DDR2 667
1、在VS2005中创建空项目,新建文件CreateDeviceMy.cpp代码如下:

// 包含Dx9的头文件
#include  < d3d9.h >
#pragma  warning( disable : 4996 )  // 除去警告 
#include 
< strsafe.h >
#pragma  warning( default : 4996 ) 

// -----------------------------------------------------------------------------
//  全局参数
// -----------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D        =  NULL;  //  创建 D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice  =  NULL;  //  我们使用的渲染设备

// -----------------------------------------------------------------------------
//  名称: InitD3D()
//  描述: 初始化 Direct3D
// -----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
    
// 根据版本创建D3D对象
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        
return E_FAIL;

    
//设置参数
    D3DPRESENT_PARAMETERS d3dpp;                //参数对象,用于下面的设备创建
    ZeroMemory( &d3dpp, sizeof(d3dpp) );        //用0来填充d3dpp内存区域,也就是初始化内存
    d3dpp.Windowed = TRUE;                        //设置为窗口模式
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    //交换缓冲支持的效果类型,指定表面在交换链中是如何被交换的。这里为后备的缓存加载之后就删除。
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;    //显示模式

    
//创建设备驱动Direct3D
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,                        //默认适配器
                                      D3DDEVTYPE_HAL,                            //硬件驱动 
                                      hWnd,                                        //设备所使用的窗体
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,        //顶点像素渲染方式
                                      &d3dpp,                                    //参数
                                      &g_pd3dDevice                                //驱动设备
                                      ) ) )
    
{
        
return E_FAIL;
    }


    
// 初始化完成

    
return S_OK;
}


// -----------------------------------------------------------------------------
//  名称: Cleanup()
//  描述: 释放所有初始化对象
// -----------------------------------------------------------------------------
VOID Cleanup()
{
    
if( g_pd3dDevice != NULL) 
        g_pd3dDevice
->Release();

    
if( g_pD3D != NULL)
        g_pD3D
->Release();
}





// -----------------------------------------------------------------------------
//  名称: Render()
//  描述: 绘制场景
// -----------------------------------------------------------------------------
VOID Render()
{
    
if( NULL == g_pd3dDevice )
        
return;

    
//清除背景缓存并重新设置为蓝色
    g_pd3dDevice->Clear( 0,                             // pRects中的矩形数,如果 pRects为NULL着该参数必须为0
                         NULL,                         //一个指向D3DRECT结构体的指针
                         D3DCLEAR_TARGET,             //D3DCLEAR标志,现在为清空当前的渲染器
                         D3DCOLOR_XRGB(0,0,255),     //颜色    
                         1.0f,                         // depth buffer的新z值
                         0                             //模板
                         );
    
    
// 开始渲染场景
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    
{
        
// 可以在这里渲染场景
    
        
// 结束渲染
        g_pd3dDevice->EndScene();
    }


    
// 清苦当前缓存中的数据
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}


// -----------------------------------------------------------------------------
//  名称: MsgProc()
//  描述: Windows窗体句柄
// -----------------------------------------------------------------------------
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 );
}


// WinMain函数入口

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
    
    
//直接初始化结构体
    /*
    GetModuleHandle 函数是返回一个模块在当前进程地址空间的HMODULE
    如果函数参数值为NULL则返回一个虚拟当前句柄.
    
*/

    WNDCLASSEX wc 
= sizeof(WNDCLASSEX),            //指定了以字节为单位的结构的大小
                      CS_CLASSDC,                    //所有属于该类的窗口实例共享相同的DC
                      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,                                            //位置坐标x
                              100,                                            //位置坐标y
                              300,                                            //
                              300,                                            //
                              NULL,                                            //父窗口
                              NULL,                                            //菜单
                              wc.hInstance,                                    //窗体类句柄,2000以上的系统无含义!
                              NULL                                            //窗体结构参数
                              );
    
// Initialize Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    

        
// Show the window
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );

        
// Enter the message loop
        MSG msg; 
        
while( GetMessage( &msg, NULL, 00 ) )
        
{
            TranslateMessage( 
&msg );
            DispatchMessage( 
&msg );
        }

    }


    UnregisterClass( 
"D3D Tutorial", wc.hInstance );
    
return 0;
}


2、环境设置如图:

Direct3D9 教程01_第1张图片


包含文件设置Direct3D9 教程01_第2张图片
附加依赖
Direct3D9 教程01_第3张图片
库文件

编译时会出现一个比较烦人的C4819的警告,这里我们也通过设置把它给去了。
Direct3D9 教程01_第4张图片

运行之后可以看到下面的结果:
Direct3D9 教程01_第5张图片
:)

最后该终结一下了,初始化设备流程如下:
1、g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ),创建D3D对象
2、D3D对象创建D3DPRESENT_PARAMETERS d3dpp,参数对象
3、通过g_pD3D->CreateDevice( )函数,返回一个设备对象g_pd3dDevice

整个程序的流程图如下:
Direct3D9 教程01_第6张图片

终于写完了~~这个东西代码完全是Direct自己的教程~我不过将其运行了一下:)有什么不对的地方希望指证:)!

你可能感兴趣的:(DirectX不归路)