|
|
本人用directx9 sdk写了一个程序来load 一个.x 文件,可是为什么材质总是显示不出来
程序主要部分如下;请高手指教
HRESULT CMyfirstView::InitD3d()//初始化D3D和device对象
{
HWND hWnd=this->m_hWnd;
if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DDISPLAYMODE d3ddm;
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=true;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=d3ddm.Format;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))
{
return E_FAIL;
}
return S_OK;
}
HRESULT CMyfirstView::InitGeom(char * name)//初始化几何体
{counter++;
LPD3DXBUFFER pD3DXMtrlBuffer;
if(FAILED(D3DXLoadMeshFromX(name,D3DXMESH_SYSTEMMEM,g_pd3dDevice,NULL,&pD3DXMtrlBuffer,NULL,&g_dwNumMaterials,&g_pMesh[counter-1])))return E_FAIL;
D3DXMATERIAL*d3dxMaterials=(D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
g_pMeshMaterials=new D3DMATERIAL9[g_dwNumMaterials];
g_pMeshTextures=new LPDIRECT3DTEXTURE9[g_dwNumMaterials];
for(DWORD i=0;i<g_dwNumMaterials;i++)
{
g_pMeshMaterials=d3dxMaterials.MatD3D;
g_pMeshMaterials.Ambient=g_pMeshMaterials.Diffuse;
g_pMeshTextures=NULL;
if(d3dxMaterials.pTextureFilename!=NULL&&lstrlen(d3dxMaterials.pTextureFilename)>0)
{
if(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice,d3dxMaterials.pTextureFilename,&g_pMeshTextures)))
{counter--;
return E_FAIL;
}
}
}
pD3DXMtrlBuffer->Release();
return S_OK;
}
void CMyfirstView::OnLoad1() //load tiger.x文件,
{if(FAILED(InitGeom("TIGER.x")))return;
SendMessage(WM_PAINT,0,0);
}
void CMyfirstView::OnDraw(CDC* pDC)//绘制几何体
{
CMyfirstDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(NULL==g_pd3dDevice)
return;
// g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
g_pd3dDevice->BeginScene();
for(DWORD i=0;i<g_dwNumMaterials;i++)
{
g_pd3dDevice->SetMaterial(&g_pMeshMaterials);
if(FAILED(g_pd3dDevice->SetTexture(0,g_pMeshTextures)))
return ;
for(int j=0;j<counter;j++)
g_pMesh[j]->DrawSubset(i);
}
g_pd3dDevice->EndScene();
g_pd3dDevice-> resent(NULL,NULL,NULL,NULL);
} |
|