D3D 点列练习
阅读原文时间:2023年07月13日阅读:1

画四个点在窗体。

#pragma once

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

#include
#include

//TODO: -1 custom vertex
struct CUSTOMVERTEX
{
float x;
float y;
float z;
float rhw;
};

#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZRHW

HRESULT InitD3D(HWND hWnd);
void CleanUp();
void Render();
LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
HRESULT InitD3DVertexBuffer();

//TODO: 0 declare d3d variables.
LPDIRECT3D9 g_pd3d = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice9 = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pd3dVB = NULL;

//application entry point.
INT WINAPI wWinMain(
HINSTANCE,
HINSTANCE,
LPWSTR,
INT)
{
//initialize wnd class.
WNDCLASSEX wcex;
ZeroMemory(&wcex,sizeof(wcex));
wcex.cbSize=sizeof(wcex);
wcex.hInstance=GetModuleHandle(NULL);
wcex.lpfnWndProc=MsgProc;
wcex.lpszClassName=L"Self001";
wcex.style=CS_CLASSDC;

//register wnd class.  
RegisterClassEx(&wcex);

//create window.  
HWND hWnd=CreateWindowEx(  
    WS\_EX\_OVERLAPPEDWINDOW,  
    L"Self001",  
    L"Self001 Window",  
    WS\_OVERLAPPEDWINDOW,  
    100,  
    100,  
    300,  
    300,  
    NULL,  
    NULL,  
    wcex.hInstance,  
    NULL);

//init d3d  
if(SUCCEEDED(InitD3D(hWnd)))  
{  
    //show window.  
    ShowWindow(hWnd,SW\_SHOWDEFAULT);  
    UpdateWindow(hWnd);

    //message loop.  
    MSG msg;  
    ZeroMemory(&msg,sizeof(msg));  
    while(msg.message != WM\_QUIT)  
    {  
        if(PeekMessage(&msg,hWnd,0,0,PM\_REMOVE))  
        {  
            TranslateMessage(&msg);  
            DispatchMessage(&msg);  
        }  
        else  
        {  
            Render();  
        }  
    }  
}

//unregister wnd class.  
UnregisterClass(L"Self001",wcex.hInstance);

return 0;  

}

//init d3d.
HRESULT InitD3D(HWND hWnd)
{
//create d3d.
g_pd3d=Direct3DCreate9(D3D_SDK_VERSION);
if(g_pd3d == NULL)
{
return E_FAIL;
}

//initialize d3d present parameters.  
D3DPRESENT\_PARAMETERS d3dpp;  
ZeroMemory(&d3dpp,sizeof(d3dpp));  
d3dpp.Windowed=TRUE;  
d3dpp.SwapEffect=D3DSWAPEFFECT\_DISCARD;  
d3dpp.BackBufferFormat=D3DFMT\_UNKNOWN;

//create d3d device.  
if(FAILED(g\_pd3d->CreateDevice(  
    D3DADAPTER\_DEFAULT,  
    D3DDEVTYPE\_HAL,  
    hWnd,  
    D3DCREATE\_SOFTWARE\_VERTEXPROCESSING,  
    &d3dpp,  
    &g\_pd3dDevice9)))  
{  
    return E\_FAIL;  
}

//init vertex buffer.  
if(FAILED(InitD3DVertexBuffer()))  
{  
    return E\_FAIL;  
}

return S\_OK;  

}

//clean up d3d.
void CleanUp()
{
//TODO: 3 clean up d3d.
if(g_pd3dVB != NULL)
{
g_pd3dVB->Release();
}

//release device.  
if(g\_pd3dDevice9 != NULL)  
{  
    g\_pd3dDevice9->Release();  
}

//release d3d.  
if(g\_pd3d != NULL)  
{  
    g\_pd3d->Release();  
}  

}

//render the scene.
void Render()
{
//clear target.
g_pd3dDevice9->Clear(
0,
NULL,
D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0,0,0),
1.0f,
0);

//draw primitive.  
if(SUCCEEDED(g\_pd3dDevice9->BeginScene()))  
{  
    //TODO: 2 render d3d.  
    g\_pd3dDevice9->SetStreamSource(0,g\_pd3dVB,0,sizeof(CUSTOMVERTEX));  
    g\_pd3dDevice9->SetFVF(D3DFVF\_CUSTOMVERTEX);  
    g\_pd3dDevice9->DrawPrimitive(D3DPT\_POINTLIST,0,4);

    g\_pd3dDevice9->EndScene();  
}

//present sence.  
g\_pd3dDevice9->Present(NULL,NULL,NULL,NULL);  

}

//window message handler.
LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
CleanUp();
return 0L;
}

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

}

//init d3d vertex buffer.
HRESULT InitD3DVertexBuffer()
{
//TODO: 1 init vertex buffer data.
//create vertex data.
CUSTOMVERTEX vertices[4]=
{
{50.0f,50.0f,1.0f,1.0f},
{250.0f,50.0f,1.0f,1.0f},
{250.0f,250.0f,1.0f,1.0f},
{50.0f,250.0f,1.0f,1.0f}
};

//create vertex buffer.  
if(FAILED(g\_pd3dDevice9->CreateVertexBuffer(  
    sizeof(vertices),  
    0,  
    D3DFVF\_CUSTOMVERTEX,  
    D3DPOOL\_DEFAULT,  
    &g\_pd3dVB,  
    NULL)))  
{  
    return E\_FAIL;  
}

//fill vertex buffer.  
void\* pVertices=NULL;  
if(FAILED(g\_pd3dVB->Lock(0,sizeof(vertices),&pVertices,0)))  
{  
    return E\_FAIL;  
}

memcpy(pVertices,vertices,sizeof(vertices));

g\_pd3dVB->Unlock();

return S\_OK;  

}

1. 编程的路上练习还是偏多的,这里练习D3D 点列,六中图元中的第一个。

2.我知道不是非常明显,只是四点像素点又能怎么明显呢。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章