我在使用 d3d加载一个 .x文件时,跑到函数D3DXLoadMeshFromX()里出错,我打印的log显示是如标题的错误,谁知道怎么回事啊 (红色是出错的地方)代码如下:
#include<Windows.h>
#include<d3d9.h>
#include<d3dx9.h>
//#pragma comment(lib,"dxerr.lib")
//#pragma comment(lib,"dxguid.lib")
//#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"winmm.lib")wchar_t*g_pClassName=L"Transform";
wchar_t*g_pWindowName=L"我的窗口";LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;
D3DMATERIAL9* g_pMaterials;
LPDIRECT3DTEXTURE9* g_pTextures;
LPD3DXMESH g_pMeshTiny=NULL;
DWORD g_dwNumMtrls=0;
struct CUSTOMVERTEX
{
FLOAT _x,_y,_z;
FLOAT _u,_v;
CUSTOMVERTEX(FLOAT x,FLOAT y,FLOAT z,FLOAT u,FLOAT v)
:_x(x),_y(y),_z(z),_u(u),_v(v){}

};#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)
HRESULT InitDirect3D(HWND hWnd);
VOID Direct3DRender();
VOID Direct3DCleanup();LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nShowCmd)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=g_pClassName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW; if(!RegisterClass(&wndclass))
return 0; HWND hWnd=CreateWindow(g_pClassName,g_pWindowName,WS_OVERLAPPEDWINDOW,100,100,640,480,NULL,
NULL,wndclass.hInstance,NULL); InitDirect3D(hWnd); ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
MSG msg; ZeroMemory(&msg,sizeof(msg)); while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
Direct3DRender(); } UnregisterClass(g_pClassName,wndclass.hInstance);
return 0;
}LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
Direct3DRender();
ValidateRect(hWnd,NULL);
break;
case WM_DESTROY:
Direct3DCleanup();
PostQuitMessage(0);
break;
} return DefWindowProc(hWnd,message,wParam,lParam);
}HRESULT InitDirect3D(HWND hWnd)
{
LPDIRECT3D9 pD3D=NULL;
pD3D=Direct3DCreate9(D3D_SDK_VERSION);
if(pD3D==NULL) return E_FAIL;
D3DCAPS9 caps;
int vp=0; pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
if(caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferWidth=640;
d3dpp.BackBufferHeight=480;
d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount=1;
d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality=0;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow=hWnd;
d3dpp.Windowed=true;
d3dpp.EnableAutoDepthStencil=true;
d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;
d3dpp.Flags=0;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,vp,&d3dpp,&g_pd3dDevice);
LPD3DXBUFFER pAdjBuffer=NULL;
LPD3DXBUFFER pMtrlBuffer=NULL;
if(FAILED(D3DXLoadMeshFromX(L"D:\\DwarfWithEffectInstance.x",D3DXMESH_MANAGED,g_pd3dDevice,&pAdjBuffer,&pMtrlBuffer,NULL,&g_dwNumMtrls,&g_pMeshTiny)))
MessageBox(NULL,L"failed",L"failed",0);
// else
// MessageBox(NULL,L"success",L"success",0);

D3DXMATERIAL* pMtrls=(D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer();
g_pMaterials=new D3DMATERIAL9[g_dwNumMtrls];
g_pTextures=new LPDIRECT3DTEXTURE9[g_dwNumMtrls];
for(DWORD i=0;i<g_dwNumMtrls;i++)
{
g_pMaterials[i]=pMtrls[i].MatD3D;
g_pMaterials[i].Ambient=g_pMaterials[i].Diffuse;
g_pTextures[i]=NULL;
D3DXCreateTextureFromFileA(g_pd3dDevice,pMtrls[i].pTextureFilename,&g_pTextures[i]);
}
pAdjBuffer->Release();
pMtrlBuffer->Release(); g_pd3dDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
g_pd3dDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
g_pd3dDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_LINEAR);
D3DXMATRIX matView;
D3DXVECTOR3 vEye(0.0f,0.0f,-10.0f);
D3DXVECTOR3 vAt(0.0f,0.0f,0.0f);
D3DXVECTOR3 vUp(0.0f,1.0f,0.0f);
D3DXMatrixLookAtLH(&matView,&vEye,&vAt,&vUp);
g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView); D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4.0f,1.0f,1.0f,2000.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);

D3DLIGHT9 light;
::ZeroMemory(&light,sizeof(light));
light.Type=D3DLIGHT_DIRECTIONAL;
light.Ambient=D3DXCOLOR(0.3f,0.3f,0.3f,1.0f);
light.Diffuse=D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
light.Specular=D3DXCOLOR(0.0f,0.0f,0.0f,1.0f);
light.Position=D3DXVECTOR3(1.0f,0.0f,1.0f); g_pd3dDevice->SetLight(0,&light);
g_pd3dDevice->LightEnable(0,TRUE);
g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS,true);
g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE,true);
pD3D->Release();
return S_OK;
}
VOID Direct3DRender()
{
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
g_pd3dDevice->BeginScene(); D3DXMATRIX matWorld,Rx,Ry,Rz;
D3DXMatrixIdentity(&matWorld);
// D3DXMatrixRotationX(&Rx,-D3DX_PI/2.0f);
D3DXMatrixRotationY(&Ry,D3DX_PI+::timeGetTime()/1000.0f);
matWorld=Ry*matWorld;
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
if(::GetAsyncKeyState('F')&0x8000f)
g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
if(::GetAsyncKeyState('S')&0x8000f)
g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
for(DWORD i=0;i<g_dwNumMtrls;i++)
{
g_pd3dDevice->SetMaterial(&g_pMaterials[i]);
g_pd3dDevice->SetTexture(0,g_pTextures[i]);
g_pMeshTiny->DrawSubset(i);
}


g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}VOID Direct3DCleanup()
{
if(g_pd3dDevice!=NULL)
{
g_pd3dDevice->Release();
}
g_pd3dDevice=NULL;}