最簡單的DirectX 9.0 程式
最簡單的DirectX 9.0 程式
在換電腦或是換Visual Studio版本的時候
我通常使用這小(?)程式來確認directX的設定是否正確
他應該可以說是我在 directX 上的 Hello World
環境
windows 7 64-bit
Microsoft DirectX SDK (June 2010)
Visual Studio 2010
首先在微軟下載DirectX SDK
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=6812
安裝完後建立專案
設定好include的header
C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include
設定好Lib
C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86
程式碼 main.h
#ifndef __MAIN_H
#define __MAIN_H
//windows 相關
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
//directx 相關
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib,"dsound.lib")
#pragma comment(lib,"dinput8.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dxof.lib")
#pragma comment(lib,"dxguid.lib")
// 釋放記憶體
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
//可以在視窗後面顯示一個 console 方便除錯
#pragma comment(linker, "/subsystem:console /entry:WinMainCRTStartup")
//windows 相關
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//directx 相關
class MY_VERTEX
{
public:
D3DXVECTOR3 p;
DWORD color;
};
const DWORD MY_VERTEX_FVF=(D3DFVF_XYZ | D3DFVF_DIFFUSE);
LPDIRECT3D9 g_pD3D;
LPDIRECT3DDEVICE9 g_pD3DDevice;
D3DPRESENT_PARAMETERS g_D3DPP;
D3DXMATRIX g_proj;
D3DXMATRIX g_view;
D3DXMATRIX g_world;//
LPDIRECT3DVERTEXBUFFER9 g_pVB;
LPDIRECT3DTEXTURE9 g_pTexture;
void DirectXCreate(HWND hWnd);
void DirectXRender();
void DirectXDestroy();
#endif
程式碼 main.cpp
#include "main.h"
//win 32 視窗程式進入點
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//填好視窗資料
WNDCLASSEX wndclass = {sizeof(wndclass),
CS_HREDRAW|CS_VREDRAW, //style
WndProc,
0, 0, hInstance,
LoadIcon(NULL, IDI_APPLICATION), //hIcon
LoadCursor(NULL,IDC_ARROW), //hCursor
(HBRUSH)(COLOR_WINDOW+1), //hbrBackground
NULL, //hMenu
_T("window"),
LoadIcon(NULL, IDI_APPLICATION)}; //hIconSm
RegisterClassEx(&wndclass);
//產生視窗
HWND hWnd = CreateWindowEx(
0, //dwExStyle
_T("window"), _T("window"), //視窗標題
WS_OVERLAPPEDWINDOW, //dwStyle
CW_USEDEFAULT, CW_USEDEFAULT,
640, 480,
NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
//DirectX 初始化
DirectXCreate(hWnd);
MSG msg;
while(TRUE)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//DirectX 繪圖
DirectXRender();
}
}
//DirectX 資源釋放
DirectXDestroy();
return (int)msg.wParam;
}
//訊息迴圈
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
//DirectX 初始化
void DirectXCreate(HWND hWnd)
{
//初始化directX
D3DDISPLAYMODE d3ddm;
if((g_pD3D = ::Direct3DCreate9(D3D_SDK_VERSION)) == 0)
return;
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
return;
ZeroMemory(&g_D3DPP, sizeof(D3DPRESENT_PARAMETERS));
g_D3DPP.BackBufferCount = 1;
g_D3DPP.Windowed = TRUE;
g_D3DPP.BackBufferFormat = d3ddm.Format;
g_D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
g_D3DPP.EnableAutoDepthStencil = TRUE;
g_D3DPP.AutoDepthStencilFormat = D3DFMT_D16;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&g_D3DPP, &g_pD3DDevice))) {
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&g_D3DPP, &g_pD3DDevice))) {
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&g_D3DPP, &g_pD3DDevice))) {
return;
}}}
//初始化頂點資料
if(FAILED(g_pD3DDevice->CreateVertexBuffer(4*sizeof(MY_VERTEX),D3DUSAGE_WRITEONLY,
MY_VERTEX_FVF,D3DPOOL_MANAGED,
&g_pVB, NULL ))) return;
MY_VERTEX* v;
g_pVB->Lock( 0, 0, (void**)&v, 0 );
v[0].p = D3DXVECTOR3(-1.5f, 1.5f, 0.0f );
v[1].p = D3DXVECTOR3( 1.5f, 1.5f, 0.0f );
v[2].p = D3DXVECTOR3(-1.5f, -1.5f, 0.0f );
v[3].p = D3DXVECTOR3( 1.5f, -1.5f, 0.0f );
v[0].color = v[1].color = v[2].color = v[3].color =
D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f);
g_pVB->Unlock();
g_pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE);
g_pD3DDevice->SetRenderState( D3DRS_ZENABLE, TRUE);
g_pD3DDevice->SetRenderState( D3DRS_DITHERENABLE,TRUE);
g_pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE);
//設定矩陣
D3DXMatrixIdentity( &g_view);
D3DXMatrixLookAtLH( &g_view, &D3DXVECTOR3(0.0f, 0.0f, -10.0f),
&D3DXVECTOR3(0.0f, 0.0f, 0.0f),
&D3DXVECTOR3(0.0f, 1.0f, 0.0f));
g_pD3DDevice->SetTransform(D3DTS_VIEW, &g_view);
D3DVIEWPORT9 vp;
if(FAILED(g_pD3DDevice->GetViewport(&vp))) return;
float aspect;
aspect = (float)vp.Width / (float)vp.Height;
D3DXMatrixIdentity(&g_proj);
D3DXMatrixPerspectiveFovLH(&g_proj, D3DXToRadian(45.0f), aspect, 5.0f, 1000.0f);
g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &g_proj);
D3DXMatrixIdentity(&g_world);
g_pD3DDevice->SetTransform(D3DTS_WORLD, &g_world);
}
//DirectX 繪圖
void DirectXRender()
{
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
g_pD3DDevice->BeginScene();
g_pD3DDevice->SetStreamSource( 0, g_pVB, 0, sizeof(MY_VERTEX) );
g_pD3DDevice->SetFVF( MY_VERTEX_FVF );
g_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
g_pD3DDevice->EndScene();
g_pD3DDevice->Present(0,0,0,0);
}
//DirectX 資源釋放
void DirectXDestroy()
{
SAFE_RELEASE(g_pVB);
SAFE_RELEASE(g_pD3DDevice);
SAFE_RELEASE(g_pD3D);
}
執行結果
當然
DirectX的能耐不是只有這樣
《深入淺出DirectX程式設計》是本不錯的入門書
其實這小範例就是改它的~XD



留言
張貼留言