|
本来是一个旋转的彩色立方体 我这个出来只有一个蓝色的背景 求大侠看看问题在哪啊 我都是照书上写的
#pragma comment(lib,"dxerr.lib")
#pragma comment(lib,"dxguid.lib")
#pragma comment(lib,"d3dx9d.lib")
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"comctl32.lib")
#include <windows.h>
#include<d3d9.h>
#include <d3dx9.h>
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB=NULL;
LPDIRECT3DINDEXBUFFER9 g_pIB = NULL;
struct CUSTOMVERTEX
{
FLOAT x, y, z; // The transformed position for the vertex
DWORD color; // The vertex color
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
//------------------------------------------
//初始化D3D
//------------------------------------------
HRESULT InitializeD3D(HWND hWnd)
{
if (NULL==(g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return false;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect =D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))
{
return E_FAIL;
}
return TRUE;
}
HRESULT InitVB()
{
CUSTOMVERTEX Vertices[] =
{
{ -1.0f,-1.0f, -1.0f, D3DCOLOR_XRGB(255,0,0)},
{ -1.0f,1.0f, -1.0f, D3DCOLOR_XRGB(0,255,0)},
{ 1.0f,1.0f, -1.0f, D3DCOLOR_XRGB(0,0,255)},
{ 1.0f,-1.0f, -1.0f, D3DCOLOR_XRGB(255,255,0)},
{ -1.0f,-1.0f, 1.0f, D3DCOLOR_XRGB(255,0,255)},
{ -1.0f,1.0f, 1.0f, D3DCOLOR_XRGB(0,255,255)},
{ 1.0f,1.0f, 1.0f, D3DCOLOR_XRGB(0,0,0)},
{ 1.0f,-1.0f, 1.0f, D3DCOLOR_XRGB(255,255,255)}
};
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3 * sizeof( CUSTOMVERTEX ),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
{
return E_FAIL;
}
g_pd3dDevice->CreateIndexBuffer(
36 * sizeof(WORD),
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
&g_pIB,
0);
VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof( Vertices ), ( void** )&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, Vertices, sizeof( Vertices ) );
g_pVB->Unlock();
WORD* indices = 0;
g_pIB->Lock(0,0,(void**)&indices,0);
indices[0] = 0; indices[1] = 1; indices[2] = 2;
indices[3] = 0; indices[4] = 2; indices[5] = 3;
// back side
indices[6] = 4; indices[7] = 6; indices[8] = 5;
indices[9] = 4; indices[10] = 7; indices[11] = 6;
// left side
indices[12] = 4; indices[13] = 5; indices[14] = 1;
indices[15] = 4; indices[16] = 1; indices[17] = 0;
// right side
indices[18] = 3; indices[19] = 2; indices[20] = 6;
indices[21] = 3; indices[22] = 6; indices[23] = 7;
// top
indices[24] = 1; indices[25] = 5; indices[26] = 6;
indices[27] = 1; indices[28] = 6; indices[29] = 2;
// bottom
indices[30] = 4; indices[31] = 0; indices[32] = 3;
indices[33] = 4; indices[34] = 3; indices[35] = 7;
g_pIB->Unlock();
D3DXVECTOR3 position(0.0f,0.0f,-5.0f);
D3DXVECTOR3 target(0.0f,0.0f,0.0f);
D3DXVECTOR3 up(0.0f,1.0f,0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V,&position,&target,&up);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &V);
D3DXMATRIXA16 Proj;
D3DXMatrixPerspectiveFovLH( & roj, D3DX_PI * 0.5f, (float)800/(float)600, 1.0f, 1000.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &Proj );
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
return S_OK;
}
VOID Render()
{
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
D3DXMATRIXA16 matWorld_X;
D3DXMatrixIdentity(&matWorld_X);
D3DXMatrixRotationX(&matWorld_X,timeGetTime()/500.0f);
D3DXMATRIXA16 matWorld_Y;
D3DXMatrixIdentity(&matWorld_Y);
D3DXMatrixRotationY(&matWorld_Y,timeGetTime()/500.0f);
D3DXMATRIXA16 matWorld_Z;
D3DXMatrixIdentity(&matWorld_Z);
D3DXMatrixRotationZ(&matWorld_Z,timeGetTime()/500.0f);
g_pd3dDevice->SetTransform(D3DTS_WORLD,&(matWorld_X*matWorld_Y*matWorld_Z));
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLESTRIP, 0,0,8,0, 12 );
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
VOID Cleanup()
{
if( g_pVB != NULL )
g_pVB->Release();
if( g_pIB != NULL )
g_pIB->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,
L"ClassNAME",NULL
};
RegisterClassEx( &wc );
HWND hWnd = CreateWindow( L"ClassName",L"DirectX9游戏编程第三章WIN32框架",
WS_OVERLAPPEDWINDOW,100,100,800,600,
NULL , NULL , wc.hInstance, NULL);
if (SUCCEEDED(InitializeD3D(hWnd)))
{
if(SUCCEEDED(InitVB()))
{
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(L"ClassName",wc.hInstance);
return 0;
} |
|