±¾ÎÄËù·ÖÏíµÄ֪ʶµãÊÇ¡¾¡¾±Ê¼Ç¡¿¡¶DirectX 9.0 3DÓÎÏ·¿ª·¢±à³Ì»ù´¡¡·£ºDirect3D³õʼ»¯¡¿£¬»¶ÓÄúϲ»¶52ijËù·ÖÏíµÄÐÂÎÅ¡¢¹¥ÂÔ¡¢µçÄԽ̳̼°ÊÖ»ú֪ʶµÈ¾Ñ飬ÏÂÃæÊÇÏêϸµÄ½²½â¡£
¡¾±Ê¼Ç¡¿¡¶DirectX 9.0 3DÓÎÏ·¿ª·¢±à³Ì»ù´¡¡·£ºDirect3D³õʼ»¯
#include "d3dUtility.h"
namespace d3d {
bool InitD3D( HINSTANCE hInstance, int width, int height, bool windowed, D3DDEVTYPE deviceType, IDirect3DDevice9 **device) {
HWND hwnd; //´°¿Ú¾ä±ú
WNDCLASS wndclass; //´°¿ÚÀà±ð£¬ÔÚCreateWindow֮ǰÐèÒªRegisterClass £¬ Õë¶ÔWNDCLASSµÄ²ÎÊý¿ÉÒÔÁ˽âÒ»ÏÂAPI
wndclass.style=CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc=(WNDPROC)d3d::WndProc; //WndProc
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor=LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground=(HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName=NULL ;
wndclass.lpszClassName=_T("Direct3D9App");
if( !RegisterClass(&wndclass) ) {
MessageBox(0, _T("This program requires windows NT!"), 0, 0);
return false;
}
hwnd=CreateWindow(_T("Direct3D9App"),_T("Direct3D9App"),WS_EX_TOPMOST,0,0,width,height,0,0,hInstance,0);
::ShowWindow(hwnd,SW_SHOW);
::UpdateWindow(hwnd);
//Íê³ÉÁËÖ÷´°¿Ú³õʼ»¯µÄ¹ý³Ì£¬ÒÔϲ¿·ÖʵÏÖDirect3DµÄ³õʼ»¯¹ý³Ì£¬²¢ÇÒÉèÖÃIDirect3DDevice9Ö¸Õë
IDirect3D9 *_d3d9;
_d3d9=Direct3DCreate9(D3D_SDK_VERSION); //»ñÈ¡IDirect3D9µÄÖ¸Õ룬½øÐÐÉ豸µÄµü´ú£¬¼ì²âÌØÐÔ&»ñÈ¡IDirect3DDevice9Ö¸Õë×¼±¸
if( !_d3d9 )
{
::MessageBox(0, _T("Direct3DCreate9() - FAILED"), 0, 0);
return false;
}
D3DCAPS9 caps; //¼ì²âͼÐÎÉ豸µÄÖ§³ÖµÄÌØÐÔ
_d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
int vp=0; //ÊÇ·ñÖ§³ÖÓ²¼þ¶¥µãÔËËã
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) {
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else {
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}
D3DPRESENT_PARAMETERS d3dpp; //D3DPRESENT_PARAMETERSÉèÖã¬ÉèÖÃIDirect3DDeviceµÄÌØÐÔ
::ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));
d3dpp.BackBufferWidth=width;
d3dpp.BackBufferHeight=height;
d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount=1;
d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality=0;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow=hwnd;
d3dpp.Windowed=windowed;
d3dpp.EnableAutoDepthStencil=true;
d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;
d3dpp.Flags=0;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
HRESULT hr=_d3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, device);
if( FAILED(hr) ) {
::MessageBox(0, _T("CreateDevice() - Failed"), 0, 0);
return false;
}
return true;
}
int EnterMsgLoop( bool (*ptr_display)(float timeDelta) ) {
MSG msg;
::ZeroMemory( &msg, sizeof(MSG) );
static float lastTime=(float)timeGetTime();
while(msg.message !=WM_QUIT) {
if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else { //¿ÕÏеÄʱºò½øÐлæÖÆ
float currTime=(float)timeGetTime();
float timeDelta=(currTime - lastTime)*0.001f;
ptr_display(timeDelta);
lastTime=currTime;
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch( msg ) {
case WM_DESTROY:
::PostQuitMessage(0);
break;
case WM_KEYDOWN:
if(wParam==VK_ESCAPE) //escÍ˳öÖ÷´°¿Ú³ÌÐò
::DestroyWindow(hwnd);
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
}
¹ØÓÚ¡¾±Ê¼Ç¡¿¡¶DirectX 9.0 3DÓÎÏ·¿ª·¢±à³Ì»ù´¡¡·£ºDirect3D³õʼ»¯µÄÏà¹ØÌÖÂÛÈçÏ£º
¡¡¡¡Ïà¹ØÎÊÌ⣺DirectX 9.0 3DÓÎÏ·¿ª·¢±à³Ì»ù´¡ ¶Áºó¸Ð
¡¡¡¡´ð£ºDirectX 9.0 3DÓÎÏ·¿ª·¢±à³Ì»ù´¡ ÄÚÈÝÌáÒª£º ±¾ÊéÖ÷Òª½éÉÜÈçºÎʹÓÃDirectX 9.0¿ª·¢½»»¥Ê½3DͼÐγÌÐò£¬ÖصãÊÇÓÎÏ·¿ª·¢¡£È«ÊéÊ×ÏȽéÉÜÁ˱ØÒªµÄÊýѧ¹¤¾ß£¬È»ºó½²½âÁËÏà¹ØµÄ3D¸ÅÄî¡£ÆäËûÖ÷Ì⼸ºõº¸ÇÁËDirect3DÖеÄËùÓлù±¾ÔËË㣬ÀýÈçͼԪµÄ»æÖÆ¡¢¹â... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺ËÓС¶DirectX 9.0 3DÓÎÏ·¿ª·¢±à³Ì»ù´¡¡·Õâ±¾ÊéÉÏ...
¡¡¡¡´ð£º´úÂëµÄÍøÕ¾ÒѾ¸ÄÁË£¬www.d3dcoder.net ÉÏÈ¥¾ÍÖªµÀÁË ÕÒ²»µ½ÎÒÔÙ¸øÄã·¢°É >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺directx 9.0 3DÓÎÏ·¿ª·¢±à³Ì»ù´¡
¡¡¡¡´ð£ºÎÒÀ´°¡ ÎÒ >>Ïêϸ
- ÆÀÂÛÁÐ±í£¨ÍøÓÑÆÀÂÛ½ö¹©ÍøÓѱí´ï¸öÈË¿´·¨£¬²¢²»±íÃ÷±¾Õ¾Í¬ÒâÆä¹Ûµã»ò֤ʵÆäÃèÊö£©
-
