bool CMesh::Load(const PBASICCHAR pcFileName) { Destroy(); //加载网格模型 LPD3DXBUFFER pD3DXMtrlBuffer; HRESULT hr; hr = D3DXLoadMeshFromX( pcFileName, D3DXMESH_MANAGED, &DEVICE, NULL, &pD3DXMtrlBuffer, NULL, (DWORD*)&m_uNumSurfaces, &m_pMesh ); if( FAILED(hr) ) { DEBUG_WARNING(hr); return false; } DEBUG_NEW(m_pSurfaces, CSurface[m_uNumSurfaces]); //提取材质和纹理文件路径 D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer(); for( DWORD i = 0; i< m_uNumSurfaces; i ++ ) { // MatD3D属性里没有环境光的值设置,当它被加载时,需要设置它 d3dxMaterials[i].MatD3D.Ambient = d3dxMaterials[i].MatD3D.Diffuse; CSurface* pSurface = &m_pSurfaces[i]; pSurface->SetMaterial(d3dxMaterials[i].MatD3D); if( d3dxMaterials[i].pTextureFilename != NULL ) { //创建纹理 #ifdef _UNICODE BASICCHAR szFile[MAX_PATH]; RemovePathFromFileName(d3dxMaterials[i].pTextureFilename, szFile); BASICSTRING texFile; GetRealPath(pcFileName, texFile, TEXT("/"), szFile); pSurface->LoadTexture((PBASICCHAR)texFile.c_str(), 0); BASICSTRING normalMapFile; GetRealPath((PBASICCHAR)texFile.c_str(), normalMapFile, TEXT("."), TEXT("-normalmap.tga"), true); pSurface->LoadTexture((PBASICCHAR)normalMapFile.c_str(), 1) ; //return false; #else if( !pSurface->LoadTexture(d3dxMaterials[i].pTextureFilename, 0) ) return false; #endif } } DEBUG_RELEASE( pD3DXMtrlBuffer ); __GenerateDeclMesh(m_pMesh) && __GetBoundBox(m_pMesh, m_Rectangle); return true; }