加载.x文件

      .x 文件是由3dsmax导出的,专门被direct3D使用。
      一个.x文件包含:n 个 D3DXMATERIAL 类型的数据,每个D3DXMATERIAL包含一个D3DMATERIAL9 和 一个texture文件的路径。也就是说一个.x文件包含n个material 和 n 个texture文件路径。
      加载过程如下:

None.gif     LPD3DXBUFFER pMeshMaterialsBuffer  =  NULL;
        // 先将.x文件的数据存到buffer中,并得到material的个数,即D3DXMATERIAL的个数
None.gif    
if  ( FAILED(D3DXLoadMeshFromX(L " rect.x " ,D3DXMESH_SYSTEMMEM,pd3dDevice,
None.gif                        NULL,
& pMeshMaterialsBuffer,NULL, & g_numMaterials, & g_pRectMesh)) )
ExpandedBlockStart.gifContractedBlock.gif
{
InBlock.gif        
if ( FAILED(D3DXLoadMeshFromX(L"..\\rect.x",D3DXMESH_SYSTEMMEM,pd3dDevice,
InBlock.gif                        NULL,
&pMeshMaterialsBuffer,NULL,&g_numMaterials,&g_pRectMesh) ))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
InBlock.gif            MessageBoxW(NULL,L
"Can't find this .x file",L"rect.exe",MB_OK);
InBlock.gif            
return E_FAIL;
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

None.gif    
       //   得到buffer的指针
None.gif
    D3DXMATERIAL  * pMaterial  =  (D3DXMATERIAL * )pMeshMaterialsBuffer -> GetBufferPointer();
       //   为读取material 和texture数据分配空间 
None.gif    g_pRectMeshMaterials 
=   new  D3DMATERIAL9[g_numMaterials];
None.gif    
if  ( g_pRectMeshMaterials  ==  NULL )
None.gif        
return  E_OUTOFMEMORY;
None.gif    g_pRectMeshTextures 
=   new  LPDIRECT3DTEXTURE9[g_numMaterials];
None.gif    
if  ( g_pRectMeshTextures  ==  NULL )
None.gif        
return  E_OUTOFMEMORY;
None.gif
None.gif    
for  ( DWORD i  =   0 ;i  <  g_numMaterials ;  ++ i )
ExpandedBlockStart.gifContractedBlock.gif
{
            //   得到第i个material
InBlock.gif        g_pRectMeshMaterials[i] 
= pMaterial[i].MatD3D;
InBlock.gif        g_pRectMeshMaterials[i].Ambient 
= g_pRectMeshMaterials[i].Diffuse;
InBlock.gif        g_pRectMeshTextures[i] 
= NULL;
InBlock.gif      
            //   通过texture文件的路径,得到第i个material 的texture
InBlock.gif        
if ( pMaterial[i].pTextureFilename != NULL &&
InBlock.gif             lstrlen((LPCWSTR)pMaterial[i].pTextureFilename) 
> 0 )
ExpandedSubBlockStart.gifContractedSubBlock.gif      
{
                     LPWSTR path = (LPWSTR)_alloca(len*sizeof(WCHAR));
                     MultiByteToWideChar(CP_ACP,0,pMaterial[i].pTextureFileName,
                                                               -1,path,len*sizeof(WCHAR));
InBlock.gif                
if ( FAILED(D3DXCreateTextureFromFile(pd3dDevice,
InBlock.gif                                                           path,
&g_pRectMeshTextures[i])) )
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
InBlock.gif                        MessageBoxW(NULL, L
"Could not find texture map", L"rect.exe", MB_OK);
ExpandedSubBlockEnd.gif                 }

ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

None.gif    pMeshMaterialsBuffer
-> Release();

        这里有一个问题折腾了我半天:由于使用DXUT,程序必须使用unicode ,D3dxCreateTextureFromFile 转换为D3DXCreateTextureFromFileW,第2个参数的类型由LPSTR变为LPWSTR。我需要将pTextureFileName的类型由ansi转为unicode 。一上来我用强转的方法:(LPWSTR)pMaterial[i].pTextureFileName,无法得到正确的路径,接着我想到用atl的A2W,但一直没有正确导入a2w的相关文件,总报错。没办法,看看A2W是咋写的。原来A2W先从栈上分配一段内存作为buffer,然后调用MultiByteToWideChar,用buffer得到unicode版的字符串。好了,照猫画猫,一切ok!

转载于:https://www.cnblogs.com/yyang-ntan/archive/2007/01/08/614679.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值