加载.X文件 1

来源:互联网 发布:淘宝便宜又好的文具店 编辑:程序博客网 时间:2024/06/04 19:33
 
  1. //=============================================================================   
  2. // Desc: 最简单的Direct3D程序,    
  3. //=============================================================================  
  4. #include <D3DX9.H></D3DX9.H>   
  5.   
  6.   
  7. //-----------------------------------------------------------------------------   
  8. // 全局变量   
  9. //-----------------------------------------------------------------------------   
  10. LPDIRECT3D9             g_pD3D       = NULL; //Direct3D对象   
  11. LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; //Direct3D设备对象   
  12.   
  13. LPD3DXMESH              g_pMesh      =NULL;//网格模型对像   
  14. D3DMATERIAL9             *g_pMeshMaterials=NULL;//网格模型材质   
  15. LPDIRECT3DTEXTURE9       *g_pMeshTextures=NULL;//网格模型纹理   
  16. DWORD                   g_dwNumMaterials=0L;//网格模型材质数量   
  17. //设置世界矩阵   
  18. VOID SetWorldMatrix()   
  19. {   
  20.     D3DXMATRIXA16  matWorld;   
  21.     D3DXMatrixRotationY(&matWorld,timeGetTime()/1000.0f);//随时间更新绕Y轴转换   
  22.     g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);   
  23.   
  24. }   
  25. VOID SetViewAndProjMatrix()   
  26. {   
  27.     //创建观察矩阵   
  28.     D3DXVECTOR3 vEyePt(0.0f,10.0f,-20.0f);   
  29.     D3DXVECTOR3 vLookatPt(0.0f,0.0f,0.0f);   
  30.     D3DXVECTOR3 vUpVec(0.0f,1.0f,0.0f);   
  31.     D3DXMATRIXA16 matView;   
  32.     D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);   
  33.     g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView);   
  34.   
  35.     //建立投影矩阵   
  36.     D3DXMATRIXA16 matProj;   
  37.     D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);   
  38.     g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);   
  39. }   
  40. //-----------------------------------------------------------------------------   
  41. // Desc: 初始化Direct3D   
  42. //-----------------------------------------------------------------------------   
  43. HRESULT InitD3D( HWND hWnd )   
  44. {   
  45.     //创建Direct3D对象, 该对象用来创建Direct3D设备对象   
  46.     if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )   
  47.         return E_FAIL;   
  48.   
  49.     //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象   
  50.     D3DPRESENT_PARAMETERS d3dpp;    
  51.     ZeroMemory( &d3dpp, sizeof(d3dpp) );   
  52.     d3dpp.Windowed = TRUE;   
  53.     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   
  54.     d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;   
  55.     d3dpp.EnableAutoDepthStencil=TRUE;   
  56.     d3dpp.AutoDepthStencilFormat=D3DFMT_D16;   
  57.   
  58.     //创建Direct3D设备对象   
  59.     if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,   
  60.                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,   
  61.                                       &d3dpp, &g_pd3dDevice ) ) )   
  62.     {   
  63.         return E_FAIL;   
  64.     }   
  65.   
  66. //设置环境光   
  67.     g_pd3dDevice->SetRenderState(D3DRS_AMBIENT,0xffffffff);   
  68.     //设置观察矩阵   
  69.     SetViewAndProjMatrix();   
  70.    return S_OK;   
  71. }   
  72.   
  73. //从绝对路径提取纹理文件名   
  74. void RemovePathFromFileName(LPSTR fullPath,LPWSTR fileName)   
  75. {   
  76.     //先将fullPath的类型转为LPWSTR   
  77.     WCHAR wszBuf[MAX_PATH];   
  78.     MultiByteToWideChar(CP_ACP,0,fullPath,-1,wszBuf,MAX_PATH);   
  79.     wszBuf[MAX_PATH-1]=L'/0';   
  80.     WCHAR *wszFullPath=wszBuf;   
  81.     //从绝对路径提取文件名   
  82.     LPWSTR pch=wcsrchr(wszFullPath,'//');   
  83.     if(pch)   
  84.         lstrcpy(fileName,++pch);   
  85.     else  
  86.         lstrcpy(fileName,wszFullPath);   
  87. }   
  88. //创建场景图形   
  89. HRESULT InitGeometry()   
  90. {   
  91.     LPD3DXBUFFER pD3DXMtrlBuffer;//存储网格模型材质的缓冲区对像   
  92.     //从磁盘加载网格模型   
  93.     if(FAILED(D3DXLoadMeshFromX(L"airplane.x",D3DXMESH_MANAGED,g_pd3dDevice,NULL,&pD3DXMtrlBuffer,NULL,&g_dwNumMaterials,&g_pMesh)))   
  94.     {   
  95.         MessageBox(NULL,L"不能找到airplane.x文件",L"mesh",MB_OK);   
  96.         return E_FAIL;   
  97.     }   
  98.     //从纹理中提取材质属性和纹理文件名   
  99.     D3DXMATERIAL *d3dxMaterials=(D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();   
  100.     g_pMeshMaterials=new D3DMATERIAL9[g_dwNumMaterials];   
  101.     if(g_pMeshMaterials==NULL)   
  102.         return E_OUTOFMEMORY;   
  103.     g_pMeshTextures=new LPDIRECT3DTEXTURE9[g_dwNumMaterials];   
  104.     if(g_pMeshTextures==NULL)   
  105.         return E_OUTOFMEMORY;   
  106.     //逐块提取网格模型材质属性和纹理文件名   
  107.     for(DWORD i=0;i0)   
  108.         {   
  109.             //获取纹理文件名   
  110.             WCHAR filename[256];   
  111.             RemovePathFromFileName(d3dxMaterials[i].pTextureFilename,filename);   
  112.             //创建纹理   
  113.             if(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice,filename,&g_pMeshTextures[i])))   
  114.             {   
  115.                 MessageBox(NULL,L"找不到纹理文件!",L"Mesh",MB_OK);   
  116.             }   
  117.         }   
  118.     }   
  119.     //释入在加载模型文件时创建的保存模型材质和纹理数据的缓冲区对像   
  120.     pD3DXMtrlBuffer->Release();   
  121.     return S_OK;   
  122. }   
  123.   
  124.   
  125. //-----------------------------------------------------------------------------   
  126. // Desc: 释放创建对象   
  127. //-----------------------------------------------------------------------------   
  128. VOID Cleanup()   
  129. {   
  130.     //释放网格模型材质   
  131.     if(g_pMeshMaterials!=NULL)   
  132.         delete [] g_pMeshMaterials;   
  133.     //释放纹理   
  134.     if(g_pMeshTextures)   
  135.     {   
  136.         for(DWORD i=0;iRelease();   
  137.         }   
  138.         delete [] g_pMeshTextures;   
  139.     }   
  140.     //释放网格模型对像   
  141.     if(g_pMesh!=NULL)   
  142.         g_pMesh->Release();   
  143.     //释放Direct3D设备对象   
  144.     if( g_pd3dDevice != NULL)    
  145.         g_pd3dDevice->Release();   
  146.   
  147.     //释放Direct3D对象   
  148.     if( g_pD3D != NULL)   
  149.         g_pD3D->Release();   
  150. }   
  151.   
  152.   
  153. //-----------------------------------------------------------------------------   
  154. // Desc: 渲染图形   
  155. //-----------------------------------------------------------------------------   
  156. VOID Render()   
  157. {   
  158.     //清空后台缓冲区   
  159.     g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 170), 1.0f, 0 );   
  160.        
  161.     //开始在后台缓冲区绘制图形   
  162.     if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )   
  163.     {   
  164.         //在此在后台缓冲区绘制图形   
  165.     SetWorldMatrix();//设置世界矩阵   
  166.     //逐块渲染网格模型   
  167.     for(DWORD i=0;iSetMaterial(&g_pMeshMaterials[i]);   
  168.         g_pd3dDevice->SetTexture(0,g_pMeshTextures[i]);   
  169.         //渲染模型   
  170.         g_pMesh->DrawSubset(i);   
  171.     }   
  172.   
  173.         //结束在后台缓冲区渲染图形   
  174.         g_pd3dDevice->EndScene();   
  175.     }   
  176.   
  177.     //将在后台缓冲区绘制的图形提交到前台缓冲区显示   
  178.     g_pd3dDevice->Present( NULL, NULL, NULL, NULL );   
  179. }   
  180.   
  181.   
  182. //-----------------------------------------------------------------------------   
  183. // Desc: 消息处理   
  184. //-----------------------------------------------------------------------------   
  185. LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )   
  186. {   
  187.     switch( msg )   
  188.     {   
  189.         case WM_DESTROY:   
  190.             Cleanup();   
  191.             PostQuitMessage( 0 );   
  192.             return 0;   
  193.   
  194.         case WM_PAINT:   
  195.             Render();   
  196.             ValidateRect( hWnd, NULL );   
  197.             return 0;   
  198.     }   
  199.   
  200.     return DefWindowProc( hWnd, msg, wParam, lParam );   
  201. }   
  202.   
  203.   
  204. //-----------------------------------------------------------------------------   
  205. // Desc: 程序入口   
  206. //-----------------------------------------------------------------------------   
  207. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )   
  208. {   
  209.     //注册窗口类   
  210.     WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,    
  211.                       GetModuleHandle(NULL), NULL, NULL, NULL, NULL,   
  212.                       L"ClassName", NULL };   
  213.     RegisterClassEx( &wc );   
  214.   
  215.     //创建窗口   
  216.     HWND hWnd = CreateWindow( L"ClassName", L"最简单的Direct3D程序",    
  217.                               WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,   
  218.                               NULL, NULL, wc.hInstance, NULL );   
  219.   
  220.     //初始化Direct3D   
  221.     if( SUCCEEDED( InitD3D( hWnd ) ) )   
  222.     {    
  223.         if(SUCCEEDED(InitGeometry()))   
  224.         {   
  225.         //显示主窗口   
  226.         ShowWindow( hWnd, SW_SHOWDEFAULT );   
  227.         UpdateWindow( hWnd );   
  228.   
  229.         //进入消息循环   
  230.         MSG msg;   
  231.         ZeroMemory( &msg, sizeof(msg) );   
  232.         while( msg.message!=WM_QUIT )   
  233.         {   
  234.             if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )   
  235.             {   
  236.                 TranslateMessage( &msg );   
  237.                 DispatchMessage( &msg );   
  238.             }   
  239.             else  
  240.             {   
  241.                 Render();  //渲染图形   
  242.             }   
  243.         }   
  244.     }   
  245.     }   
  246.     UnregisterClass( L"ClassName", wc.hInstance );   
  247.     return 0;   
  248. }  
原创粉丝点击