自己练习D3D 程序搭的小框架,记录在这里,将来看到好回顾自己独自摸索的苦逼样子。
#pragma once #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") #include<d3d9.h> #include<d3dx9.h> 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; wcex.cbClsExtra=0; wcex.cbSize=sizeof(wcex); wcex.cbWndExtra=0; wcex.hbrBackground=NULL; wcex.hCursor=NULL; wcex.hIcon=NULL; wcex.hIconSm=NULL; wcex.hInstance=GetModuleHandle(NULL); wcex.lpfnWndProc=MsgProc; wcex.lpszClassName=L"Self001"; wcex.lpszMenuName=NULL; 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_TRIANGLELIST,0,1); 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[3]= { {50.0f,250.0f,1.0f,1.0f}, {150.0f,50.0f,1.0f,1.0f}, {250.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; } //file 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 sdk 路径。
2.打开任务栏,调到凝视,開始练习。