|
编译没错误,可是就是无法运行!
#include <d3d8.h>
#include <d3dx8math.h>
#pragma comment(lib,"d3d8.lib")
#pragma comment(lib,"winmm")
#pragma comment(lib,"d3dx8.lib")
LPDIRECT3D8 g_pD3D=NULL;
LPDIRECT3DDEVICE8 g_pD3DDevice=NULL;
LPDIRECT3DVERTEXBUFFER8 g_pVertexBuffer=NULL;
struct CUSTOMVERTEX
{
float x,y,z;
DWORD color;
};
#define D3DFVF_CUMSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
HRESULT InitD3D(HWND hWnd)
{
g_pD3D = Direct3DCreate8(D3D_SDK_VERSION);
if (NULL==(g_pD3D)) return E_FAIL;
D3DDISPLAYMODE d3ddm;
if (NULL==(g_pD3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm))) return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC;
d3dpp.BackBufferFormat = d3ddm.Format;
g_pD3D -> CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice);
if (NULL==(g_pD3DDevice)) return E_FAIL;
g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
return S_OK;
}
HRESULT InitVertexBuffer()
{
VOID *pVertices;
CUSTOMVERTEX cvVertices[]=
{
//Top Face
{-5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(0, 0, 255),}, //Vertex 0 - Blue
{-5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 1 - Red
{5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 2 - Red
{5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 3 - Green
//Face 1
{-5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 4 - Red
{-5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(0, 0, 255),}, //Vertex 5 - Blue
{5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 6 - Green
{5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 7 - Red
//Face 2
{5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 0, 255),}, //Vertex 8 - Blue
{5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 9 - Green
//Face 3
{-5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 10 - Green
{-5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 11 - Red
//Face 4
{-5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 12 - Red
{-5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(0, 0, 255),}, //Vertex 13 - Blue
//Bottom Face
{5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 14 - Green
{5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 0, 255),}, //Vertex 15 - Blue
{-5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 16 - Red
{-5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 17 - Green
};
if (FAILED(g_pD3DDevice -> CreateVertexBuffer(18*sizeof(CUSTOMVERTEX),0,D3DFVF_CUMSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVertexBuffer))) return E_FAIL;
if (FAILED(g_pVertexBuffer -> Lock(0,sizeof(cvVertices),(BYTE**)&pVertices,0))) return E_FAIL;
memcpy(pVertices, cvVertices, sizeof(cvVertices));
//语法结构:memcpy(复制目的地址,源地址,尺寸)
g_pVertexBuffer -> Unlock();
return S_OK;
}
void SetupRotation()
{
D3DXMATRIX matWorld,matWorldX,matWorldY,matWorldZ;
D3DXMatrixRotationX(&matWorldX,timeGetTime()/400.0f);
D3DXMatrixRotationY(&matWorldY,timeGetTime()/400.0f);
D3DXMatrixRotationZ(&matWorldZ,timeGetTime()/400.0f);
D3DXMatrixMultiply(&matWorld,&matWorldX,&matWorldY);
D3DXMatrixMultiply(&matWorld,&matWorld,&matWorldZ);
g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);
}
void SetupCarema()
{
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0.0f, 0.0f,-30.0f),&D3DXVECTOR3(0.0f, 0.0f, 0.0f),&D3DXVECTOR3(0.0f, 1.0f, 0.0f));
//建立一个笛卡儿左手坐标系统观察矩阵
g_pD3DDevice->SetTransform(D3DTS_VIEW, &matView);
//第一个是DTS_WORLD,第二个是DTS_VIEW。是不是先建立世界再来看
}
void SetupPerspective()
{
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 500.0f);
//建立左右坐标来标志视野
g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}
void Render()
{
if (NULL==g_pD3DDevice) return;
g_pD3DDevice -> Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0, 0, 0),1.0f,0);
g_pD3DDevice -> BeginScene();
SetupRotation();
SetupCarema();
SetupPerspective();
//建立的一切都在绘制场景中体现出来
g_pD3DDevice -> SetStreamSource(0,g_pVertexBuffer,sizeof(CUSTOMVERTEX));
g_pD3DDevice -> DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
g_pD3DDevice -> DrawPrimitive(D3DPT_TRIANGLESTRIP,4,8);
g_pD3DDevice -> DrawPrimitive(D3DPT_TRIANGLESTRIP,14,2);
g_pD3DDevice -> EndScene();
g_pD3DDevice -> Present(NULL, NULL, NULL, NULL);
}
void Cleanup()
{
if (g_pVertexBuffer != NULL) g_pVertexBuffer -> 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: // 退出消息
PostQuitMessage( 0 );
return 0;
case WM_PAINT: // 绘制
Render();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
// WinMain程序入口
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( "Takhisis's Cube", "Takhisis",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
// 初始化D3D
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
if( SUCCEEDED( InitVertexBuffer() ) )
{
// 显示窗口
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// 消息循环
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
}
// 结束处理
Cleanup();
UnregisterClass( "Takhisis's Cube", wc.hInstance );
return 0;
} [em3] |
|