开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 3676|回复: 5
收起左侧

[源码分享] D3D载入模型

[复制链接]
结帖率:96% (24/25)
发表于 2015-6-3 17:37:59 | 显示全部楼层 |阅读模式   广东省深圳市
本帖最后由 小生怕怕啊 于 2015-6-3 17:39 编辑

111.jpg



  1. #include <d3d9.h>
  2. #include <d3dx9.h>
  3. #include <stdio.h>
  4. #include <mmsystem.h>

  5. #pragma comment(lib,"d3d9.lib")
  6. #pragma comment(lib,"d3dx9.lib")
  7. #pragma comment(lib,"winmm.lib")


  8. #define WIN_CLASS "Simple"
  9. #define WIN_NAME "simple"
  10. #define WIN_WIDTH 800
  11. #define WIN_HEIGHT 600
  12. #define RELEASE(P) {if(P!=NULL){P->Release();P=NULL;}}

  13. bool EngineInit(HWND hwnd);
  14. void EngineEnd();
  15. bool GameInit(HWND hwnd);
  16. void GameRun(HWND hwnd);
  17. void GameEnd();
  18. void ShowMessage(LPCSTR lpText);
  19. void Matrix_Set();
  20. float GetFPS();

  21. LPDIRECT3D9 g_D3D=NULL;
  22. LPDIRECT3DDEVICE9 g_DEV=NULL;
  23. LPD3DXMESH g_Mesh=NULL; //网格
  24. D3DMATERIAL9* g_pMaterials=NULL; //材质
  25. LPDIRECT3DTEXTURE9* g_pTextures=NULL; //纹理
  26. DWORD g_dwMaterialsCount=0; //材质数量
  27. LPD3DXFONT g_Font=NULL; //字体


  28. LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
  29. {
  30. switch (msg)
  31. {
  32. case WM_DESTROY:
  33. PostQuitMessage(0);
  34. break;
  35. }
  36. return DefWindowProc(hwnd,msg,wparam,lparam);
  37. }

  38. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
  39. {
  40. WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0,0,hInstance,NULL,NULL,NULL,NULL,WIN_CLASS,NULL};
  41. RegisterClassEx(&wc);
  42. HWND hwnd= CreateWindow(WIN_CLASS,WIN_NAME,WS_OVERLAPPEDWINDOW,0,0,WIN_WIDTH,WIN_HEIGHT,NULL,NULL,hInstance,NULL);
  43. if (hwnd)
  44. {
  45. if (GameInit(hwnd))
  46. {
  47. ShowWindow(hwnd,nShowCmd);
  48. UpdateWindow(hwnd);
  49. MSG msg;
  50. ZeroMemory(&msg,sizeof(msg));
  51. while (msg.message!=WM_QUIT)
  52. {
  53. if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
  54. {
  55. TranslateMessage(&msg);
  56. DispatchMessage(&msg);
  57. }
  58. else
  59. {
  60. GameRun(hwnd);
  61. }
  62. }
  63. GameEnd();
  64. }

  65. }
  66. UnregisterClass(WIN_CLASS,wc.hInstance);
  67. return 0;
  68. }

  69. bool EngineInit( HWND hwnd )
  70. {
  71. if ((g_D3D=Direct3DCreate9(D3D_SDK_VERSION))==NULL)
  72. {
  73. return false;
  74. }
  75. D3DPRESENT_PARAMETERS d3dpp;
  76. ZeroMemory(&d3dpp,sizeof(d3dpp));
  77. d3dpp.BackBufferCount=2;
  78. d3dpp.BackBufferWidth=WIN_WIDTH;
  79. d3dpp.BackBufferHeight=WIN_HEIGHT;
  80. d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;
  81. d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
  82. d3dpp.EnableAutoDepthStencil=TRUE;
  83. d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;
  84. d3dpp.Windowed=TRUE;
  85. d3dpp.hDeviceWindow=hwnd;
  86. d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
  87. if (FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_DEV)))
  88. {
  89. ShowMessage("创建3D设备失败!");
  90. return false;
  91. }
  92. if (g_DEV==NULL)
  93. {
  94. return false;
  95. }
  96. //设置光照
  97. D3DLIGHT9 light;
  98. ZeroMemory(&light,sizeof(light));
  99. light.Type=D3DLIGHT_DIRECTIONAL;
  100. light.Ambient=D3DXCOLOR(0.5f,0.5f,0.5f,1.0f);
  101. light.Diffuse=D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
  102. light.Specular=D3DXCOLOR(0.0f,0.0f,0.0f,1.0f);
  103. light.Direction=D3DXVECTOR3(1.0f,0.0f,1.0f);
  104. g_DEV->SetLight(0,&light);
  105. g_DEV->LightEnable(0,TRUE);
  106. g_DEV->SetRenderState(D3DRS_NORMALIZENORMALS,true);
  107. g_DEV->SetRenderState(D3DRS_SPECULARENABLE,true);

  108. //开启背面消隐
  109. g_DEV->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);

  110. //创建字体
  111. if (FAILED(D3DXCreateFont(g_DEV,36,0,0,1,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY,0,"微软雅黑",&g_Font)))
  112. {
  113. ShowMessage("创建字体失败!");
  114. return false;
  115. }
  116. return true;
  117. }

  118. void EngineEnd()
  119. {
  120. RELEASE(g_DEV);
  121. RELEASE(g_D3D);
  122. RELEASE(g_Mesh);
  123. }

  124. bool GameInit( HWND hwnd )
  125. {
  126. if (!(EngineInit(hwnd)))
  127. {
  128. return false;
  129. }
  130. LPD3DXBUFFER lpMaterials=NULL;

  131. if (FAILED(D3DXLoadMeshFromX("miki.X",D3DXMESH_MANAGED,g_DEV,NULL,&lpMaterials,NULL,&g_dwMaterialsCount,&g_Mesh)))
  132. {
  133. ShowMessage("载入模型失败!");
  134. return false;
  135. }
  136. D3DXMATERIAL* Material=(D3DXMATERIAL*)lpMaterials->GetBufferPointer();
  137. OutputDebugString(Material->pTextureFilename);

  138. g_pMaterials=new D3DMATERIAL9[g_dwMaterialsCount];
  139. g_pTextures=new LPDIRECT3DTEXTURE9[g_dwMaterialsCount];
  140. for (DWORD i=0;i<g_dwMaterialsCount;i++)
  141. {
  142. g_pMaterials[i]=Material[i].MatD3D;
  143. g_pMaterials[i].Ambient=g_pMaterials[i].Diffuse;
  144. //创建纹理
  145. g_pTextures[i]=NULL;
  146. if (FAILED(D3DXCreateTextureFromFile(g_DEV,Material[i].pTextureFilename,&g_pTextures[i])))
  147. {
  148. ShowMessage("创建纹理失败!");
  149. return false;
  150. }

  151. }


  152. return true;
  153. }

  154. void GameRun(HWND hwnd)
  155. {
  156. RECT formatRect;
  157. GetClientRect(hwnd,&formatRect);
  158. g_DEV->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
  159. g_DEV->BeginScene();
  160. Matrix_Set();
  161. for (DWORD i=0;i<g_dwMaterialsCount;i++)
  162. {
  163. g_DEV->SetMaterial(&g_pMaterials[i]);
  164. g_DEV->SetTexture(0,g_pTextures[i]);
  165. g_Mesh->DrawSubset(i);
  166. }

  167. float fps=GetFPS();
  168. char chFps[50]={0};
  169. UINT strCount= sprintf(chFps,"FPS:%0.3f",fps);
  170. g_Font->DrawTextA(NULL,chFps,strCount,&formatRect,DT_TOP|DT_RIGHT,D3DCOLOR_XRGB(255,0,0));
  171. g_DEV->EndScene();
  172. g_DEV->Present(NULL,NULL,NULL,NULL);
  173. }

  174. void GameEnd()
  175. {
  176. EngineEnd();
  177. }


  178. void ShowMessage( LPCSTR lpText )
  179. {
  180. MessageBox(NULL,lpText,"Info",MB_OK);
  181. }

  182. void Matrix_Set()
  183. {
  184. float fAngle=(float)(GetTickCount()*0.001);
  185. //世界矩阵
  186. D3DXMATRIX matrixWorld;
  187. D3DXMatrixRotationY(&matrixWorld,fAngle);
  188. g_DEV->SetTransform(D3DTS_WORLD,&matrixWorld);

  189. D3DXMATRIX matrixView;
  190. D3DXVECTOR3 vEye(0.0f,0.0f,-300.0f);
  191. D3DXVECTOR3 vAt(0.0f,0.0f,0.0f);
  192. D3DXVECTOR3 vUp(0.0f,1.0f,0.0f);
  193. D3DXMatrixLookAtLH(&matrixView,&vEye,&vAt,&vUp);
  194. g_DEV->SetTransform(D3DTS_VIEW,&matrixView); //取景变换

  195. D3DXMATRIX matrixProjection;
  196. if (FAILED(D3DXMatrixPerspectiveFovLH(&matrixProjection,D3DX_PI/4.0f,1,1.0f,1000.0f)))
  197. {
  198. ShowMessage("设置投影变换失败!");
  199. return ;
  200. }

  201. g_DEV->SetTransform(D3DTS_PROJECTION,&matrixProjection); //投影变换


  202. }

  203. float GetFPS()
  204. {
  205. static float fps=0;
  206. static int frameCount=0;
  207. static float currentTime=0.0f;
  208. static float lastTime=0.0f;
  209. frameCount++;
  210. currentTime=timeGetTime()*0.001f;
  211. if (currentTime-lastTime>1.0f)
  212. {
  213. fps=(float)frameCount/(currentTime-lastTime);
  214. lastTime=currentTime;
  215. frameCount=0;
  216. }
  217. return fps;
  218. }
复制代码

DxSimple.part01.rar

2 MB, 下载次数: 15, 下载积分: 精币 -2 枚

DxSimple.part02.rar

2 MB, 下载次数: 14, 下载积分: 精币 -2 枚

DxSimple.part03.rar

2 MB, 下载次数: 19, 下载积分: 精币 -2 枚

DxSimple.part04.rar

2 MB, 下载次数: 22, 下载积分: 精币 -2 枚

DxSimple.part05.rar

844.84 KB, 下载次数: 31, 下载积分: 精币 -2 枚

结帖率:67% (4/6)
发表于 2015-6-3 23:26:04 | 显示全部楼层   广西壮族自治区贺州市
统一发个网盘行吗
回复 支持 反对

使用道具 举报

结帖率:43% (3/7)
发表于 2015-6-3 21:15:59 | 显示全部楼层   广西壮族自治区贵港市
这是 .x 文件。。没戏了
回复 支持 反对

使用道具 举报

结帖率:56% (10/18)
发表于 2015-6-3 19:58:59 | 显示全部楼层   重庆市重庆市
小学生我怕怕 很好
回复 支持 反对

使用道具 举报

结帖率:84% (32/38)
发表于 2015-6-3 18:02:44 | 显示全部楼层   江西省宜春市
握草,这么多压缩包。。。
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)
发表于 2015-6-3 17:40:06 | 显示全部楼层   广东省深圳市
沙发??
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表