我也是一个初学者,在学习DirectX 的时候。问题出了好多。因为我用的是 DirectX 9.0C的环境下写程序,可是在网上找了好多代码都是在DirectX 8.0的环境下开发的,拿DirectX 8.0下的代码来运行,那肯定是出错的。我于是在网上找原因。我本来想这个问题在网上找应该会有答案的吧,没有想到。找了大半天。找出一个结论“如果想在DirectX 9.0下想运行DirectX 8.0的程序,那会出错。唯一的办法是用DirectX 8.0的运行环境”,这个结论在我心里一下子冷了下来。还要我去下一个DirectX 8.0来用。我不想,我只有找出办法来。
我把DirectX 8.0的一个程序编译了一个,出现fatal error C1083: Cannot open include file: 'd3dx8.h': No such file or directory ,我接着把
#include <d3d8.h>
#include <d3dx8.h>
换成了
#include <d3d9.h>
#include <d3dx9.h>
再在LINK的地方加入。3dx9.lib d3dxof.lib d3d9.lib winmm.lib dxguid.lib
把文件里面的8全改成9,再次编译。
出现如下错误, error C2660: 'D3DXLoadMeshFromXA' : function does not take 7 parameters
问题出来了,函数不带7个参数。
于是我在Dx9.0的文件下找到Documentation这里,打开directx9_c.chm
然后再里面输入D3DXLoadMeshFromXA
原型为HRESULT WINAPI D3DXLoadMeshFromX(
LPCTSTR pFilename,
DWORD Options,
LPDIRECT3DDEVICE9 pD3DDevice,
LPD3DXBUFFER *ppAdjacency,
LPD3DXBUFFER *ppMaterials,
LPD3DXBUFFER *ppEffectInstances,
DWORD *pNumMaterials,
LPD3DXMESH *ppMesh
);
在DX9.0中变成了8个参数,接着读了参数的各个意思。
我在前面定义了一个 LPD3DXBUFFER pD3DXBuffer;
从原来的的
LPD3DXBUFFER pD3DXMtrlBuffer;
// 读入tiger.x到我们的模型
if( FAILED( D3DXLoadMeshFromX(
"Tiger.x", // [输入].x文件名
D3DXMESH_SYSTEMMEM, // [输入]使用系统内存
g_pd3dDevice, // [输入]d3d设备指针
NULL, ,// 不用管
&pD3DXMtrlBuffer // [输出]获取模型的材质缓冲
&g_dwNumMaterials, // [输出]材质的数量
&g_pMesh ) ) ) // [输出]模型对象指针
{
return E_FAIL;
}
变成现在的
LPD3DXBUFFER pD3DXMtrlBuffer;
LPD3DXBUFFER pD3DXBuffer;
// 读入tiger.x到我们的模型
if( FAILED( D3DXLoadMeshFromX(
"Tiger.x", // [输入].x文件名
D3DXMESH_SYSTEMMEM, // [输入]使用系统内存
g_pd3dDevice, // [输入]d3d设备指针
NULL, // 不用管
&pD3DXMtrlBuffer, // [输出]获取模型的材质缓冲
&pD3DXBuffer,
&g_dwNumMaterials, // [输出]材质的数量
&g_pMesh ) ) ) // [输出]模型对象指针
{
return E_FAIL;
}
我新加的这个pD3DXBuffer到底是什么意思。我也不懂,真的,
我只知到他能运行了。如果在以后出现这种情况,我只须加多一个参数就可以运行了。
可能效率很低,毕竟成功运行了。只能先实现第一步运行成功,如果以后能力提升了,
再慢慢了解是什么意思吧。