浅谈DirectX的模型加载

xanxus - 2010年10月3日 - DirectX - 0 Comments
喜欢这篇文章吗?分享给你的朋友吧~ 

基于DirectX的游戏开发中,人物和模型由针对每个对象的成千上万个多边形组成的,对纹理映射而言这是非常复杂的,假设不加索引的几何图形,而只是用三角形(DirectX的模型基础是三角形)。那将会是一场恐怖的噩梦。所以现在将简单地介绍从游戏程序外获取那些图形开发资源。

加载模型的方法多种多样,鉴于现实生活中各式各样的模型文件格式,加载的渠道也不太一致。文件格式只是在特定文件中保存信息的方式。Direct3D中的文件格式也是多种多样,如X模型文件,OBJ模型,UMF模型等。现在主要对X模型也就是DirectX模型的加载进行介绍:首先先对X模型进行些微介绍,X模型是在Direct3D中使用的模型,可以使用内置的Direct3d函数加载,渲染,和释放X模型。X文件是基于Mesh模板网格的,这种模板包括外观,纹理,法线等。X模板可以被保存为文本文件,也可以被保存为二进制文件。这意味这可以在任意的文本编辑器中打开X文件并修改其内容。下面介绍一下由两个三角形组成的X模型:

两个三角形组成的X文件模型的实例

 xof     0302txt      0032       //xof意味着正在加载的是某个版本的X文件,//后面是组版本号与次版本号32(0032)Material   UgpMat {               //Material    0.1.0;  1.0  1.0;   1.0;  ;        //Diffuse    Color(反射颜色)0.0;                               //Specular   power0.0;  0.0;  0.0; ;             //Specular      color(颜色三坐标意味RGB)0.0;    0.0; 0.0;;             //Emissive    colorTextureFilename("ugp.bmp";)  //Texture      filename(纹理文件名)}//   The   square  mesh  data.Mesh   Square   {          //定义了完整网格4;                         //Number   of   vertexs.1.0;   1.0;   0.0; ,   //Vertex   1- 1.0;   1.0;   0.0; , //Vertex    2- 1.0;   -1.0;   0.0; ,   //Vertex     31.0;   -1.0;   0.0;        //Vertex       42;                             //Number   of   triangles.3;   0,   1,  2;           //Triangle   indices   1.3  ;   0,   2,  3;        //Triangle  indices    2.MeshMaterialList {       //该模板指明网格中的外观使用哪种材质1;                                 //Number  of  materials.2;                                  //Number    of    faces.0;                              //Face   0   use  material    0.0; ;                           //Face   1    use   material   0.{UgpMat}                    //Reference    of   material.}MeshTextureCoords  {       //该模板将纹理映射到网格4;0.0;     0.0;,              //Vertex  1   tex      coord,0.0;     1.0;,            //Vertex    2   tex      coord.1.0;     1.0;,        //Vertex   3  tex      coord.1.0;    0.0; ;       //Vertex    4    tex     coord.}}    //End      of    Mesh   Squar

这就是一个完整的X模型实例代码   , 它包含了 几个模块:Material模板, Mesh模板,
MeshMaterial List模板,MeshTextureCoords模板。

下面将介绍次模型的加载,加载一个老虎模型,主要可分为两种类型的:Common与非Common类的。

非Common结构

1,模型的全局变量

     LPDIRECT3D9             g_pD3D           = NULL;      // Direct3D对象LPDIRECT3DDEVICE9       g_pd3dDevice     = NULL; // Direct3D设备LPD3DXMESH              g_pMesh          = NULL;     // mesh模型指针D3DMATERIAL9*           g_pMeshMaterials = NULL;   //mesh模型所用材质指针LPDIRECT3DTEXTURE9*     g_pMeshTextures  = NULL; // mesh模型所用纹理指针DWORD                   g_dwNumMaterials = 0L;          //mesh模型材质数量

2.初始化D3D流程

  HRESULT InitD3D( HWND hWnd ){// 创建direct3D对象if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )return E_FAIL;//填写结构体创建direct3D设备,使用z深度缓冲D3DPRESENT_PARAMETERS d3dpp;ZeroMemory( &d3dpp, sizeof(d3dpp) );d3dpp.Windowed = TRUE;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;d3dpp.EnableAutoDepthStencil = TRUE;d3dpp.AutoDepthStencilFormat = D3DFMT_D16;//创建D3D设备if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp, &g_pd3dDevice ) ) ){return E_FAIL;}// 开启z深度缓冲g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );// 开启环境光g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );return S_OK;}

3,初始化几何数据流程

     HRESULT InitGeometry(){LPD3DXBUFFER pD3DXMtrlBuffer;// 从文件中加载Mesh模型if( FAILED( D3DXLoadMeshFromX( "Tiger.x", D3DXMESH_SYSTEMMEM,g_pd3dDevice, NULL,&pD3DXMtrlBuffer, NULL, &g_dwNumMaterials,&g_pMesh ) ) ){// 如果当前文件夹中没有需要加载的X文件,则尝试在上一级目录加载if( FAILED( D3DXLoadMeshFromX( "../Tiger.x", D3DXMESH_SYSTEMMEM,g_pd3dDevice, NULL,&pD3DXMtrlBuffer, NULL, &g_dwNumMaterials,&g_pMesh ) ) ){MessageBox(NULL, "Could not find tiger.x", "Meshes.exe", MB_OK);return E_FAIL;}}//需要从pD3DXMtrlBuffer指向的缓冲区中释放材质信息和纹理名称D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();g_pMeshMaterials = new    D3DMATERIAL9[g_dwNumMaterials];g_pMeshTextures  = new   LPDIRECT3DTEXTURE9[g_dwNumMaterials];for( DWORD i=0; i<g_dwNumMaterials; i++ ){// 复制材质g_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;// 为材质设定环境光颜色g_pMeshMaterials[i].Ambient = g_pMeshMaterials[i].Diffuse;g_pMeshTextures[i] = NULL;if(    d3dxMaterials[i].pTextureFilename != NULL &&lstrlen(d3dxMaterials[i].pTextureFilename) > 0 ){//通过纹理文件名加载纹理if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice,d3dxMaterials[i].pTextureFilename,&g_pMeshTextures[i] ) ) ){//如果纹理文件不在当前文件夹中尝试上一级文件夹const TCHAR* strPrefix = TEXT("../");const int lenPrefix = lstrlen( strPrefix );TCHAR strTexture[MAX_PATH];lstrcpyn( strTexture, strPrefix, MAX_PATH );lstrcpyn( strTexture +      lenPrefix,    d3dxMaterials[i].pTextureFilename,                MAX_PATH - lenPrefix );// 从上一文件夹创建if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice,strTexture,&g_pMeshTextures[i] ) ) ){MessageBox(NULL, "Could not find texture map", "Meshes.exe", MB_OK);}}}}// 释放材质缓冲区pD3DXMtrlBuffer->Release();return S_OK;}

程序刚开始使用的缓冲区ID3DXBuffer,它是数据缓冲区接口,可以储存定点项目数据,索引数据,邻近数据,材质信息等。
它有两个非常重要的接口GetBufferPointer()和GetBufferSize(),分别是返回缓冲区数据指针和缓冲区大小指针。
(这上面的代码还缺少了一些渲染之类的,和释放处理内存的步棸)
其中包含了一个结构:

       HRESULT WINAPI D3DXLoadMeshFromX(LPCTSTR pFilename,//加载的X文件名可以是相对路径名或绝对路径名DWORD Options,                        //Mesh模型标识符LPDIRECT3DDEVICE9 pD3DDevice,LPD3DXBUFFER *ppAdjacency,                                 //邻近三角形信息LPD3DXBUFFER *ppMaterials,                               //   返回材质指针LPD3DXBUFFER *PPEffectTnstances,                 //   返回特效实例指针DWORD *pNumMaterials,                                      //     返回材质数量LPD3DXMESH *ppMesh                                      //    返回被加载的Mesh模型);

使用Common结构

步棸 1,在派生类CMyD3DApplication的声明中添加一行成员变量声明。

CD3DMesh*   m_pMesheh;

步棸2,在CMyD3DApplication构造函数里添加一行。

m_pMesh  = new  CD3DMesh;

步棸3,在可重写函数InitDeviceObjects()里添加一行。

m_pMesh->Create(m_pd3dDevice, “Map.X”);

步棸4,可重写函数RestoreDeviceObjects()里添加

m_pd3dMesh->RestoreDeviceObjects(m_pd3dDevice);

步棸5, 在可重写函数Render()里添加

m_pMesh->Render(M_pd3dDevice);

步棸6,在可重写函数InvalidareDeviceObjects()中添加一行

m_pMesh->InvalidareDeviceObjects();

步棸7,在可重写函数DeleteDeviceObjects()中添加一行

m_pMesh->Destroy();

编译后即可完成加载 ,再用Common时应注意在安装DirectX时的环境配置应该添加DXSDK/Sampels/c++/common/include   以及其下的/Src.


——————————————–

浅谈DirectX的模型加载相关推荐

  1. 第八章 DirectX 3D模型加载和骨骼动画(下)

    接下来,我们介绍一些骨骼动画.我们之前大致讲过骨骼动画,存储骨骼动画的网格文件要比普通的文件复杂一下.主要是增加了骨骼信息,蒙皮信息以及动画帧信息.骨骼动画的实现原理是仿照人体运动学,将3D模型由一种 ...

  2. 浅谈前端实现页面加载进度条以及 nprogress.js 的实现

    以前在 Vue 的项目用了 nprogress 这个插件,一直对于其如何得知加载进度充满好奇,最近又看到了「前端如何实现页面加载进度条」这个问题,今天周六恰好一探究竟.以下仅为一家之言,如有异议,欢迎 ...

  3. html 中加载字体太慢,浅谈CSS字体的加载加速问题

    除了各种特定字体系列外(如 Times.Verdana.Helvetica 或 Arial),CSS定义了 5 种通用字体系列: Serif 字体    这些字体成比例,而且有上下短线.如果字体中的所 ...

  4. 浅谈《MediaPlayer》加载进度定时刷新

    这是我在CSDN的第一篇博客,也是我第一次写博客,当我踏进"码农"的世界的时候,我就要坚持往下走,学习更多的东西,废话不多说,开始进入正题. 由于才开始从入门到进阶的学习阶段,存在 ...

  5. 【TensorFlow】TensorFlow从浅入深系列之十三 -- 教你深入理解模型持久化(模型保存、模型加载)

    本文是<TensorFlow从浅入深>系列之第13篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维 ...

  6. DirectX的OBJ模型加载与渲染

    在之前的DirectX例子里我用的模型是.x文件,DirectX有一个方法D3DXLoadMeshFromX可以加载.x模型,但是这里有个问题,.x文件是没法用文本编辑器打开查看结构的,这里我来演示一 ...

  7. python模型保存save_浅谈keras保存模型中的save()和save_weights()区别

    今天做了一个关于keras保存模型的实验,希望有助于大家了解keras保存模型的区别. 我们知道keras的模型一般保存为后缀名为h5的文件,比如final_model.h5.同样是h5文件用save ...

  8. 浅谈Java内存模型、并发、多线程

    浅谈Java内存模型.并发.多线程 Java内存模型(Java Memory Model)是围绕着在并发编程中如何处理原子性,可见性,有序性三个特性而建立的模型. 下面我简单描述一下这三个特性: 原子 ...

  9. Python时间序列模型推理预测实战:时序推理数据预处理(特征生成、lstm输入结构组织)、模型加载、模型预测结果保存、条件判断模型循环运行

    Python时间序列模型推理预测实战:时序推理数据预处理(特征生成.lstm输入结构组织).模型加载.模型预测结果保存.条件判断模型循环运行 目录

最新文章

  1. Imageloader4-ImageLoader中的变量
  2. 作为一名Java开发者应该掌握的基础知识汇总!
  3. 腾讯敏捷研发协作平台TAPD荣获CCF科学技术奖
  4. uniapp image图片切换动效_动效设计从概念到落地
  5. 浅谈Netty相关概念
  6. Java读中文乱码解决方案
  7. 泰迪杯A题通讯产品销售和盈利能力分析一等奖作品
  8. 初等变换和阶梯矩阵【】
  9. 参与openEuler社区不到1年,我成为了社区Maintainer……
  10. 【Linux】详解socket编程接口
  11. 南大通用GBase XDM支持的操作平台
  12. iframe标签控制视频大小及自动播放
  13. Kutools for Excel 结合 300 多种高级功能和工具
  14. 关于Halcon的离心机试管槽定位
  15. AR剪辑笔记之视频调色
  16. springboot高并发下耗时操作的实现,我先收藏为敬
  17. vc2012\vc\include\stdlib.h(360): error C2381: “exit”: 重定义;__declspec(noreturn) 不同
  18. 【无标题】常见攻击构造方法
  19. 福利|这是小编用工作为你换来的5折优惠!
  20. 应用程序图标设置 系统图标缓存问题

热门文章

  1. #include<stdlib.h>
  2. 博弈论的经典案例:囚徒困境
  3. jQuery拖动滑块验证样式
  4. 远程PLC监控调试,PLC通用中转服务器,多客户端tcp中转服务器源代码
  5. 进入系统后win10电脑死机怎么办
  6. 基于百度翻译API和python的批量地名翻译的实现
  7. 有了钉钉智能前台 美女前台可能要失业了
  8. 拓嘉辰丰:拼多多产品的ROL是如何提升的
  9. 华为虚拟home键关闭_实体按键将全面消失?手机、耳机相继使用虚拟按键
  10. 情侣吃饭去哪最浪漫?