正方形贴图

来源:互联网 发布:电吉他伴奏软件 编辑:程序博客网 时间:2024/04/29 10:36
//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;}


	
				
		
原创粉丝点击