buffer = 0x001b8478 "试图给目录添加一个名称已在使用中的对象。 这是什么意思解决思路
buffer = 0x001b8478 "试图给目录添加一个名称已在使用中的对象。 这是什么意思
我在使用 d3d加载一个 .x文件时,跑到函数D3DXLoadMeshFromX()里出错,我打印的log显示是如标题的错误,谁知道怎么回事啊 (红色是出错的地方)
代码如下:
------解决方案--------------------
D3DXLoadMeshFromX是不是参数有问题?
有没有跟踪调试一下?
我在使用 d3d加载一个 .x文件时,跑到函数D3DXLoadMeshFromX()里出错,我打印的log显示是如标题的错误,谁知道怎么回事啊 (红色是出错的地方)
代码如下:
- C/C++ code
#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; [color=#FF0000] 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);[/color] 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; }
------解决方案--------------------
D3DXLoadMeshFromX是不是参数有问题?
有没有跟踪调试一下?