//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 type struct 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 buffer g_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; }
正方形贴图
最新推荐文章于 2024-01-31 14:42:18 发布