把一张纹理贴到一个正方形上

 
  1. /******************************************************
  2. FileName: Demo.cpp
  3. Author: lsm   Version:        Date: 08/10/28
  4. Description: 把一张纹理贴到一个正方形上.
  5. History:
  6. <author>  <time>  <version>  <note>
  7. ******************************************************/
  8. /*-------------Head------------*/
  9. #include "assert.h"
  10. #include "d3dx9.h"
  11. #pragma warning(disable : 4996)
  12. #include "strsafe.h"
  13. #pragma warning(disable : 4996)
  14. LPDIRECT3D9                g_pD3DObj   = NULL; //D3D 对象
  15. LPDIRECT3DDEVICE9          g_pD3DDev   = NULL; //D3D 设备
  16. LPDIRECT3DVERTEXBUFFER9    g_pVerBuf   = NULL; //顶点缓冲区
  17. LPDIRECT3DTEXTURE9         g_pTexture  = NULL; //纹理
  18. TCHAR g_AppName[] = TEXT("D3D");//类名
  19. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)//灵活顶点格式
  20. struct CUSTOMVERTEX 
  21. {
  22.     D3DXVECTOR3 position;
  23.     D3DCOLOR    color;
  24.     float       tu, tv;
  25. };
  26. /*---------------End------------*/
  27. /*==========================================
  28. Function name: InitD3D
  29. Description: 初始化D3D对象
  30. ==========================================*/
  31. HRESULT InitD3D(HWND hWnd)
  32. {
  33.     if((g_pD3DObj = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)//创建3D对象
  34.     {
  35.         assert(false);
  36.         return E_FAIL;
  37.     }
  38.     int numAdapter = g_pD3DObj->GetAdapterCount();//获得显卡数量
  39.     if (numAdapter <= 0)
  40.     {
  41.         assert(false);
  42.         return E_FAIL;
  43.     }
  44.     D3DDISPLAYMODE devMode;
  45.     if (FAILED(g_pD3DObj->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &devMode)))//获得显卡信息
  46.     {
  47.         assert(false);
  48.         return E_FAIL;
  49.     }
  50.     D3DPRESENT_PARAMETERS d3dpp;
  51.     ZeroMemory(&d3dpp, sizeof(d3dpp));
  52.     d3dpp.Windowed               = true;
  53.     d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
  54.     //d3dpp.BackBufferFormat = devMode.Format;
  55.     d3dpp.EnableAutoDepthStencil = true;
  56.     d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
  57.     d3dpp.BackBufferFormat       = D3DFMT_UNKNOWN;
  58.     //d3dpp.BackBufferWidth  = devMode.Width;//取得分辨率,如果使用的话,则图像会变得很小
  59.     //d3dpp.BackBufferHeight = devMode.Height;
  60.     
  61.     if(FAILED(g_pD3DObj->CreateDevice(
  62.                                       D3DADAPTER_DEFAULT,
  63.                                       D3DDEVTYPE_HAL,
  64.                                       hWnd,
  65.                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  66.                                       &d3dpp,
  67.                                       &g_pD3DDev
  68.                                       )))
  69.     {
  70.         assert(false);
  71.         return E_FAIL;
  72.     }
  73.     g_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
  74.     g_pD3DDev->SetRenderState(D3DRS_ZENABLE, true);
  75.     g_pD3DDev->SetRenderState(D3DRS_LIGHTING, false);
  76.     return S_OK;
  77. }
  78. /*==========================================
  79. Function name: InitVBuf
  80. Description: 填充顶点缓冲区
  81. ==========================================*/
  82. HRESULT InitVBuf()
  83. {
  84.     if (FAILED(D3DXCreateTextureFromFile(g_pD3DDev, TEXT("banana.bmp"), &g_pTexture)))
  85.     {
  86.         return E_FAIL;
  87.     }
  88.     if (FAILED(g_pD3DDev->CreateVertexBuffer(
  89.                                              4*sizeof(CUSTOMVERTEX),
  90.                                              0,
  91.                                              D3DFVF_CUSTOMVERTEX,
  92.                                              D3DPOOL_DEFAULT,
  93.                                              &g_pVerBuf,
  94.                                              NULL
  95.                                              )))
  96.     {
  97.         return E_FAIL;
  98.     }
  99.     CUSTOMVERTEX *vertices;
  100.     if (FAILED(g_pVerBuf->Lock(0, 0, (void**)&vertices, 0)))//锁住内存
  101.     {
  102.         return E_FAIL;
  103.     }
  104.     vertices[0].position = D3DXVECTOR3(-1.0f,-1.0f, 0.0f);//四个点
  105.     vertices[0].color    = 0xffff0000;
  106.     vertices[0].tu       = 0;
  107.     vertices[0].tv       = 0.5;
  108.     vertices[1].position = D3DXVECTOR3( 1.0f,-1.0f, 0.0f);
  109.     vertices[1].color    = 0xff0000ff;
  110.     vertices[1].tu       = 0.5;
  111.     vertices[1].tv       = 0.5;
  112.     vertices[2].position = D3DXVECTOR3( 1.0f, 1.0f, 0.0f);
  113.     vertices[2].color    = 0xffffffff;
  114.     vertices[2].tu       = 0.5;
  115.     vertices[2].tv       = 0;
  116.     vertices[3].position = D3DXVECTOR3(-1.0f, 1.0f, 0.0f);
  117.     vertices[3].color    = 0xff000fff;
  118.     vertices[3].tu       = 0;
  119.     vertices[3].tv       = 0;
  120.     g_pVerBuf->Unlock();
  121.     return S_OK;
  122. }
  123. /*==========================================
  124. Function name: SetUpMatrices
  125. Description: 变换
  126. ==========================================*/
  127. HRESULT SetUpMatrices()
  128. {
  129.     D3DXMATRIXA16 matView;
  130.     D3DXMatrixIdentity(&matView);
  131.     D3DXVECTOR3 vEyeAt(0.0f, 0.0f, -5.0f);
  132.     D3DXVECTOR3 vEyeLook(0.0f, 0.0f, 0.0f);
  133.     D3DXVECTOR3 vEyeUp(0.0f, 1.0f, 0.0f);
  134.     D3DXMatrixLookAtLH(&matView, &vEyeAt, &vEyeLook, &vEyeUp);
  135.     g_pD3DDev->SetTransform(D3DTS_VIEW, &matView);//观察变换
  136.     D3DXMATRIXA16 matProj;
  137.     D3DXMatrixIdentity(&matProj);
  138.     D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f);
  139.     g_pD3DDev->SetTransform(D3DTS_PROJECTION, &matProj);//投影变换
  140.     return S_OK;
  141. }
  142. /*==========================================
  143. Function name: SetUpWorld
  144. Description: 世界变换
  145. ==========================================*/
  146. HRESULT SetUpWorld()
  147. {
  148.     D3DXMATRIXA16 matWorld;
  149.     D3DXMatrixIdentity(&matWorld);
  150.     //D3DXMatrixRotationX(&matWorld, timeGetTime() / 500.0f);
  151.     g_pD3DDev->SetTransform(D3DTS_WORLD, &matWorld);//世界变换
  152.     return S_OK;
  153. }
  154. /*==========================================
  155. Function name: Cleanup
  156. Description: 释放对象
  157. ==========================================*/
  158. VOID Cleanup()
  159. {
  160.     if (g_pVerBuf != NULL)
  161.     {
  162.         g_pVerBuf->Release();
  163.     }
  164.     if (g_pD3DDev != NULL)
  165.     {
  166.         g_pD3DDev->Release();
  167.     }
  168.     if (g_pD3DObj != NULL)
  169.     {
  170.         g_pD3DObj->Release();
  171.     }
  172. }
  173. /*==========================================
  174. Function name: Render
  175. Description: 负责渲染
  176. ==========================================*/
  177. VOID Render()
  178. {
  179.     if (g_pD3DDev == NULL)
  180.     {
  181.         return ;
  182.     }
  183.     g_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 255),1.0f, 0);
  184.     if (SUCCEEDED(g_pD3DDev->BeginScene()))
  185.     {
  186.         //SetUpLight();
  187.         SetUpWorld();
  188.         g_pD3DDev->SetTexture( 0, g_pTexture );
  189.         g_pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
  190.         g_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  191.         g_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
  192.         g_pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );
  193.         g_pD3DDev->SetStreamSource(0, g_pVerBuf, 0, sizeof(CUSTOMVERTEX));
  194.         g_pD3DDev->SetFVF(D3DFVF_CUSTOMVERTEX);
  195.         g_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
  196.         g_pD3DDev->EndScene();
  197.     }
  198.     g_pD3DDev->Present(NULL, NULL, NULL, NULL);
  199. }
  200. /*==========================================
  201. Function name: MsgProc
  202. Description: 负责消息循环
  203. ==========================================*/
  204. LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  205. {
  206.     switch(msg)
  207.     {
  208.     case WM_DESTROY:
  209.         Cleanup();
  210.         PostQuitMessage(0);
  211.         return 0;
  212.     }
  213.     return DefWindowProc(hWnd, msg, wParam, lParam);
  214. }
  215. /*==========================================
  216. Function name: WinMain
  217. Description: 程序启动函数
  218. ==========================================*/
  219. INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
  220. {
  221.     WNDCLASSEX wc = {
  222.                    sizeof(WNDCLASSEX), 
  223.                    CS_CLASSDC, 
  224.                    MsgProc, 
  225.                    0L, 
  226.                    0L, 
  227.                    GetModuleHandle(NULL),
  228.                    NULL,
  229.                    NULL,
  230.                    NULL,
  231.                    NULL,
  232.                    g_AppName,
  233.                    NULL
  234.                    };
  235.     RegisterClassEx(&wc);
  236.     HWND hWnd = CreateWindow(
  237.                              g_AppName, 
  238.                              TEXT("D3D Tutorial 1"), 
  239.                              WS_OVERLAPPEDWINDOW, 
  240.                              100, 
  241.                              100, 
  242.                              300, 
  243.                              300,
  244.                              NULL, 
  245.                              NULL, 
  246.                              wc.hInstance, 
  247.                              NULL 
  248.                              );
  249.     if (hWnd == NULL)
  250.     {
  251.         return -1;
  252.     }
  253.     if(SUCCEEDED(InitD3D(hWnd)))
  254.     {
  255.         if(SUCCEEDED(InitVBuf()) && SUCCEEDED(SetUpMatrices()))
  256.         {
  257.             ShowWindow(hWnd, SW_SHOWDEFAULT);
  258.             UpdateWindow(hWnd);
  259.             MSG msg;
  260.             ZeroMemory(&msg, sizeof(msg));
  261.             while (msg.message != WM_QUIT)
  262.             {
  263.                 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  264.                 {
  265.                     TranslateMessage(&msg);
  266.                     DispatchMessage(&msg);
  267.                 }
  268.                 else
  269.                 {
  270.                     Render();
  271.                 }
  272.             }
  273.         }
  274.     }
  275.     UnregisterClass(g_AppName, wc.hInstance);
  276.     return 0;
  277. }
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值