游戏开发论坛

 找回密码
 立即注册
搜索
查看: 948|回复: 0

directx9 eg2

[复制链接]

17

主题

20

帖子

26

积分

注册会员

Rank: 2

积分
26
发表于 2006-3-16 17:26:00 | 显示全部楼层 |阅读模式
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
#include <d3d9.h>
LPDIRECT3D9             g_pD3D       = NULL; // Direct3D对象指针
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Direct3D设备指针
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // 顶点缓冲区指针

// 自定义顶点结构
struct CUSTOMVERTEX
{   FLOAT x, y, z, rhw;                 // 经过坐标转换的顶点坐标
    DWORD color;                               // 顶点漫反射颜色值
};

// 我们自定义的灵活顶点格式包含经过坐标转换的顶点坐标和包含漫反射颜色值
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: 初始化DIRECT3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
   
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

   
    D3DDISPLAYMODE d3ddm;
    if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
        return E_FAIL;

   
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = d3ddm.Format;


   
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

   

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: InitVB()
// Desc: 初始化顶点
//-----------------------------------------------------------------------------
HRESULT InitVB()
{
    // 初始化顶点位置(三角形)如果颜色值你不知道怎么取值,好像vb属性里面有。可以去看看
        CUSTOMVERTEX g_Vertices[] =
        {   { 150.0f,  50.0f,   0.5f, 1.0f,  0xffff0000, },     //红色
                { 250.0f,  250.0f,  0.5f, 1.0f,  0xff00ff00, },                //蓝色
                { 50.0f ,  250.0f,  0.5f, 1.0f,  0xff00ffff, },                //绿色
        };

    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB,NULL ) ) )
    {//第一个参数为顶点缓冲区的大小,第三个参数为灵活顶点格式,第五个参数为顶点缓冲区指针地址
        return E_FAIL;
    }

    //上面我们定义了顶点缓冲区g_pVB,下面我们把三角形顶点序列g_Vertices复制到顶点缓冲区中
        //还有对顶点缓冲区的进行的内存操作必须通过Lock,Unlock来实现
    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
    g_pVB->Unlock();

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: 释放系统资源
//-----------------------------------------------------------------------------
VOID Cleanup()
{
    if( g_pVB != NULL )        
        g_pVB->Release();

    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

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




//-----------------------------------------------------------------------------
// Name: Render()
// Desc: 不说了
//-----------------------------------------------------------------------------
VOID Render()
{
   
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

   
    g_pd3dDevice->BeginScene();

   //一定要记得在这里写画图的程序

    //将顶点缓冲区和渲染数据流链接
    g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
    g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );//声明当前的渲染数据流的灵活顶点格式为我们之前定义的
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );//绘制当前的渲染数据流中的图元至后台缓冲区
     //上面第一个参数是你要画的图元类型,这里你要画的是三角形,最后一个参数是你要画几个。
    //
    g_pd3dDevice->EndScene();

   
    g_pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );
}



//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: 消息处理
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;

    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}



//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: 主程序入口
//-----------------------------------------------------------------------------
//下面程序很简单,大家自己看,相信自己,你们可以做到的!
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
   
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "Lid", NULL };
    RegisterClassEx( &wc );

   
    HWND hWnd = CreateWindow( "Lid", "Lid2 : single polygon",
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL );

   
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        
        if( SUCCEEDED( InitVB() ) )
        {
            
            ShowWindow( hWnd, SW_SHOWDEFAULT );
            UpdateWindow( hWnd );

            
            MSG msg;
            ZeroMemory( &msg, sizeof(msg) );
            while( msg.message!=WM_QUIT )
            {
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                {
                                        TranslateMessage( &msg );
                                        DispatchMessage( &msg );
                }
            }
        }
    }


    Cleanup();
    UnregisterClass( "Lid", wc.hInstance );
    return 0;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 22:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表