|
|
我在加载一个。x文件之后出现错误。错误代码如下
XFileLoad.exe 中的 0x4b6c799b 处未处理的异常: 0xC0000005: 写入位置 0xcdcdcd7d 时发生访问冲突
基本代码如下
IDirect3DDevice9 *m_pIDirect3DDevice;
IDirect3DTexture9 **m_ppDirect3DTextureArray;
加载。x文件代码
bool CBasicXFile: oadXFile(TCHAR* szXFileName){
if(FAILED(D3DXLoadMeshFromX(szXFileName,D3DXMESH_MANAGED,
m_pIDirect3DDevice,&m_pAdjacencyBuffer,
&m_pMaterialBuffer,0,&m_dwMaterials,
&m_pD3DXMesh)))
{
MessageBox(NULL,"装入.X文件失败.","提示",0);
return false;
}
if(m_pMaterialBuffer==NULL || m_dwMaterials==0)
return false;
//需要从pD3DXMtrlBuffer指向的缓冲区中释放材质和纹理名称
D3DXMATERIAL* pD3DXMaterial=(D3DXMATERIAL*)m_pMaterialBuffer->GetBufferPointer();
if(pD3DXMaterial!=NULL)
{
m_pD3DMaterialArray = new D3DMATERIAL9[m_dwMaterials];
m_ppDirect3DTextureArray = new IDirect3DTexture9*[m_dwMaterials];
for(DWORD i=0;i<m_dwMaterials;i++)
{
m_pD3DMaterialArray=pD3DXMaterial.MatD3D; //数组用法
if(pD3DXMaterial.pTextureFilename!=NULL)
{
if(FAILED(D3DXCreateTextureFromFile(m_pIDirect3DDevice,pD3DXMaterial.pTextureFilename,
&m_ppDirect3DTextureArray)))
{
m_ppDirect3DTextureArray=NULL;
}
}
}
}
//DWORD a = m_ppDirect3DTextureArray[0];
m_pD3DXMesh->OptimizeInplace(
D3DXMESHOPT_COMPACT |
D3DXMESHOPT_ATTRSORT |
D3DXMESHOPT_VERTEXCACHE,
(DWORD*)m_pAdjacencyBuffer->GetBufferPointer(),
NULL, NULL, NULL);
m_pMaterialBuffer->Release();
//m_pAdjacencyBuffer->Release();
return true;
}
这段代码我在调试的时候发现 pD3DXMaterial.pTextureFilename 是为空的。
当运行到
for(DWORD i=0;i<m_dwMaterials;i++){
m_pIDirect3DDevice->SetMaterial(&m_pD3DMaterialArray);
m_pIDirect3DDevice->SetTexture(0,m_ppDirect3DTextureArray);
m_pD3DXMesh->DrawSubset(i);
}
m_pIDirect3DDevice->SetTexture(0,m_ppDirect3DTextureArray);这句话出错。
出错代码XFileLoad.exe 中的 0x4b6c799b 处未处理的异常: 0xC0000005: 写入位置 0xcdcdcd7d 时发生访问冲突
别人的代码可以加载这个。x文件。。x文件我想是没有问题的。并且我试验过pTextureFilename 在别人的代码中也是为空的。求各位大侠帮小弟看看。小弟刚刚学习directX编程。
还有个问题。LPDIRECT3DDEVICE9 和 IDirect3DDevice9 在用法上有什么区别。
我在d3d9.h中看到。这样定义的。typedef struct IDirect3DTexture9 *LPDIRECT3DTEXTURE9, *PDIRECT3DTEXTURE9;
除了运用的时候 多加个* 还有别的区别吗? |
|