#include <d3d9.h> #include <d3dx9effect.h> #include <math.h> #pragma comment(lib,"d3d9.lib") #pragma warning(disable : 4996) #include <strsafe.h> #pragma warning(default : 4996) LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; LPDIRECT3DINDEXBUFFER9 g_pIB = NULL; //索引缓冲区 HRESULT InitD3D(HWND hWnd) { 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.BackBufferFormat = D3DFMT_UNKNOWN; if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice))) return E_FAIL; return S_OK; } void Cleanup() { if(NULL != g_pVB) g_pVB->Release(); if(NULL != g_pIB) g_pIB->Release(); if(NULL != g_pd3dDevice) g_pd3dDevice->Release(); if(NULL != g_pD3D) g_pD3D->Release(); } /*****************************************************************************/ struct CUSTOMVERTEX { FLOAT x,y,z,rhw; DWORD color; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) HRESULT InitVB() { CUSTOMVERTEX Vertices[] = { {200.0f, 150.0f, 0.5f, 1.0f, 0xffff0000,}, {400.0f, 0.0f, 0.5f, 1.0f, 0xff00ff00,}, {400.0f, 100.0f, 0.5f, 1.0f, 0xff0000ff,}, {400.0f, 200.0f, 0.5f, 1.0f, 0xffff0000,}, {400.0f, 300.0f, 0.5f, 1.0f, 0xff00ff00,}, }; if(FAILED(g_pd3dDevice->CreateVertexBuffer(5*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL))) return E_FAIL; void *pVertices; if(FAILED(g_pVB->Lock(0,sizeof(Vertices),&pVertices,0))) return E_FAIL; memcpy(pVertices,Vertices,sizeof(Vertices)); g_pVB->Unlock(); //创建索引缓冲区 WORD Indices[] = {0,1,2, 0,3,4}; if(FAILED(g_pd3dDevice->CreateIndexBuffer(sizeof(Indices),0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&g_pIB,NULL))) return E_FAIL; //填充索引缓冲 void* pi; if(FAILED(g_pIB->Lock(0,sizeof(Indices),&pi,0))) return E_FAIL; memcpy(pi,Indices,sizeof(Indices)); g_pIB->Unlock(); return S_OK; } void Render() { if(NULL == g_pd3dDevice) return; g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0,0); if(SUCCEEDED(g_pd3dDevice->BeginScene())) { g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX)); g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); //指定索引缓冲区 g_pd3dDevice->SetIndices(g_pIB); //渲染 与上次不同 g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,5,0,2); g_pd3dDevice->EndScene(); } g_pd3dDevice->Present(NULL,NULL,NULL,NULL); } /*****************************************************************************/ LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_PAINT: Render(); ValidateRect(hWnd,NULL); break; case WM_DESTROY: Cleanup(); PostQuitMessage(0); break; default: break; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI wWinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPWSTR lpCmdLine, __in int nShowCmd ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hbrBackground = NULL; wcex.hCursor = NULL; wcex.hIcon = NULL; wcex.hIconSm = NULL; wcex.hInstance = GetModuleHandle(NULL); wcex.lpfnWndProc = WndProc; wcex.lpszClassName = L"First D3D Window"; wcex.lpszMenuName = NULL; wcex.style = CS_CLASSDC | CS_HREDRAW | CS_VREDRAW; RegisterClassEx(&wcex); HWND hWnd = CreateWindow(L"First D3D Window",L"第一个D3D窗口",WS_OVERLAPPEDWINDOW,0,0,600,400,GetDesktopWindow(),NULL, wcex.hInstance,NULL); if(SUCCEEDED(InitD3D(hWnd)) && SUCCEEDED(InitVB())) { ShowWindow(hWnd,SW_SHOWDEFAULT); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } UnregisterClass(L"First D3D Window",wcex.hInstance); return 0; }