画四个点在窗体。
#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.我知道不是非常明显,只是四点像素点又能怎么明显呢。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章