|
我就是导入了samples中的Tiger.x文件,材质和纹理都设置了,可是为什么就是画不出来,下面是代码,是游戏开发技术详解里面的例子,可以直接运行。
#include <d3d9.h>
#include <d3dx9.h>
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;
LPD3DXMESH g_pMesh = NULL;
D3DMATERIAL9* g_pMeshMaterials = NULL;
LPDIRECT3DTEXTURE9* g_pMeshTextures = NULL;
DWORD g_dwNumMaterials = 0L;
HRESULT InitD3D(HWND hWnd)
{
if(NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION )))
{
return E_FAIL;
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice)))
{
return E_FAIL;
}
g_pD3DDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
g_pD3DDevice->SetRenderState(D3DRS_AMBIENT,0xffffffff);
return S_OK;
}
HRESULT InitGeometry()
{
LPD3DXBUFFER pD3DXMtrelBuffer;
if(FAILED(D3DXLoadMeshFromX("tiger.x",D3DXMESH_SYSTEMMEM,g_pD3DDevice,NULL,&pD3DXMtrelBuffer,NULL,&g_dwNumMaterials,&g_pMesh)))
{
return E_FAIL;
}
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrelBuffer->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)))
{
return E_FAIL;
}
}
}
pD3DXMtrelBuffer->Release();
return S_OK;
}
void SetupMatrices()
{
D3DXMATRIXA16 matWorld;
D3DXMatrixRotationY(&matWorld,timeGetTime()/1000.0f);
g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);
D3DXVECTOR3 vEyePt(0.0f,3.0f,-5.0f);
D3DXVECTOR3 vLookatPt(0.0f,0.0f,0.0f);
D3DXVECTOR3 vUpVec(0.0f,1.0f,0.0f);
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);
g_pD3DDevice->SetTransform(D3DTS_VIEW,&matView);
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matProj);
}
void Render()
{
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
if(SUCCEEDED(g_pD3DDevice->BeginScene()))
{
SetupMatrices();
for(DWORD i = 0; i < g_dwNumMaterials; i++)
{
g_pD3DDevice->SetMaterial(&g_pMeshMaterials);
g_pD3DDevice->SetTexture(0,g_pMeshTextures);
g_pMesh->DrawSubset(i);
}
g_pD3DDevice->EndScene();
}
g_pD3DDevice-> resent(NULL,NULL,NULL,NULL);
}
void Cleanup()
{
if(g_pMeshMaterials != NULL)
delete[] g_pMeshMaterials;
if(g_pMeshTextures)
{
for(DWORD i = 0; i < g_dwNumMaterials;i++)
{
if(g_pMeshTextures)
g_pMeshTextures->Release();
}
delete[] g_pMeshTextures;
}
if(g_pMesh != NULL)
g_pMesh->Release();
if(g_pD3DDevice != NULL)
g_pD3DDevice->Release();
if(g_pD3D != NULL)
g_pD3D->Release();
}
LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE, LPSTR, INT)
{
WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,"D3D Tutorial",NULL};
RegisterClassEx(&wc);
HWND hWnd = CreateWindow("D3D Tutorial","小老虎",WS_OVERLAPPEDWINDOW,100,100,800,600,GetDesktopWindow(),NULL,wc.hInstance,NULL);
if(SUCCEEDED(InitD3D(hWnd)))
{
if(SUCCEEDED(InitGeometry()))
{
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
Render();
}
}
}
UnregisterClass("D3D Tutorial",wc.hInstance);
return 0;
}
|
|