#include "d3d9.h"
#include "d3dx9math.h"
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib, "winmm.lib")
LPDIRECT3D9 g_pD3D = NULL;//Direct3D¶ÔÏó
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;//Direct3dÉ豸¶ÔÏó
IDirect3DVertexBuffer9 *g_pVB = NULL;
int g_RotateY = 0;
struct CUSTOMVERTEX {
float x, y, z;
DWORD color;
};
#define D3DFVF_CUSTOVMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
//³õʼ»¯Direct3D
HRESULT init3D(HWND hWnd)
{
//´´½¨Direct3D¶ÔÏ󣬸öÔÏóÓÃÀ´´´½¨Direct3DÉ豸¶ÔÏó
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{
return E_FAIL;
}
//ÉèÖÃD3DPERSENT_PARAMETERS½á¹¹£¬×¼±¸´´½¨Direct3DÉ豸¶ÔÏó
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
//´´½¨Direct3DÉ豸¶ÔÏó
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&g_pd3dDevice)))
{
return E_FAIL;
}
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, false);
return S_OK;
}
void SetupMatrices()
{
//°ÑÐýת½Ç»»Ëã³É»¡¶È
float angle = g_RotateY * D3DX_PI / 180;
D3DXMATRIX matWorld;
//¼ÆËãÊÀ½ç±ä»»¾ØÕó
::D3DXMatrixRotationY( &matWorld, angle );
//°ÑÊÀ½ç±ä»»¾ØÕóÉèÖõ½äÖȾ»·¾³
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
D3DXVECTOR3 eye( 0.0f, 0.0f,-5.0f ); //¹Û²ìµã
D3DXVECTOR3 lookat( 0.0f, 0.0f, 0.0f ); //ÊÓÏßÄ¿±êµã
D3DXVECTOR3 up( 0.0f, 1.0f, 0.0f ); //ÉÏ·½Ïò
D3DXMATRIX matView;
//¼ÆËãÊӽDZ任¾ØÕó
::D3DXMatrixLookAtLH( &matView, &eye, &lookat, &up );
//°ÑÊӽDZ任¾ØÕóÉèÖõ½äÖȾ»·¾³
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 );
}
HRESULT initVB(void)
{
CUSTOMVERTEX Vertex[] = {
{ -0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(255,0,0) }, //µãA£¬ºìÉ«
{ 0.0f, 0.5f, 0.0f, D3DCOLOR_XRGB(0,255,0) }, //µãB£¬ÂÌÉ«
{ 0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(0,255,255) },//µãC£¬Ç³À¶
{ -0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(0,255,0) }, //µãA£¬ºìÉ«
{ 0.0f, 0.5f, 0.0f, D3DCOLOR_XRGB(0,0,255) }, //µãB£¬ÂÌÉ«
{ 0.0f, -0.5f, 0.5f, D3DCOLOR_XRGB(0,255,255) },//µãC£¬Ç³À¶
{ 0.0f, 0.5f, 0.0f, D3DCOLOR_XRGB(255,0,0) }, //µãB£¬ÂÌÉ«
{ 0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(0,0,255) },//µãC£¬Ç³À¶
{ 0.0f, -0.5f, 0.5f, D3DCOLOR_XRGB(255,255,0) },//µãC£¬Ç³À¶
{ -0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(255,255,0) }, //µãA£¬ºìÉ«
{ 0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(0,0,255) },//µãC£¬Ç³À¶
{ 0.0f, -0.5f, 0.5f, D3DCOLOR_XRGB(0,0,255) },//µãC£¬Ç³À¶
};
if(FAILED(g_pd3dDevice->CreateVertexBuffer(sizeof(Vertex), 0, D3DFVF_CUSTOVMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL))) {
return E_FAIL;
}
void* pVertices;
g_pVB->Lock( 0, sizeof(Vertex), (void**)&pVertices, 0 );
memcpy( pVertices, Vertex, sizeof(Vertex) );
g_pVB->Unlock();
return S_OK;
}
//ÊÍ·Å´´½¨¶ÔÏó
void cleanUp()
{
if(NULL != g_pVB){
g_pVB->Release();
}
//ÊÍ·ÅDirect3DÉ豸¶ÔÏó
if (g_pd3dDevice != NULL)
{
g_pd3dDevice->Release();
}
//ÊÍ·ÅDirect3D¶ÔÏó
if (g_pD3D != NULL)
{
g_pD3D->Release();
}
}
//äÖȾͼÐÎ
VOID render()
{
//Çå¿Õºǫ́»º³åÇø
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
//ÔÚºǫ́»º³åÇø»æÖÆͼÐÎ
SetupMatrices();
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOVMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);
//½áÊøÔÚºǫ́»º³åÇøäÖȾͼÐÎ
g_pd3dDevice->EndScene();
}
//½«ÔÚºǫ́»º³åÇø»æÖƵÄͼÐÎÌá½»µ½Ç°Ì¨»º³åÇøÏÔʾ
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
//ÏûÏ¢´¦Àí
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
cleanUp();
KillTimer(hWnd, 1);
PostQuitMessage(0);
return 0;
default:
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
VOID CALLBACK TimerProc(HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
)
{
render();
g_RotateY += 2;
g_RotateY = g_RotateY % 1000;
}
//³ÌÐòÈë¿Ú
INT WINAPI WinMain(HINSTANCE hInst,
HINSTANCE,
LPTSTR,
INT)
{
//×¢²á´°¿ÚÀà
WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),
NULL,NULL,NULL,NULL,"ClassName",NULL};
RegisterClassEx( &wc );
//´´½¨´°¿Ú
HWND hWnd = CreateWindow("ClassName","×î¼òµ¥µÄ",
WS_OVERLAPPEDWINDOW,200,100,600,500,
NULL,NULL,wc.hInstance,NULL);
//³õʼ»¯Direct3D
if (SUCCEEDED(init3D(hWnd)))
{
if(SUCCEEDED(initVB())) {
//ÏÔʾÖ÷´°¿Ú
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
g_RotateY = 0;
SetTimer(hWnd, 1, 100, TimerProc);
//½øÈëÏûϢѻ·
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
}
UnregisterClass("ClassName",wc.hInstance);
return 0;
}