快速业务通道

设计自己的3D图像引擎(4):WuguiEngine之模型、特效、贴图

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
,读取文件的时候就直接使用的文件名,如果具有一个完整的文件系统,不仅可以从硬盘中,还可以从内存中,压缩文件中,而且还可以在多个位置按先后顺序查找。StructRes*就是之前提过的结构体了。

ResourceManager最重要的方法是GetD3DResource

1: void* ResourceManager::GetD3DResource(string filename, GraphicsDevice* pDevice,
2:   ResourceType type)
3: {
4:   ResTable::iterator pResult = resourceTable.find(filename);
5:
6:   //如果找到了对应的资源(已加载)
7:   if (pResult != resourceTable.end())
8:   {
9:     (*pResult).second->useCount ++;
10:     return (*pResult).second->pResource;
11:   }
12: ..........

ResTable就是resourceTable的类型,stl的类型写起来太长了,就用typedef处理了一下。

从第4行开始就是查找资源, 首先看看这个文件名所对应的资源是否存在,如果存在,就返回,代码都是调用的基本stl的函数,如果看不太明白可以翻翻stl的帮助文件。

1: //如果没有找到对应的资源
2: else
3: {
4:   //如果是需要载入贴图
5:   if (type == ResourceType::RTTexture)
6:   {
7:     IDirect3DTexture9* pTexture;
8:
9:     //从filename中创建Texture
10:     LPSTR str = UtilityTools::ConvertStringLPSTR(&filename);
11:     if (D3DXCreateTextureFromFileExA(pDevice->GetLPDIRECT3DDEVICE9(),
12:       str,
13:       D3DX_DEFAULT,     //width
14:       D3DX_DEFAULT,     //height
15:       D3DX_DEFAULT,     //levels
16:       0,           //usage
17:       D3DFMT_UNKNOWN,    //format
18:       D3DPOOL_MANAGED,    //pool
19:       D3DX_DEFAULT,
20:       D3DX_DEFAULT,
21:       0,
22:       NULL,
23:       NULL,
24:       &pTexture) != D3D_OK)
25:
26:     {
27:       throw "Exception To Create Texture";
28:     }
29:     delete str;
30:
31:     //在Table中加入这个Resource
32:     StructRes* pRes = new StructRes(pTexture, type);
33:     resourceTable.insert(make_pair(filename, pRes));
34:
35:     return pTexture;
36:   }
37:   else if (type == ResourceType::RTMesh)
38:   {
39:      .......
40:   }
41:   else if (type == ResourceType::RTEffect)
42:   {
43:      .......
44:   }

接着上面的代码,如果对应文件名的资源没有存在,则根据资源的类型进行加载,调用API函数。

这段代码应该还是比较好理解的,这里就不说了。

贴一段用的时候的代码,以Texture为例,比如需要获取一份IDirect3DTexture9*(pTexture)的资源。

1: ResourceManager* pResourceMgr = ResourceManager::GetInstance();
2:
3: pTexture = (IDirect3DTexture9*)(pResourceMgr->
4:   GetD3DResource(_filename, device,ResourceType::RTTexture));

另外还有一个地方就是资源的释放,在StructRes中有一个useCount, 当被引用一次+1,被释放一次-1,最后一个出门的人就关灯锁门了。

3. 模型

之前将了一下资源复用,以贴图为例。贴图的内容相对比较简单,只需要保存一个引用IDirect3DTexture9*类型的指针就好了,但是模型就不一样,模型涉及到很多操作,比如说获取mesh的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号