Direct3D成长日记(02):显示三角形(屏幕坐标)

Direct3D成长日记(02):显示三角形(屏幕坐标)

 

源代码:

//
//作者        :shenzi
//完成时间    :2009.05.07
//说明        :Direct3D成长日记(02):显示三角形(屏幕坐标)。
//

//包含头文件,相应库:
#include <windows.h>
#include <d3d9.h>

#pragma comment(lib,"d3d9.lib")

//全局变量声明:
LPDIRECT3D9            g_pD3D = NULL;                //指向Direct3D接口的指针
LPDIRECT3DDEVICE9    g_pD3DDevice = NULL;        //指向Direct3D设备的指针
LPDIRECT3DVERTEXBUFFER9        g_pVBuffer = NULL;  //顶点缓存

#define WINDOW_CLASS_NAME    L"Direct3D"
#define WINDOW_NAME            L"Direct3DBasics Tutorial"

#define SCREEN_WIDTH    300
#define SCREEN_HEIGHT    300

//顶点结构
struct CUSTOMVERTEX
{
    FLOAT X, Y ,Z, RHW;
    DWORD COLOR;
};

//D3DFVF_XYZRHW, RHW指明顶点时经过变换的,指定的点是基于屏幕坐标。
//D3DFVF_DIFFUSE,32位,保存顶点颜色信息。
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

//函数声明:
HRESULT InitD3D( HWND);            //初始化Direct3D
void RenderFrame( void);        //场景渲染
void CleanD3D( void);            //释放资源
HRESULT InitGraphics(void);        //初始化图形

//WINDOWS 消息处理函数:
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM);

//WinMain函数:
int WINAPI WinMain( HINSTANCE hInstance,
                    HINSTANCE hprevInstance,
                    LPSTR lpCmdLine,
                    int nCmdShow)
{
    //变量声明:
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    //创建窗口类
    wc.cbClsExtra        = 0;
    wc.cbSize            = sizeof(WNDCLASSEX);
    wc.cbWndExtra        = 0;
    wc.hbrBackground    = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wc.hCursor            = LoadCursor( NULL, IDC_ARROW);
    wc.hIcon            = LoadIcon( NULL, IDI_APPLICATION);
    wc.hInstance        = hInstance;
    wc.lpfnWndProc        = WndProc;
    wc.lpszClassName    = WINDOW_CLASS_NAME;
    wc.lpszMenuName        = NULL;
    wc.style            = CS_HREDRAW | CS_VREDRAW;

    //注册窗口类
    RegisterClassEx(&wc);

    //初始化窗口
    hwnd = CreateWindowEx(    NULL,
                            WINDOW_CLASS_NAME,
                            WINDOW_NAME,
                            WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            SCREEN_WIDTH,
                            SCREEN_HEIGHT,
                            NULL, NULL, hInstance, NULL);

    if ( SUCCEEDED( InitD3D(hwnd)))
    {
        if( SUCCEEDED(InitGraphics()))
        {
            //显示,更新窗口:
            ShowWindow(hwnd, nCmdShow);
            UpdateWindow(hwnd);

            ZeroMemory(&msg, sizeof(MSG));

            //消息循环:
            while( msg.message != WM_QUIT )
            {
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                {
                    TranslateMessage( &msg );
                    DispatchMessage( &msg );
                }
                else
                    RenderFrame();
            }
        }   
    }

    UnregisterClass( WINDOW_CLASS_NAME, wc.hInstance );
    return 0;

}

LRESULT WINAPI WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_DESTROY:
        CleanD3D();
        PostQuitMessage( 0 );
        return 0;
    }

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

HRESULT InitD3D(HWND hwnd)
{
    //创建D3D对象:
    if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
    {
        return E_FAIL;
    }

    //定义窗口的显示信息:
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp));

    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hwnd;

    //创建D3D设备:
    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,   
                                    D3DDEVTYPE_HAL,
                                    hwnd,
                                    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                    &d3dpp,
                                    &g_pD3DDevice)))
    {
        return E_FAIL;
    }

    return S_OK;
}
void RenderFrame(void)
{
    if(NULL == g_pD3DDevice)
        return;
    //清空背景缓冲区:
    g_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

   
    if(SUCCEEDED(g_pD3DDevice->BeginScene()))
    {
        //渲染场景:
        //设置顶点结构:
        g_pD3DDevice->SetFVF(CUSTOMFVF);
        //选取要显示的顶点
        g_pD3DDevice->SetStreamSource(0, g_pVBuffer, 0, sizeof(CUSTOMVERTEX));
        //绘制图元
        g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 1);

        g_pD3DDevice->EndScene();
    }
    //把渲染的场景显示在窗口:
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
   
}
void CleanD3D(void)
{
    //释放资源
    if (NULL != g_pVBuffer)
    {
        g_pVBuffer->Release();
    }
    if(NULL != g_pD3DDevice)
        g_pD3DDevice->Release();
    if(NULL != g_pD3D)
        g_pD3D->Release();

    g_pVBuffer = NULL;
    g_pD3DDevice = NULL;
    g_pD3D = NULL;
}

HRESULT InitGraphics(void)
{
    //定义顶点数组
    CUSTOMVERTEX vertices[] =
    {
        {  50.0f, 200.0f, 1.0f, 1.0f, 0xffff0000,},
        { 150.0f, 50.0f, 1.0f, 1.0f, 0xff00ff00,},
        { 250.0f, 200.0f, 1.0f, 1.0f, 0xff0000ff,},
    };

    //建立顶点缓存
    if (FAILED(g_pD3DDevice->CreateVertexBuffer(sizeof(vertices),
                                                0,
                                                CUSTOMFVF,
                                                D3DPOOL_MANAGED,
                                                &g_pVBuffer,
                                                NULL)))
    {
        return E_FAIL;
    }

    //通过Lock,Unlock 为顶点缓存填充数据(顶点信息):
    VOID * pV;

    if(FAILED(g_pVBuffer->Lock(0,
                            sizeof(vertices),
                            (void**)&pV,
                            0)))
    {
        return E_FAIL;
    }
    memcpy(pV, vertices, sizeof(vertices));

    g_pVBuffer->Unlock();

    return S_OK;

}

执行结果:

Direct3D成长日记(02):显示三角形(屏幕坐标)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值