//material表示材质对光的反应特性,texture指的是贴图#include<d3d9.h>#include<d3dx9.h>#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Capturing Screen Shots"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes...bool InitializeD3D(HWND hWnd, bool fullscreen);bool InitializeObjects();void RenderScene();void Shutdown();// Direct3D object and device.LPDIRECT3D9 g_D3D = NULL;LPDIRECT3DDEVICE9 g_D3DDevice = NULL;// Matrices.D3DXMATRIX g_projection;D3DXMATRIX g_ViewMatrix;// Vertex buffer to hold the geometry.LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL;// Holds a texture image.LPDIRECT3DTEXTURE9 g_Texture = NULL;// Records if we already saved the screen shot.bool g_screenShotSaved = false;// A structure for our custom vertex typestruct stD3DVertex{ float x, y, z; unsigned long color; float tu, tv;};// Our custom FVF, which describes our custom vertex structure#define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ switch(msg) { case WM_DESTROY: PostQuitMessage(0); return 0; break; case WM_KEYUP: if(wParam == VK_ESCAPE) PostQuitMessage(0); break; } return DefWindowProc(hWnd, msg, wParam, lParam);}int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show){ // Register the window class WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, WINDOW_CLASS, NULL }; RegisterClassEx(&wc); // Create the application's window HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW, 100, 100, WINDOW_WIDTH, WINDOW_HEIGHT, GetDesktopWindow(), NULL, wc.hInstance, NULL); // Initialize Direct3D if(InitializeD3D(hWnd, false)) { // Show the window ShowWindow(hWnd, SW_SHOWDEFAULT); UpdateWindow(hWnd); // Enter the message loop MSG msg; ZeroMemory(&msg, sizeof(msg)); while(msg.message != WM_QUIT) { if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else RenderScene(); } } // Release any and all resources. Shutdown(); // Unregister our window. UnregisterClass(WINDOW_CLASS, wc.hInstance); return 0;}bool InitializeD3D(HWND hWnd, bool fullscreen){ D3DDISPLAYMODE displayMode; // Create the D3D object. g_D3D = Direct3DCreate9(D3D_SDK_VERSION); if(g_D3D == NULL) return false; // Get the desktop display mode. if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode))) return false; // Set up the structure used to create the D3DDevice D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); if(fullscreen) { d3dpp.Windowed = FALSE; d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight = WINDOW_HEIGHT; } else d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = displayMode.Format; // Create the D3DDevice if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice))) { return false; } // Initialize any objects we will be displaying. if(!InitializeObjects()) return false; return true;}bool InitializeObjects(){//左手系坐标点stD3DVertex objData[] = { {-0.3f, -0.5f, 0.0f, D3DCOLOR_XRGB(255,255,255), 0.0f, 1.0f}, {0.3f, -0.4f, 0.0f, D3DCOLOR_XRGB(255,255,255), 1.0f, 1.0f}, {0.2f, 0.4f, 0.0f, D3DCOLOR_XRGB(255,255,255), 1.0f, 0.0f}, {0.2f, 0.4f, 0.0f, D3DCOLOR_XRGB(255,255,255), 1.0f, 0.0f}, {-0.3f, 0.6f, 0.0f, D3DCOLOR_XRGB(255,255,255), 0.0f, 0.0f}, {-0.3f, -0.5f, 0.0f, D3DCOLOR_XRGB(255,255,255), 0.0f, 1.0f} }; // Create the vertex buffer. if(FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData), 0, D3DFVF_VERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer, NULL))) return false; // Fill the vertex buffer. void *ptr; if(FAILED(g_VertexBuffer->Lock(0, sizeof(objData), (void**)&ptr, 0))) return false; memcpy(ptr, objData, sizeof(objData)); g_VertexBuffer->Unlock(); // Load the texture image from file. if(D3DXCreateTextureFromFile(g_D3DDevice, "ugp.tga", &g_Texture) != D3D_OK)return false; D3DMATERIAL9 mtrl; ZeroMemory(&mtrl,sizeof(D3DMATERIAL9)); mtrl.Diffuse.r=mtrl.Ambient.r=1.0f; mtrl.Diffuse.g=mtrl.Ambient.g=1.0f; mtrl.Diffuse.b=mtrl.Ambient.b=0.0f; mtrl.Diffuse.a=mtrl.Ambient.a=0.0f; g_D3DDevice->SetMaterial(&mtrl); g_D3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE); g_D3DDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE); g_D3DDevice->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE); g_D3DDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE); g_D3DDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE); g_D3DDevice->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE); // Set the image states to get a good quality image.g_D3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);g_D3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);// Set default rendering states. g_D3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);g_D3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); // 设置投影(projection) D3DXMatrixPerspectiveFovLH(&g_projection, 45.0f, WINDOW_WIDTH/WINDOW_HEIGHT,0.1f, 1000.0f); g_D3DDevice->SetTransform(D3DTS_PROJECTION, &g_projection); //设置摄像机 D3DXVECTOR3 cameraPos(0.0f, 0.0f, 3.0f);//位置 D3DXVECTOR3 lookAtPos(0.0f, 0.0f, 0.0f);//朝向 D3DXVECTOR3 upDir(0.0f, 1.0f, 0.0f); //上方的向量 D3DXMatrixLookAtLH(&g_ViewMatrix, &cameraPos, &lookAtPos, &upDir);//这里用的是LH即左手坐标系,和前面的点有关 RH即使右手系 return true;}void RenderScene(){//先将可能用到的buffer清除掉,0和NULL表示清除的是整个buffer//D3DCOLOR_XRGB这个参数用于控制背景色,属于color buffer//1.0f指的是depth buffer//0指的是stencil bufferg_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,255), 1.0f, 0);g_D3DDevice->BeginScene();// Begin the scene. Start rendering.g_D3DDevice->SetTransform(D3DTS_VIEW, &g_ViewMatrix); // Apply the view (camera).g_D3DDevice->SetTexture(0, g_Texture);g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0, sizeof(stD3DVertex));g_D3DDevice->SetFVF(D3DFVF_VERTEX);g_D3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);g_D3DDevice->EndScene();// End the scene. Stop rendering.g_D3DDevice->Present(NULL, NULL, NULL, NULL);// Display the scene.}void Shutdown(){ if(g_D3DDevice != NULL) g_D3DDevice->Release(); g_D3DDevice = NULL; if(g_D3D != NULL) g_D3D->Release(); g_D3D = NULL; if(g_VertexBuffer != NULL) g_VertexBuffer->Release(); g_VertexBuffer = NULL; if(g_Texture != NULL) g_Texture->Release(); g_Texture = NULL;}