.x文件保存问题
最近想做一个将数据保存为D3D的.x文件,在实现过程中,先创建了X文件,再创建了DataObject,然后往里面添加Mesh,Normal,Texture等数据,最后在调用IDXFILESAVEOBJECT::Save的时候总是报异常: 0x1014735c 处最可能的异常: 0xC0000005: 读取位置 0x00aa0000 时发生访问冲突。代码如下:
//创建X文件以保存数据
if( S_OK == D3DXFileCreate(&pXFile) )
{
pXFile->RegisterTemplates( (void*)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES );
HRESULT hrr = pXFile->CreateSaveObject( "1.x", D3DXF_FILESAVE_TOFILE, D3DXF_FILEFORMAT_TEXT, &pFileSaveObj );
hrr = pFileSaveObj->AddDataObject( TID_D3DRMFrame, "Scene_Root_Frame", NULL, 0, NULL, &pXFileDataRoot );//根框架 .X的文件结构
//Mesh个数,保存在数组里面
for( int nummesh = 0; nummesh < MeshNumber; nummesh++ )
{
char buf[256];
sprintf( buf, "Mesh_Frame%d", nummesh);
//子框架 .X的文件结构
LPD3DXFILESAVEDATA pXFileMeshFrame = NULL;
hrr = pXFileDataRoot->AddDataObject( TID_D3DRMFrame, buf, NULL, 0, NULL, &pXFileMeshFrame );
//计算顶点总数
DWORD numVtx = (DWORD)newMymeshes[nummesh].vVertex.size();
//顶点缓冲区大小
DWORD nVtxBuf = 3*sizeof(float)*numVtx;
//索引即面的个数
DWORD numIndex = (DWORD)newMymeshes[nummesh].vVertexIndex.size();
//索引缓冲区大小
DWORD nIdxBuf = (sizeof(DWORD) + 3*sizeof(DWORD))*numIndex;
//合计
DWORD byteSize = sizeof(DWORD) + nVtxBuf + sizeof(DWORD) + nIdxBuf;
//往内存Copy顶点数据
char *buf2 = new char[byteSize];
char *point = buf2;
memcpy(point, &numVtx, sizeof(DWORD));
point += sizeof(DWORD);
memcpy(point, &(newMymeshes[nummesh].vVertex[0]), nVtxBuf);
point += nVtxBuf;
memcpy( point, &numIndex, sizeof(DWORD) );
point += sizeof(DWORD);
DWORD t = 3;
for (int i = 0; i < numIndex; i++)
{
memcpy( point, &t, sizeof(DWORD) );
point += sizeof(DWORD);
memcpy( point, &(newMymeshes[nummesh].vVertex[i]), sizeof(newMymeshes[nummesh].vVertex[i]) );
point += sizeof(newMymeshes[nummesh].vVertex[i]);
}
//往子框架中添加Mesh
LPD3DXFILESAVEDATA pXFileMeshData = NULL;
hrr = pXFileMeshFrame->AddDataObject( TID_D3DRMMesh, " ", NULL, byteSize, (LPVOID*)&buf2, &pXFileMeshData );
pXFileNormalData->Release();
pXFileMeshData->Release();
pXFileMeshFrame->Release();
//报异常处
pFileSaveObj->Save();
delete [] buf2;
}
}
else
{
return;
}
[解决办法]
查看是否有越界,或者野指针。内存问题