Directx 纹理贴图 模仿地面效果

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <d3dx9.h>  
  2. #include <string>  
  3. #include <tchar.h>  
  4. #pragma warning(disable: 4996)  
  5. #include <strsafe.h>  
  6. #pragma warning(disable: 4996)  
  7.   
  8. //  
  9. #define SAFE_RELEASE(p) { if(p) { p->Release(); (p) = NULL; } }  
  10. #define SAFE_DELETE(p)  { if(p) { delete(p); (p) = NULL; } }  
  11.   
  12. IDirect3DDevice9 *Device = 0;  
  13.   
  14. ID3DXFont *Font = 0;  
  15. wchar_t strFPS[30];  
  16. float FPS = 0.0f;  
  17. RECT ClientRect;  
  18.   
  19. LPDIRECT3DTEXTURE9 pTexture;  
  20.   
  21. IDirect3DVertexBuffer9 *VB = 0;  
  22.   
  23. D3DXMATRIX World;  
  24.   
  25. float Get_FPS();  
  26.   
  27. ///  
  28. struct ColorVertex  
  29. {  
  30.     ColorVertex(){}  
  31.   
  32.     ColorVertex(float x, float y, float z, float u, float v)  
  33.     {  
  34.         _x = x;  _y = y;  _z = z; _u = u; _v = v;  
  35.     }  
  36.   
  37.     float _x, _y, _z, _u, _v;  
  38.   
  39.     static const DWORD FVF;  
  40. };  
  41. const DWORD ColorVertex::FVF = D3DFVF_XYZ | D3DFVF_TEX1;  
  42.   
  43.   
  44. //                     
  45. bool Setup()  
  46. {  
  47.     Device->CreateVertexBuffer(4*sizeof(ColorVertex), D3DUSAGE_WRITEONLY,  
  48.         ColorVertex::FVF, D3DPOOL_DEFAULT, &VB, 0);  
  49.   
  50.     ColorVertex *vertexs;  
  51.     VB->Lock(0, 0, (void**)&vertexs, 0);  
  52.   
  53.     vertexs[0] = ColorVertex(-4.0f, -4.0f, -4.0f, 0.0f, 0.0f);  
  54.     vertexs[1] = ColorVertex(-4.0f, -4.0f,  4.0f, 0.0f, 1.0f);  
  55.     vertexs[2] = ColorVertex( 4.0f, -4.0f, -4.0f, 1.0f, 0.0f);  
  56.     vertexs[3] = ColorVertex( 4.0f, -4.0f,  4.0f, 1.0f, 1.0f);  
  57.   
  58.     VB->Unlock();  
  59.   
  60.   
  61.     //  
  62.     D3DXCreateFont(Device,20,10,0,D3DX_DEFAULT,false,DEFAULT_CHARSET,  
  63.         0,DEFAULT_QUALITY,0,TEXT("Times New Roman"),&Font);  
  64.   
  65.     D3DXCreateTextureFromFile(Device,TEXT("ground.jpg"),&pTexture);  
  66.   
  67.     //  
  68.     D3DXVECTOR3 postion(0.0f, 3.0f, -5.0f);  
  69.     D3DXVECTOR3 targer(0.0f, 0.0f, 0.0f);  
  70.     D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);  
  71.     D3DXMATRIX V;  
  72.     D3DXMatrixLookAtLH(&V, &postion, &targer, &up);  
  73.   
  74.     Device->SetTransform(D3DTS_VIEW, &V);  
  75.   
  76.     //  
  77.     D3DXMATRIX proj;  
  78.     D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI * 0.5f, float(640)/float(480),  
  79.          1.0f, 1000.0f);  
  80.     Device->SetTransform(D3DTS_PROJECTION, &proj);  
  81.   
  82.     Device->SetRenderState(D3DRS_LIGHTING, false);  
  83.   
  84.     return true;  
  85. }  
  86.   
  87. void Clearup()  
  88. {  
  89.     SAFE_RELEASE(VB);  
  90. }  
  91.   
  92.   
  93.   
  94. ///  
  95. LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)  
  96. {  
  97.     switch (msg)  
  98.     {  
  99.         case WM_PAINT:  
  100.             ValidateRect(hwnd,NULL);  
  101.         break;  
  102.   
  103.         case WM_DESTROY:  
  104.             Clearup();  
  105.             PostQuitMessage(0);  
  106.             break;  
  107.   
  108.         case WM_KEYDOWN:  
  109.             if(wParam == VK_ESCAPE)  
  110.                 DestroyWindow(hwnd);  
  111.             break;  
  112.     }  
  113.   
  114.     return DefWindowProc(hwnd,msg,wParam,lParam);  
  115. }  
  116.   
  117.   
  118.  bool Display()  
  119.  {  
  120.      if(Device)  
  121.      {  
  122.          Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,  
  123.              D3DCOLOR_XRGB(40, 40, 40), 1.0f, 0);  
  124.          Device->BeginScene();  
  125.   
  126.          //让四边形顺时针绕Y轴匀速转动  
  127.          /* D3DXMATRIX worldMatrix; 
  128.          UINT iTime = timeGetTime() % 1000; 
  129.          float fAngle = iTime * ( D3DX_PI * 2 ) / 1000.0f; 
  130.          D3DXMatrixRotationY(&worldMatrix, fAngle); 
  131.          Device->SetTransform(D3DTS_WORLD, &worldMatrix);*/  
  132.   
  133.          //  
  134.          Device->SetFVF(ColorVertex::FVF);  
  135.   
  136.          Device->SetTexture(0,pTexture);  
  137.   
  138.          Device->SetStreamSource(0, VB, 0, sizeof(ColorVertex));  
  139.           
  140.          Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);  
  141.   
  142.          Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);  
  143.          Device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);  
  144.           
  145.          RECT ClientRect = {20, 20, 190, 100};  
  146.          int charCount = swprintf_s(strFPS,20,TEXT("FPS:%f"),Get_FPS());  
  147.          Font->DrawText(NULL,strFPS,charCount,&ClientRect,DT_BOTTOM | DT_RIGHT, D3DCOLOR_XRGB(0,240,50));  
  148.   
  149.          Device->EndScene();  
  150.          Device->Present(0, 0, 0, 0);  
  151.      }  
  152.   
  153.      return true;  
  154.  }  
  155.   
  156.   
  157.   
  158. int EnterMsgLoop(bool (*ptr_display)())  
  159. {  
  160.     MSG msg;  
  161.     ZeroMemory(&msg,sizeof(MSG));  
  162.   
  163.     while (msg.message != WM_QUIT)  
  164.     {  
  165.         if(PeekMessage(&msg, 0, 0, 0,PM_REMOVE))  
  166.         {  
  167.             TranslateMessage(&msg);  
  168.             DispatchMessage(&msg);  
  169.         }  
  170.         else  
  171.         {  
  172.             ptr_display();  
  173.         }  
  174.     }  
  175.   
  176.     return msg.wParam;  
  177. }  
  178.   
  179.   
  180.   
  181. ///  
  182. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,  
  183.                    LPSTR lpCmdLine, int nShowCmd )  
  184. {  
  185.     WNDCLASSEX wc;  
  186.   
  187.     wc.style = CS_HREDRAW | CS_VREDRAW;  
  188.     wc.cbClsExtra = 0;  
  189.     wc.cbSize = sizeof(WNDCLASSEX);  
  190.     wc.cbWndExtra = 0;  
  191.     wc.hbrBackground = HBRUSH(GetStockObject(WHITE_BRUSH));  
  192.     wc.hCursor = LoadCursor(0,IDC_ARROW);  
  193.     wc.hInstance = hInstance;  
  194.     //wc.hIcon = LoadIcon(0,IDI_APPLICATION);  
  195.     wc.hIcon = (HICON)::LoadImage(NULL,TEXT("icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_LOADFROMFILE);  
  196.     //wc.hIconSm = LoadIcon(0,IDI_APPLICATION);  
  197.     wc.hIconSm = (HICON)::LoadImage(NULL,TEXT("icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_LOADFROMFILE);  
  198.     wc.lpszClassName = TEXT("DIRECTX");  
  199.     wc.lpszMenuName = NULL;  
  200.     wc.lpfnWndProc = WNDPROC(WndProc);  
  201.   
  202.   
  203.     if(!RegisterClassEx(&wc))  
  204.     {  
  205.         MessageBox(0,TEXT("RegisterClassEx Error!"),0,0);  
  206.         return false;  
  207.     }  
  208.   
  209.     HWND hwnd = 0;  
  210.     hwnd = CreateWindowEx(WS_EX_TOPMOST,TEXT("DIRECTX"),TEXT("DIRECTX"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,640,480,NULL,NULL,hInstance,NULL);  
  211.   
  212.     if(!hwnd)  
  213.     {  
  214.         MessageBox(0,TEXT("CreateWindowEx() Error!"),0,0);  
  215.         return false;  
  216.     }  
  217.   
  218.     MoveWindow(hwnd, 50,20,1280,720,true);  
  219.   
  220.     ShowWindow(hwnd,SW_SHOW);  
  221.   
  222.     UpdateWindow(hwnd);  
  223.   
  224.     ///  
  225.     ///  
  226.     HRESULT hr;  
  227.   
  228.     IDirect3D9 *d3d9 = 0;  
  229.     d3d9 = Direct3DCreate9(D3D_SDK_VERSION);  
  230.       
  231.     if (!d3d9)  
  232.     {  
  233.         MessageBox(0,TEXT("Direct3DCreate9 Error!"),0,0);  
  234.         return false;  
  235.     }  
  236.   
  237.     ///  
  238.     D3DCAPS9 caps;  
  239.     d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);  
  240.   
  241.     int vp = 0;  
  242.     if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)  
  243.         vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;  
  244.     else  
  245.         vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;  
  246.   
  247.     ///  
  248.     D3DPRESENT_PARAMETERS d3dpp;  
  249.     d3dpp.BackBufferWidth            = 640;  
  250.     d3dpp.BackBufferHeight           = 480;  
  251.     d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;  
  252.     d3dpp.BackBufferCount            = 1;  
  253.     d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;  
  254.     d3dpp.MultiSampleQuality         = 0;  
  255.     d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;   
  256.     d3dpp.hDeviceWindow              = hwnd;  
  257.     d3dpp.Windowed                   = TRUE;  
  258.     d3dpp.EnableAutoDepthStencil     = true;   
  259.     d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;  
  260.     d3dpp.Flags                      = 0;  
  261.     d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;  
  262.     d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;  
  263.   
  264.     hr = d3d9->CreateDevice(  
  265.         D3DADAPTER_DEFAULT,  
  266.         D3DDEVTYPE_HAL,  
  267.         hwnd,  
  268.         vp,  
  269.         &d3dpp,  
  270.         &Device);  
  271.   
  272.     if( FAILED(hr) )  
  273.     {  
  274.         d3dpp.AutoDepthStencilFormat = D3DFMT_D16;  
  275.   
  276.         hr = d3d9->CreateDevice(  
  277.             D3DADAPTER_DEFAULT,  
  278.             D3DDEVTYPE_HAL,  
  279.             hwnd,  
  280.             vp,  
  281.             &d3dpp,  
  282.             &Device);  
  283.   
  284.         if( FAILED(hr) )  
  285.         {  
  286.             d3d9->Release();  
  287.             MessageBox(0, TEXT("CreateDevice() - FAILED"), 0, 0);  
  288.             return false;  
  289.         }  
  290.     }  
  291.   
  292.     SAFE_RELEASE(d3d9);  
  293.   
  294.     ///  
  295.     if(!Setup())  
  296.     {  
  297.         MessageBox(0, TEXT("Setup() - FAILED"), 0, 0);  
  298.         return 0;  
  299.     }  
  300.   
  301.     EnterMsgLoop( Display );  
  302.   
  303.     Clearup();  
  304.   
  305.     Device->Release();  
  306.   
  307.     return 0;  
  308. }  
  309.   
  310.   
  311. float Get_FPS()  
  312. {  
  313.     static float fps = 0.0f;  
  314.     static int frameCounts = 0;  
  315.     static float currentTime = 0.0f;  
  316.     static float lastTime = 0.0f;  
  317.   
  318.     frameCounts++;  
  319.   
  320.     currentTime = timeGetTime() * 0.001f;  
  321.   
  322.     if(currentTime - lastTime > 1.0f)  
  323.     {  
  324.         fps = float(frameCounts) / (currentTime - lastTime);  
  325.         lastTime = currentTime;  
  326.         frameCounts = 0;  
  327.     }  
  328.   
  329.     return fps;  
  330. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值