最簡單的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


留言

這個網誌中的熱門文章

MSVC 與 CRT 之間的恩怨情仇

EXCEL VBA

演員筆記