Old 06-02-2010, 02:19 PM
  post #1
ကိုေဇာ္
ႀကီးေကာင္၀င္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 127
ေက်းဇူးတင္စကား: 20
ပို႔စ္ 65 ခုအတြက္ 323 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ကိုေဇာ္ is on a distinguished road
Direct X programming

ဒီေခါင္းစဥ္နဲ႔ စတင္ေဆြးေႏြးထားတာမရွိေသးလို႔ ကၽြန္ေတာ္ကပဲ အရင္ ေခါင္းစဥ္ေပးျပီး စေရးလိုက္ပါျပီ။ ဖိုရမ္ admin မ်ားအေနနဲ႔ အသစ္ဖြင့္ခြင့္မရွိရင္ သင့္ေတာ္ရာ ေခါင္းစဥ္ေအာက္မွာ ထည့္ထားလို႔ ရပါတယ္။ ဒီေခါင္းစဥ္ကို အသစ္ဖြင့္ျပီး ေရးေပမယ့္ ကၽြန္ေတာ္က ေလ့လာေနဆဲအဆင့္ပဲရွိေသးျပီး ကၽြမ္းက်င္သူတစ္ေယာက္ ္မဟုတ္ေသးပါဘူး။ ဒီေခါင္းစဥ္နဲ႔ ပါတ္သက္ျပီး ေဆြးေႏြးမယ့္ သူမ်ားကို လဲဖိတ္ေခၞပါတယ္။

DirectX programming ဆိုတာ game programming တစ္ခုပါပဲ။Directx ကို C++, C#, Visual Basic, Java စတဲ့ language မ်ားစြာန႔ဲေရးလို႔ရပါတယ္။ ဂိမ္းေရးခ်င္သူမ်ားအတြက္ ေလ့လာသင့္တဲ့ programming တစ္ခုပါ။ကၽြန္ေတာ္ကေတာ့ C++ language ကိုအသုံးျပဳျပီးေရးပါတယ္။ Directx version9ပါ။ ဂိမ္းဆုိတာကေတာ့ ကစားတဲ့သူ အတြက္ႀကည့္ရင္ အလြန္လြယ္ကူသလုိရွိေပမယ့္ေရးတဲ့သူ developerေတြ အတြက္ကေတာ့ ဦးေႏွာက္ေျခာက္ဖို႔ ေတာ္ေတာ္ ေကာင္းပါတယ္။ DirectXဆိုတာ ဂိမ္းထဲမွာပါ၀င္တဲ့ graphicေတြကို screenေပၚမွာေပၚေအာင္၊ တစ္နည္းအားျဖင့္ ပုံဆြဲျပတာပါပဲ။ ဂိမ္းအတြက္Logic ေတြကေတာ့ကိုယ့္ရဲ႕ programming ကၽြမ္းက်င္မႈနဲ႔ စိတ္ကူးစိတ္သန္းေပၚမွာပဲမူတည္တာပါ။ သခ်ာၤတို႔ ရူပေဗဒ သေဘာတရားတို႔ကိုေတာ့ နားလည္ထားရပါမယ္။ ျပီးေတာ့ ကြန္ပ်ဴတာမွာ graphic ပုံဆြဲတယ္ဆိုတာ ပန္းခ်ီဆြဲသလို အျမင္ရွိမွလည္း ျဖစ္မယ့္အလုပ္မ်ိဳးပါ။ ကိုယ့္ရဲ႕ object ေတြကို အလင္းအေမွာင္ဘယ္လိုေပးမလဲ၊ ကင္မရာ ဘယ္လိုထားမလဲ ဆိုတာေတြ အျမင္ရွိဖို႔လိုအပ္ပါတယ္။ programming ဘယ္ေလာက္ကၽြမ္းကၽြမ္း ဒီလို အျမင္မ်ိဳးမရွိရင္လည္း ကိုယ္ေရးထားတဲ့ ဂိမ္းတစ္ခုက ပီပီျပင္ျပင္ျဖစ္လာမွာမဟုတ္ပါဘူး။ ျပီးေတာ့ 3ds max, autocad, maya စတဲ့ graphic software ေတြကို အသုံးျပဳနုိင္ရင္ပိုေကာင္းပါတယ္။ ကၽြန္ေတာ့္ဆရာက ေျပာဖူးပါတယ္။ အျမဲတမ္း တီထြင္ဆန္းသစ္ေနမွ ျဖစ္မယ္တဲ့။ တစ္ျခားသူေရးထားတဲ့ object ေတြ ၊ character ေတြ ယူသုံးေနရင္ေတာ့ ကုိယ္ပုိင္ျဖစ္လာမွာမဟုတ္ပါဘူး။ အဲဒီေတာ့ ကိုယ္တိုင္ ဖန္တီးနုိင္ေအာင္ အတြက္ 3d software ေတြ အသုံးျပဳနိုင္ရင္ပိုေကာင္းပါတယ္။ ဒါကေတာ့ဆက္စပ္အေႀကာင္းအရာေလးေတြပါ။ directx မစခင္မွာ သူနဲ႔ဆိုင္တဲ့ အေျခခံေလးေတြ အနည္းငယ္ေတာ့ သိထားဖို႔လိုအပ္ပါတယ္။

DirectX ဆိုတာကေတာ့ COM (Component Object Model) libraries ေတြကို စုစည္းထားတဲ့ SDK (software development kit) တစ္ခုျဖစ္ပါတယ္။ ဒီ libraries ေတြထဲမွာေတာ့ game development နဲ႔ multimedia အတြက္ function နဲ႔ class ေတြကို အေထာက္အပ့ံေပးထားပါတယ္။ျပီးေတာ့ DirectX ဆိုတာ Application Programming Interface (API) တစ္ခုပါပဲ။ DirectX ထဲမွာ အေသးစား API ေတြ -Direct3d, DirectInput, DirectSound, DirectShow, DirectPlay အစရွိသျဖင့္ ပါ၀င္ပါတယ္။ ဒါကေတာ့ DirectX ကို စျပီးေလ့လာမယ့္သူမ်ား သိနိုင္ေအာင္ သိသေလာက္ေလး အတိုခ်ဳပ္ေရးထားတာပါ။ ဒီ့ထက္ျပည့္ျပည့္စုံစုံ သိခ်င္ရင္ေတာ့ ဒီမွာ ရွင္းျပေပးထားတာေတြဖတ္နိုင္ပါတယ္။
ကိုေဇာ္ is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 13 ဦးတို႔မွ ကိုေဇာ္ အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 06-02-2010, 02:24 PM
  post #2
ကိုေဇာ္
ႀကီးေကာင္၀င္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 127
ေက်းဇူးတင္စကား: 20
ပို႔စ္ 65 ခုအတြက္ 323 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ကိုေဇာ္ is on a distinguished road
ျပန္စာ - Direct X programming

အခု ကြန္ပ်ဴတာ graphic ေတြကို scree ေပၚမွာ ေပၚလာေအာင္ ေနာက္ကြယ္မွာ ဘယ္လိုလုပ္ေဆာင္လဲ ဆိုတာကို အရင္ေလ့လာႀကည့္ရေအာင္။ 3d graphic ေတြကို screen မွာေပၚေအာင္ render မလုပ္ခင္မွာ back buffer လို႔ေခၚတဲ့ ေနာက္ထပ္ buffer တစ္ခုေပၚမွာ Direct 3d က ပုံေတြကို အရင္ဆြဲပါတယ္။ ပုံေတြအားလုံးဆြဲျပီးတဲ့ အခ်ိန္ေရာက္မွ front buffer လို႔ေခၚတဲ့ လက္ရွိအလုပ္လုပ္ေနတဲ့ screen ေပၚမွာ ေပၚေအာင္ ျပေပးပါတယ္။ အဲဒီအခ်ိန္မွာ back buffer ေပၚက ပုံကိုေတာ့ ဖ်က္ပစ္လုိက္ပါတယ္။ ဒီေနရာမွာ Tearing ဆိုတာကို ေလ့လာႀကည့္ရေအာင္။ Monitor ရဲ႕ refresh rate က 60hz (60 frame per second) က 100hz အထိရွိပါတယ္။ ကၽြန္ေတာ္တို႔ ပထမတစ္ပုံကို ဆြဲျပီး graphic adapter က ဒုတိယ တစ္ပုံကို Monitor refresh လုပ္ေနတဲ့အခ်ိန္မွာ render လုပ္တဲ့အခါမွာ screen ေပၚမွာေပၚတဲ့ ပုံက နွစ္ပိုင္းျဖစ္သြားတတ္ပါတယ္။ အေပၚတစ္၀က္မွာ ပုံအေဟာင္း နဲ႔ ေအာက္ တစ္၀က္မွာ ပုံအသစ္ေပၚျပီး ၊၄င္းကို Tearing လို႔ေခၚပါတယ္။ အဲဒီလိုမျဖစ္ေအာင္ အတြက္ DirectX မွာ front buffer နဲ႔ back buffer ႏွစ္ခုစလုံးကို pointer အသုံးျပဳျပီး သူတို႔ ရဲ႕ တန္ဖိုးေတြကို ေျပာင္းလဲေပးျခင္းအားျဖင့္ Tearing မျဖစ္နိုင္ေတာ့ပါဘူး။ ဒါကေတာ့ အေျခခံပဲ ရွိပါေသးတယ္။ ဒီ့ထက္ပိုက်ယ္ျပန္႔တာေတြ ရွိပါေသးတယ္။


img Source: Wikipedia

Last edited by ကိုေဇာ္; 06-02-2010 at 02:30 PM..
ကိုေဇာ္ is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 11 ဦးတို႔မွ ကိုေဇာ္ အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 06-02-2010, 02:44 PM
  post #3
ကိုေဇာ္
ႀကီးေကာင္၀င္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 127
ေက်းဇူးတင္စကား: 20
ပို႔စ္ 65 ခုအတြက္ 323 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ကိုေဇာ္ is on a distinguished road
ျပန္စာ - Direct X programming

ိိDirect X မစခင္ သူနဲ႔ဆိုင္မယ့္ 3D သီအိုရီအခ်ိဳ႕ အရင္ တင္ေပးပါမယ္။အရမ္းခက္ခက္ခဲခဲေတြေတာ့ မဟုတ္ပါဘူး ။ အေျခခံေလးေတြပါပဲ။ 3d ဆိုတာကို မစခင္ အရင္ဆုံး 2d က စႀကည့္ပါမယ္။ 2dမွာေတာ့ အားလုံးသိတဲ့အတိုင္း coordinate system မွာဆိုရင္ေတာ့ x,y ၀င္ရိုးႏွစ္ခုပဲ ရွိတာေပါ့ေလ။ 3d မွာေတာ့ x,y,z ဆိုျပီး ၀င္ရိုး ၃ခု ရွိရာမွာ coordinate system ကေတာ့ ေအာက္ကပုံအတိုင္းပါ။

2D Vector

2D vector အတြက္ အေျခခံ သီအိုရီေတြက-

Vector Addition

Vector Subtraction

Vector Multiplication with value

The unit vector and normalization vector


The scalar product of vector



ဒါေတြကို သိဖို႔လိုတဲ့ အေႀကာင္းက directx မွာ object တစ္ခုကို လွည့္တာပဲျဖစ္ျဖစ္ ေရြ႕လ်ားေစတာပဲျဖစ္ျဖစ္ ဒီ vector function ေတြနဲ႔ေရးပါတယ္။ အဲဒီလိုေရးဖို႔အတြက္ ဒီ သီအိုရီေတြကိုေတာ့ သိထားမွျဖစ္မွာပါ။
3d ဆိုတဲ့အတိုင္း dimension တစ္ခုပိုလာတာကလြဲလို႔ သိပ္ျပီးထူးထူးျခားျခား ေျပာင္းလဲျခင္းမရွိပါဘူး။

3d vector





Addition and Subtraction



Multiply a vector by the number and the normalization of vector




Vector Product

Last edited by ကိုေဇာ္; 06-02-2010 at 03:05 PM..
ကိုေဇာ္ is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 9 ဦးတို႔မွ ကိုေဇာ္ အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 06-02-2010, 03:08 PM
  post #4
ကိုေဇာ္
ႀကီးေကာင္၀င္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 127
ေက်းဇူးတင္စကား: 20
ပို႔စ္ 65 ခုအတြက္ 323 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ကိုေဇာ္ is on a distinguished road
ျပန္စာ - Direct X programming

DirectX ေရးဖို႔အတြက္ကို ကၽြန္ေတာ္က Microsoft Visual Studio 2008 ကို အသုံးျပဳထားပါတယ္။ DirectX (SDK) ေနာက္ဆုံး version ကို ဒီမွာ ေဒါင္းပါ။ ျပီးရင္ေတာ့ Visual Studio နဲ႔တြဲရပါမယ္။

Visual Studio မွာ Tools->Options ->Projects and Solutions ->VC++ Directories ကုိသြားပါ။

ျပီးရင္ Show Directories for: ဆိုတဲ့ box ထဲမွာ Include files ကိုေရြးပါ။ ျပီးရင္ New line icon ကိုေထာက္ျပီး install လုပ္ထားတဲ့ Microsoft DirectX SDK\Include path ကုိ ထည့္ေပးပါ။ ျပီးရင္ Show Directories for:

ထဲမွာပဲ Library files ကိုေရြးပါ။ ခုနက အတိုင္း Microsoft DirectX SDK\Lib\x86 path ကို ထည့္ပါ။ ဒီ Library မွာ 64 နဲ႔ 86 ဆိုျပီးႏွစ္ခုပါပါတယ္။ 32 bit သုံးတဲ့သူေတြအတြက္ကေတာ့ 86 ကို ေရြြးေပးရမွာပါ။

ျပီးရင္ေတာ့ New > Win32 project ကိုေရြးျပီး အသစ္တစ္ခုဖြင့္ႀကည့္ပါမယ္။ Welcome to Win 32 Application Wizard ဆိုတဲ့ dialog box တက္လာတဲ့အခါမွာေတာ့ Next ကိုေပးလိုက္ပါ။ ျပီးရင္ Application type : မွာ Window application နဲ႔ Additional options မွာ Empty project ကို ေရြးျပီး Finish ေပးလို႔ရပါျပီ။

ဒါဆိုရင္ project တစ္ခု စလို႔ ရပါျပီ။ Source file ထဲမွာ .cpp တစ္ခုကို အရင္ဖြင့္လိုက္ပါ။ project မစခင္ Project ေအာက္က Properties (Alt+F7) ကို ၀င္လိုက္ပါ။ အဲဒီမွာ

C/C++ ->General->Additional Include directories မွာ “$(DXSDK_DIR)\Include” ကိုထည့္ေပးပါ။

C/C++ -> Preprocessor ->Preprocessor Definations မွာ “WIN32;_DEBUG;_WINDOWS” ကိုထည့္ပါ။

Linker->Input->Additional dependencies မွာ “d3d9.lib” ကိုထည့္ပါ။ ဒါဆိုရင္ေတာ့ စေရးလို႔ရပါျပီ။


Last edited by ကိုေဇာ္; 06-02-2010 at 03:10 PM..
ကိုေဇာ္ is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 9 ဦးတို႔မွ ကိုေဇာ္ အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 06-02-2010, 03:15 PM
  post #5
ကိုေဇာ္
ႀကီးေကာင္၀င္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 127
ေက်းဇူးတင္စကား: 20
ပို႔စ္ 65 ခုအတြက္ 323 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ကိုေဇာ္ is on a distinguished road
ျပန္စာ - Direct X programming

အခု ကၽြန္ေတာ္တို႔ ပထမဆုံး အေနနဲ႔ စေရးပါမယ္။ အရင္ကေရးေနက် “hello world ” လို႔ပဲ ထင္ထားရင္ေတာ့ မွားပါလိမ့္မယ္။ ပထမဆုံးအေနနဲ႔ window တစ္ခုကို ေရးပါမယ္။
Code:
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>

#pragma comment (lib,"d3d9.lib")

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3ddevice;

void initd3d(HWND hWnd);// to initialize direct3d
void renderframe(void);// to render a single frame
void cleard3d(void);// to close direct3d and release memory
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
	HWND hWnd;
	WNDCLASSEX wclass;
	ZeroMemory(&wclass,sizeof(WNDCLASSEX));
	wclass.cbSize=sizeof(WNDCLASSEX);
	wclass.style=CS_HREDRAW|CS_VREDRAW;
	wclass.lpfnWndProc=WindowProc;
	wclass.hInstance=hInstance;
	wclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wclass.hbrBackground=(HBRUSH)COLOR_WINDOW;
	wclass.lpszClassName=L"NazzoClass";

	RegisterClassEx(&wclass);
	hWnd=CreateWindowEx(NULL,L"NazzoClass",L"Nazzo First Program",WS_OVERLAPPEDWINDOW,
		0,0,800,600,NULL,NULL,hInstance,NULL);
	ShowWindow(hWnd,nCmdShow);
	//Initialize Direct3d
	initd3d(hWnd);
	//main loop
	MSG msg;
	while(TRUE)
	{
		while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		if(msg.message==WM_QUIT)
			break;
		renderframe();
	}

	cleard3d();
	return msg.wParam;

}
//WinProc is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message)
	{
	case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		}break;
	}
	return DefWindowProc(hWnd,message,wParam,lParam);
}
//set up for direct 3d
void initd3d(HWND hWnd)
{
	d3d=Direct3DCreate9(D3D_SDK_VERSION);
	D3DPRESENT_PARAMETERS d3d_para;
	ZeroMemory(&d3d_para,sizeof(d3d_para));
	d3d_para.Windowed=TRUE;
	d3d_para.SwapEffect=D3DSWAPEFFECT_DISCARD;
	d3d_para.hDeviceWindow=hWnd;

	//create direct 3d device
	d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
		&d3d_para,&d3ddevice);

}
void renderframe(void)
{
	d3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
	d3ddevice->BeginScene(); //begins 3d scene
	//rendering back buffer
	d3ddevice->EndScene();
	d3ddevice->Present(NULL,NULL,NULL,NULL);

}
void cleard3d(void)
{
	d3ddevice->Release();
	d3d->Release();
}
Result


code တစ္ခုခ်င္းစီအတြက္ အေသးစိတ္ကို ကၽြန္ေတာ္ထပ္ျပီး ရွင္းျပေပးပါမယ္။
ကိုေဇာ္ is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 9 ဦးတို႔မွ ကိုေဇာ္ အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 08-02-2010, 05:59 AM
  post #6
kyaukphyu
အထူးအသင္း၀င္
 
kyaukphyu's Avatar
 
အသင္း၀င္ေန႔စြဲ: Nov 2008
ေရးသားခ်က္မ်ား: 472
ႏိုင္ငံအလံ: Users Flag!
ေက်းဇူးတင္စကား: 1,327
ပို႔စ္ 451 ခုအတြက္ 3,289 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
kyaukphyu is on a distinguished road
ျပန္စာ - Direct X programming

အကုိၾကီး ကုိေဇာ္ေရ မတတ္တေခါက္ႏွင္႕ ရမ္းသမ္းလုိက္ၿပီးေရးၾကည္႕ဒါ ေခါင္းေတာင္မူးသြားတယ္..
သိတဲ႕အကုိၾကီးတေယာက္ေမးၾကည္႕ေတာ႕မုိက္တယ္တဲ႕..ညီတုိ႕ကခုမွ စလုံးေရးစ ဆုိေတာ႕
အဆင္မေၿပဘူးအကုိေရ..အခ်ိန္ရရင္ေတာ႕ ရွင္းၿပပါအုံးအကုိ.. အကုိ ကုိရင္ၿပည္႕စုံႏွင္႕ ညီႏွင္႕
အားေပးပါတယ္အကုိ..
kyaukphyu is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 5 ဦးတို႔မွ kyaukphyu အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 09-02-2010, 08:35 PM
  post #7
ကိုေဇာ္
ႀကီးေကာင္၀င္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 127
ေက်းဇူးတင္စကား: 20
ပို႔စ္ 65 ခုအတြက္ 323 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ကိုေဇာ္ is on a distinguished road
ျပန္စာ - Direct X programming

ကၽြန္ေတာ္ ဒါေလးကို ျပည့္ျပည့္စုံစုံ ရွင္းျပနုိင္ဖို႔ အတြက္ျပင္ဆင္ေနရတာနဲ႔ နည္းနည္းႀကာသြားပါတယ္။ ဒါကို စျပီးမရွင္းခင္မွာ ေျပာစရာေလးရွိပါတယ္။DirectX ေရးခ်င္တဲ့သူမ်ားက Window API ကို အနည္းငယ္ အရင္ ေလ့လာထားသင့္ပါတယ္။API ကို မသိရင္ နည္းနည္း အခက္အခဲ ရွိနိုင္ပါတယ္။ကၽြန္ေတာ္ေအာက္မွာ API နဲ႔ပါတ္သက္တာေတြကို အနည္းငယ္ရွင္းျပထားပါတယ္။ ဒါေပမယ့္ အကုန္လုံးကို အေသးစိတ္ျပည့္ျပည့္စုံစုံ ရွင္းျပနုိင္မွာ မဟုတ္ပါဘူး။ ဒါေလးတစ္ခုေတာ့ ႀကိဳေျပာထားခ်င္ပါတယ္။
Quote:
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>
ပထမဆုံးအေနနဲ႔ header မ်ားကို စတင္ေႀကျငာပါတယ္။ #include <d3d9.h> ဆိုတာကေတာ့ အခုအသုံးျပဳမယ့္ direct3d 9 header file ရွိတဲ့ေနရာျဖစ္ပါတယ္။
#pragma comment (lib,"d3d9.lib")
Direct3d library ကိုယူသုံးမယ္ဆိုတာကို ေႀကျငာျခင္းျဖစ္ပါတယ္။ #pragma ကို မိမိအသုံးျပဳမယ့္ file ရွိတဲ့ေနရာကို တိုက္ရိုက္ညႊန္းဆိုတဲ့အခါမွ အသုံးျပဳပါတယ္။
Quote:
LPDIRECT3D9 d3d;
Direct3d အတြက္ Long Pointer သတ္မွတ္ေပးျပီး ၄င္းကိုအသုံးျပဳျပီး direct 3d ကို လုပ္ေဆာင္မွာျဖစ္ပါတယ္။
Quote:
LPDIRECT3DDEVICE9 d3ddevice;
Direct3d device အတြက္ Long Pointer ျဖစ္ျပီး ၄င္းထဲမွာ graphic driver ေတြရဲ႕ အခ်က္အလက္အကုန္ပါ၀င္ပါတယ္။ hardware နဲ႔ ဆိုင္သမွ်အလုပ္မ်ားကို ဒီ Pointer ကို အသုံးျပဳျပီး လုပ္ေဆာင္မွာျဖစ္ပါတယ္။
ျပီးရင္ Function Prototype ေတြကို ေႀကျငာပါတယ္။ အခု window အတြက္ေတာ့ အသုံးျပဳမယ့္ function ၃ ခုရွိပါတယ္။
Direct 3d ကို initialize set up လုပ္ဖို႔ အတြက္ void initd3d(HWND hWnd) function ကို အသုံးျပဳပါတယ္။ Type HWND ကေတာ့ (Handle Window) Window ကို handle လုပ္လို႔ရေအာင္အတြက္ Microsoft ရဲ႕ call တစ္ခု ျဖစ္ျပီး 32 bit integer ပါ။
ဒီ Function ထဲမွာေတာ့ direct 3d နဲ႔ဆိုင္တာေတြေရးပါမယ္။
void renderframe(void) function ထဲမွာေတာ့ မိမိဆြဲထားတဲ့ window အတြက္ render လုပ္ေပးဖို႔ ေရးထားပါတယ္။ ေရးထားသမွ် object ေတြကို render လုပ္မွာ ဒီထဲမွာပါ။
void cleard3d(void) function ကိုေတာ့ ေနာက္ဆုံး ပုံေတြကို screen ေပၚေရာက္ေအာင္လုပ္ျပီးမယ့္ အခ်ိန္မွာ သုံးထားသမွ် memory ေတြကို release လုပ္ရန္အတြက္ အသုံးျပဳျခင္းျဖစ္ပါတယ္။
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);ဒီ WindowProc ကိုမေျပာခင္မွာ API သေဘာတရားေလး နည္းနည္းေျပာပါမယ္။API (Application Programming Interface) ဆိုတာ Windows application နဲ႔ Windows ႀကားက ဆက္သြယ္မႈေတြပါ။၄င္းထဲမွာ Window OS နဲ႔ application ေတြကို ဆက္သြယ္ေပးမယ့္ function မ်ားစြာပါ၀င္ပါတယ္။Window API အသုံးျပဳတဲ့ Windows program တစ္ခုကို ေရးေတာ့မယ္ဆိုရင္ မေရးမျဖစ္ေရးရမယ့္ function ၂ ခုရွိပါတယ္။ အဲဒါေတြကေတာ့ WinMain() function နဲ႔
WindowProc() function ပါ။ WinMain() ကေတာ့ Console programming ေတြမွာ main() function နဲ႔အတူတူပါပဲ။ Program ရဲ႕ အဓိက လုပ္ေဆာင္ခ်က္အားလုံးကို စတင္လုပ္ေဆာင္ေပးမယ့္ေနရာျဖစ္ပါတယ္။ WindowPro() ကေတာ့ Application ကပို႔တဲ့ message ေတြကို လုပ္ေဆာင္နိုင္ရန္အတြက္ Window က ေခၚယူအသုံးျပဳတဲ့ function ပါ။ WinMain()က တိုက္ရိုက္ေခၚယူအသုံးျပဳျခင္းမရွိပါဘူး။၄င္းကို Message Processing function လို႔လဲ ေခၚနိုင္ပါတယ္။ ေအာက္ကပုံမွာ ၄င္း function ၂ခုရဲ႕ ဆက္သြယ္ပုံကိုေတြ႔နိုင္ပါတယ္။

ကိုေဇာ္ is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 7 ဦးတို႔မွ ကိုေဇာ္ အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 09-02-2010, 08:55 PM
  post #8
ကိုေဇာ္
ႀကီးေကာင္၀င္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 127
ေက်းဇူးတင္စကား: 20
ပို႔စ္ 65 ခုအတြက္ 323 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ကိုေဇာ္ is on a distinguished road
ျပန္စာ - Direct X programming

Code:
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
LRESULT က Window က သတ္မွတ္ထားတဲ့ return type တစ္ခုျဖစ္ျပီး type long နဲ႔ အတူတူပဲ ျဖစ္ပါတယ္။
HWND ကေတာ့ အေပၚမွာ ရွင္းျပထားတဲ့အတုိင္းပါပဲ။ UINT message ကေတာ့ 32-bit တန္ဖိုးရွိတဲ့ message ပါ၀င္တဲ့ message ID ပါ။
WPARAM wParam,LPARAM lParam ေတြကေတာ့ message အတြက္ တစ္ျခား အခ်က္အလက္ေတြပါ၀င္တဲ့ 32 bit value ေတြပါ။ဆက္ျပီးေတာ့ WinMain() ကိုႀကည့္ရေအာင္။
WinMain() ရဲ႕ Prototype ကေတာ့ -
Code:
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
WINAPI ကေတာ့ Window က သတ္မွတ္ထားတဲ့ macro ျဖစ္ပါတယ္။WinMain() fuction မွာ အေရးပါတာကေတာ ့ေနာက္က argument ၄ခုပါ။ ပထမဆုံး HINSTANCE hInstance ဆိုတာ လက္ရွိ လုပ္ေနတဲ့ program ကို handle လုပ္ဖို႔အတြက္ပါ။ HINSTANCE hPrevInstance ကေတာ့ အရင္က လုပ္ေနတဲ့ program အတြက္ပါ။ သူ႔ကို အျမဲတမ္း NULL ပဲေပးထားရမွာပါ။ LPSTR lpCmdLine ဆိုတာ program စတင္ဖို႔ အတြက္ commnad line ေတြပါ၀င္တဲ့ string အတြက္ pointer ပါ။ LPSTR က Window ရဲ႕ String အတြက္ 32 bit(Long) pointer ပါ။ int nCmdShow ကေတာ့ window ထြက္လာတဲ့အခါ ဘယ္လိုပုံစံရွိမယ္ဆိုတာကို သတ္မွတ္ဖို႔အတြက္ပါ။ သူ႔အတြက ္ value ေတြကေတာ့-
SW_HIDE ,SW_MAXIMIZE ,SW_MINIMIZE ,SW_RESTORE ,SW_SHOW,SW_SHOWMAXIMIZED , SW_SHOWMINIMIZED ,SW_SHOWMINNOACTIVE ,SW_SHOWNA , SW_SHOWNOACTIVATE, SW_SHOWNORMAL

အေသးစိတ္ကိုကေတာ့ msdn.com မွာပဲ ရွင္းထားတာေတြရွိပါတယ္။

Code:
WNDCLASSEX wclass;
WNDCLASSEX wclass structure ထဲမွာ window class ရဲ႕ အခ်က္အလက္ေတြပါ၀င္ပါတယ္။

Code:
ZeroMemory(&wclass,sizeof(WNDCLASSEX));
Code:
void ZeroMemory([in]  PVOID Destination,[in]  SIZE_T Length);

ဒီ ZeroMemory Macro ကိုေတာ့ programming language ေတြမွာ memory block ေတြကုိ zero ျဖစ္ေအာင္ ရွင္းထားဖို႔ သုံးပါတယ္။
Code:
	wclass.cbSize=sizeof(WNDCLASSEX); // object ရဲ႕ အရြယ္အစား (in bytes)
	wclass.style=CS_HREDRAW|CS_VREDRAW; // window ရဲ႕ style
	wclass.lpfnWndProc=WindowProc; //message processing funciton (WindowProc) အတြက္ pointer
	wclass.hInstance=hInstance;
	wclass.hCursor=LoadCursor(NULL,IDC_ARROW); //Window Cursor
	wclass.hbrBackground=(HBRUSH)COLOR_WINDOW; //Window ေနာက္ခံအေရာင္ (Handle Brush)

	wclass.lpszClassName=L"NazzoClass";//Class name အတြက္ pointer
RegisterClassEx(&wclass)ကေတာ့ အေပၚမွာ ေရးခဲ့တဲ့ Window class ကို Window ကသိေအာင္အတြက္ ေရးေပးရတာပါ။

Code:
hWnd=CreateWindowEx(NULL,L"NazzoClass",L"Nazzo First Program",WS_OVERLAPPEDWINDOW,
		0,0,800,600,NULL,NULL,hInstance,NULL);
CreateWindowEx function ကို သုံးျပီး overlapped, pop-up, child window စသည္တို႔ကို ျပဳလုပ္နိုင္ပါတယ္။
ဒီ function ထဲမွာ window class,title, style အစရွိသျဖင့္ သတ္မွတ္ေရးသားပါတယ္။သူ႔ရဲ႕Parameter ေတြမွာ
၁။ extended window style အတြက္ပါ။ ၄င္းကို အသုံးျပဳမွာမဟုတ္တဲ့အတြက္ NULL ပါ။
၂။ window class name
၃။ window name (Title bar မွာ ေဖာ္ျပေပးမယ့္ စာျဖစ္ပါတယ္)
၄။ window ရဲ႕ style ပါ။ over lapped , pop-up စသျဖင့္ေပါ့။
ေနာက္ ၂ ခုကေတာ့ window စေပၚမယ့္ x, y position ၂ ခုပါ။
ေနာက္ ၂ ခုကေတာ့ window ရဲ႕ အရြယ္အစား (width, height) ပါ။
၉။Parent window ကို handle လုပ္ဖို႔အတြက္ပါ။ အမ်ားအားျဖင့္ pop-up window အျဖစ္ေရးထားရင္ အသုံးျပဳပါတယ္။ child window မဟုတ္တဲ့အတြက္ NULL ပါ။
၁၀။Menu ကို handle လုပ္ဖို႔အတြက္ပါ။ Menu မသုံးထားတဲ့အတြက္ NULL ပါ။
၁၁။ hInstance
၁၂။ lpParam ကို NULL ထားရတဲ့အေႀကာင္းကေတာ့ multiple-document interface (MDI) client window ကို မသုံးတဲ့အတြက္ျဖစ္ပါတယ္။ အကယ္၍သုံးထားမယ္ဆိုရင္ေတာ့ ဒီေနရာမွာ အဲဒီ structure အတြက္ ေခၚယူမယ့္ pointer ေရးရမွာပါ။
ShowWindow(hWnd,nCmdShow) ကေတာ့ Window ကို screen ေပၚမွာ ျပသရန္ခိုင္းေစတာပါ။
ျပီးရင္ေတာ့ direct 3d ကို စတင္ဖို႔အတြက္ေရးထားတဲ့ initd3d() function ကိုေခၚပါတယ္။
ျပီးရင္ေတာ့ Window အတြက္ message loop ကုိေရးပါမယ္။Window မွာ message 2 မ်ိဳးရွိပါတယ္။ အစီအစဥ္တက် စီထားတဲ့ (queued message) နဲ႔ အစီအစဥ္တ က် မဟုတ္တဲ့ (non queued message) ပါ။Queued message ဆိုတာကေတာ့ Window က ဘာလုပ္မယ္ဆိုတဲ့ command (message) ေတြ အစီအစဥ္တက်စီထားျပီး WinMain() function ကေနျပီးေတာ့ တစ္ခုခ်င္းစီ အစီအစဥ္အလိုက္ လုပ္ေဆာင္ေပးတာပါ။၄င္း လုပ္ငန္းစဥ္ကို လုပ္တဲ့ message loop ကို WinMain() အတြင္းမွာေရးထားပါတယ္။Non queued message ဆိုတာကေတာ့ WinProc() ကေနျပီးေတာ့ Window က တိုက္ရိုက္ေခၚယူ လုပ္ေဆာင္တဲ့ message ေတြပါ။အခု ကၽြန္ေတာ္တို႔ message loop ကို ေလ့လာႀကည့္ပါမယ္။
(ဆက္ရန္)
ကိုေဇာ္ is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 9 ဦးတို႔မွ ကိုေဇာ္ အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 10-02-2010, 02:11 AM
  post #9
ကိုေဇာ္
ႀကီးေကာင္၀င္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 127
ေက်းဇူးတင္စကား: 20
ပို႔စ္ 65 ခုအတြက္ 323 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ကိုေဇာ္ is on a distinguished road
ျပန္စာ - Direct X programming

Message loop မွာ while loop နဲ႔ ပါတ္ျပီး boolean value True ေပးထားပါတယ္။ျပီးရင္ ကၽြန္ေတာ္တို႔အထဲမွာ while နဲ႔ထပ္ပါတ္ထားတဲ့ PeekMessage() function ကိုေလ့လာႀကည့္ရေအာင္။PeekMessage() က message queue မွ ၀င္လာသမွ် message(event) ေတြကို ရယူျပီး ျပန္ပို႔ေပးရပါတယ္(Retrieve and Send)။ Queue ထဲမွာ Message ရွိမရွိကို စစ္ေဆးျပီး ၎ကို လုပ္ေဆာင္ေပးပါတယ္။ Queue ထဲမွာ Message မရွိေတာ့ရင္ေတာ့ သူ႔ရဲ႕ return value က False ပါ။

Code:
BOOL PeekMessage(      
    LPMSG lpMsg,
    HWND hWnd,
    UINT wMsgFilterMin,
    UINT wMsgFilterMax,
    UINT wRemoveMsg
);
LPMSG lpMsg –message structure အတြက္ long pointer ပါ။ ၎ Pointer ကေနျပီးေတာ့ message information ေတြကို လက္ခံေပးမွာျဖစ္ပါတယ္။
HWND hWnd, -message ေတြအတြက္ window ကို handle လုပ္ဖို႔ပါ။ ဒီ parameter ရဲ႕ value က NULL ထားရတဲ့အေႀကာင္းကေတာ့ PeekMessage() က window ကပို႔တဲ့ message နဲ႔ queue ထဲမွာရွိတဲ့ message ေတြ ႏွစ္ခုစလုံးကို လုပ္ေဆာင္ေပးရန္ျဖစ္ပါတယ္။ (အႀကမ္းဖ်င္းအေနနဲ႔ပဲ မွတ္ထားေပးပါ။)
UINT wMsgFilterMin, UINT wMsgFilterMax, - ဒီ parameter ႏွစ္ခုလုံးက message filtering အတြက္ပါ။ ၎ရဲ႕တန္ဖိုး zero ဆိုရင္ Peekmessage က message အကုန္လုံးကို return ျပန္ေပးပါလိမ့္မယ္။၎ရဲ႕ တန္ဖိုးေတြကိုေတာ့ msdn မွာပဲ ရွာဖတ္ႀကည့္ႀကပါ။
UINT wRemoveMsg- Message ေတြကို ဘယ္လို handle လုပ္မယ္ဆိုတဲ့ parameter ပါ။ PM_REMOVE ဆိုရင္ေတာ့ Peekmessage က ၀င္လာတဲ့ message ေတြကို လုပ္ေဆာင္ျပီးတာနဲ႔ ဖ်က္ပစ္မွာပါ။ အေသးစိတ္ကိုေတာ့ msdn.com မွာပဲ ရွာဖတ္ႀကည့္ေပးပါ။

ကၽြန္ေတာ္အခု msdn ကိုညႊန္းေနရတာက ဒီတစ္ခုလုံးရဲ႕ အေသးစိတ္ကို ရွင္းေနရင္ API အပိုင္းလုံးလုံးေရာက္သြားျပီး လိုရင္းနဲ႔လြဲသြားမွာစုိးလို႔ပါ။ အကုန္လုံးကို အေသးစိတ္ရွင္းေနလို႔လဲ မျဖစ္နိုင္ပါဘူး။ဒါေႀကာင့္ လိုသေလာက္ပဲ ေဆြးေႏြးသြားမွာျဖစ္ပါတယ္။ ကၽြန္ေတာ္တို႔ကိုယ္တိုင္လဲ မသိတာေတြ၊ သိခ်င္တာေတြ၊ ေရးရာမွာ လိုအပ္တာေတြကို msdn ကေနပဲ reference ယူေနရတာပါ။ ဒီေလာက္အမ်ားႀကီးကို အကုန္အလြတ္မွတ္မိဖို႔လဲ မလြယ္ပါဘူး။ အဲဒါေႀကာင့္ ေနာက္ပိုင္းမွာ စိတ္၀င္တစားေရးမယ့္သူေတြက refrence ယူတတ္တဲ့ အေလ့အက်င့္ရွိထားတာပိုေကာင္းပါတယ္။ ေရးရမယ့္ procedure ကိုနားလည္ေနရပါမယ္။ ကိုယ္က ဘာလုပ္ခ်င္တယ္၊ အဲဒီအတြက္ ဘာ function ကိုသုံးရမယ္၊ ဒီ function အေႀကာင္းကို ဘယ္မွာရွိတယ္ ဆိုတာသိရင္ ေတာ္ေတာ္အဆင္အေျပပါျပီ။ ဒါကေတာ့ စတင္ျပီး ေရးမယ့္သူေတြ လြယ္ကူေအာင္လို႔ပါ။ စာေတာ့ အမ်ားႀကီးဖတ္ရပါလိမ့္မယ္။အခုကၽြန္ေတာ္တို႔ ဆက္လုိက္ရေအာင္။ဒီ PeekMessage() function က ဘာေတြကိုလုပ္ေဆာင္မလဲဆိုတာကို ႀကည့္ပါမယ္။

TranslateMessage(&msg)- ကေတာ့ virtual-key code ေတြကို character message အျဖစ္ေျပာင္းေပးပါတယ္။
DispatchMessage(&msg)- ကေတာ့ ၎ message ေတြကို Window Procedure ကိုပို႔ေပးဖို႔အတြက္ပါ။
PeekMessage() ရဲ႕ တန္ဖိုး TRUE ျဖစ္ေနသမွ် ဒီအလုပ္ေတြကို လုပ္ေနမွာပါ။

Code:
if(msg.message==WM_QUIT)
break;
အကယ္၍မ်ား user က window ကို ပိတ္လိုက္မယ္ ဆိုရင္ ဒီလုပ္ေဆာင္ခ်က္ကို ရပ္လိုက္ဖို႔အတြက္ပါ။ ဒီ statement ကို comment ေပးျပီး debug လုပ္ႀကည့္လိုက္ပါ။ window ကိုပိတ္လိုက္ရင္ေတာင္မွပဲ debug လုပ္ေနဆဲပဲဆိုတာကို ေတြ႔ပါလိမ့္မယ္။ ျပီးရင္ေတာ့ renderframe() function ကိုေခၚယူအသုံးျပဳထားပါတယ္။
Code:
cleard3d();// d3d နဲ႔ဆိုင္သမွ်ကို memory ထဲက ဖ်က္ပစ္ဖို႔အတြက္ပါ။ return msg.wParam; // main function အတြက္ return ျပန္ေပးတာပါ။
အက်ဥ္းခ်ဳပ္ျပီးႀကည့္လိုက္မယ္ဆိုရင္ေတာ့ ဒီ message loop က window ကေပးပို႔တဲ့ message ေတြမွန္သမွ်ကို လုပ္ေနမွာျဖစ္ပါတယ္။ဒီအလုပ္ကို လုပ္ေနသမွ်လဲ မိမိရဲ႕ object ေတြကို screen ေပၚမွာေပၚေအာင္ render လုပ္ေနဦးမွာပါ။ user က ပိတ္ပစ္လိုက္ရင္ေတာ့ ဒီအလုပ္ေတြအကုန္ရပ္ျပီး ဒီ process ကေနထြက္သြားပါလိမ့္မယ္။

Last edited by ကိုေဇာ္; 10-02-2010 at 02:18 AM..
ကိုေဇာ္ is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 8 ဦးတို႔မွ ကိုေဇာ္ အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 15-02-2010, 10:46 AM
ကိုေဇာ္
ႀကီးေကာင္၀င္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 127
ေက်းဇူးတင္စကား: 20
ပို႔စ္ 65 ခုအတြက္ 323 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ကိုေဇာ္ is on a distinguished road
ျပန္စာ - Direct X programming

Code:
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message)
	{
	case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		}break;
	}
	return DefWindowProc(hWnd,message,wParam,lParam);
}
အခု WinProc() function ကို စေလ့လာႀကည့္ပါမယ္။ဒီ function တစ္ခုလုံးရဲ႕ အဓိက ကေတာ့ switch statement ပါ။ switch statement အတြင္းမွာရွိတဲ့ case ေတြနဲ႔အလုပ္လုပ္မွာပါ။ ဥပမာ- ကၽြန္ေတာ္တို႔ Key ေတြနဲ႔ပါတ္သက္ျပီးရင္ ဒီထဲမွာေရးေလ့ရွိပါတယ္။ Case ထဲမွာ မိမိ object ကို လႈပ္ရွားေစခ်င္တဲ့ key ေတြအတြက္ event ေတြကိုေရးေပးထားျပီး user လုပ္ေဆာင္တဲ့ event နဲ ညီတဲ့အခါမွာ ၎ message ေတြကို လုပ္ေဆာင္ေပးမွာျဖစ္ပါတယ္။ ေလာေလာဆယ္ေတာ့ ဘာမွလုပ္စရာမလိုေသးတဲ့အတြက္ WM_DESTROY ကိုပဲေရးထားပါတယ္။ WM_DESTROY ကေတာ့ window ကို ပိတ္လိုက္တဲ့အခါမွာ window procedure ဆီကို window ကိုဖ်က္လိုက္ျပီျဖစ္ေႀကာင္း message ျပန္ပို႔ေပးဖို႔အတြက္ျဖစ္ပါတယ္။ PostQuitMessage function က system ဆီကို terminate လုပ္ဖို႔အတြက္ request ပို႔ေပးမွာျဖစ္ပါတယ္။၎ function ကို အမ်ားအားျဖင့္ WM_DESTORY message ကို response လုပ္ရန္အတြက္အသုံးျပဳႀကတာမ်ားပါတယ္။
Code:
DefWindowProc(hWnd,message,wParam,lParam);
DefWindowProc function ကေတာ့ ကၽြန္္ေတာ္တို႔ Window Procedure ထဲမွာ handle မလုပ္ထားတဲ့ message ေတြကို သူ႔ဘာသာသူလုပ္ဖို႔အတြက္ default ျပန္ထည့္ထားတာပါ။ ကၽြန္ေတာ္တို႔လုပ္ခ်င္တာေတြကိုပဲ ကၽြန္ေတာ္တို႔က ေရးစရာလိုျပီး အေသးစိတ္လုပ္ေဆာင္ခ်က္ေတြအတြက္ default ကပဲ လုပ္ေပးလိမ့္မယ္ဆိုတဲ့သေဘာမ်ိဳးပါပဲ။ အခုထိက API အပိုင္းနဲ႔ပါတ္သက္တာေတြပဲရွိပါေသးတယ္။ အခုမွ directX နဲ႔ဆိုင္တာလာမွာပါ။ ဖတ္တဲ့သူေတြလည္း မ်က္စိရႈပ္ကုန္ျပီနဲ႔တူတယ္။ေသခ်ာသေဘာမေပါက္တာမ်ိဳးရွိရင္လည္း ေမးနုိင္ပါတယ္။ ကိုယ့္ဘာသာကိုယ္ ဖတ္ရင္းနဲ႔ေတာင္ နည္းနည္းရႈပ္ေနသလိုပဲ။:D မသိတာေတြ၊ ရႈပ္တာေတြမ်ားလို႔ စိတ္ညစ္ျပီးေတာ့ရပ္မသြားပါနဲ႔။ ေနာက္ပိုင္းမွာ တစ္ျဖည္းျဖည္းနဲ႔သိလာပါလိမ့္မယ္။ ဒီလို စျပီးေလ့လာခါစအခ်ိန္ေတြေလာက္ပဲ စိတ္ညစ္ဖို႔ေကာင္းတာပါ။ကဲ ကၽြန္ေတာ္တို႔ဆက္ႀကည့္ရေအာင္။
ကိုေဇာ္ is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 5 ဦးတို႔မွ ကိုေဇာ္ အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 18-02-2010, 07:17 AM
ကိုေဇာ္
ႀကီးေကာင္၀င္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 127
ေက်းဇူးတင္စကား: 20
ပို႔စ္ 65 ခုအတြက္ 323 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ကိုေဇာ္ is on a distinguished road
ျပန္စာ - Direct X programming

Code:
void initd3d(HWND hWnd)
{
	d3d=Direct3DCreate9(D3D_SDK_VERSION);
	D3DPRESENT_PARAMETERS d3d_para;
	ZeroMemory(&d3d_para,sizeof(d3d_para));
	d3d_para.Windowed=TRUE;
	d3d_para.SwapEffect=D3DSWAPEFFECT_DISCARD;
	d3d_para.hDeviceWindow=hWnd;

	//create direct 3d device
	d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
		&d3d_para,&d3ddevice);

}
ဒီဖန္ရွင္ကေတာ့ direct3d ကိုစတင္ျပီး တည္ေဆာက္မွာပါ။ Direct3DCreate9(D3D_SDK_VERSION)ကေတာ့ direct3d interface အတြက္ပါ။ Parameter ျဖစ္တဲ့ D3D_SDK_VERSION ကေတာ့ DirectX version အတြက္ပါ။ d3d ကေတာ့ direct3d interface အတြက္ pointer ပါ။ႀကိဳက္တဲ့နာမည္ေပးလို႔ရပါတယ္။မွတ္ရတာအဆင္ေျပေအာင္ d3d လို႔ပဲေပးထားတာပါ။
D3DPRESENT_PARAMETERS ကေတာ့ graphic driver ရဲ႕ အခ်က္အလက္ေတြပါ၀င္တဲ့ member ေတြရွိတဲ႕ structure တစ္ခုပါ။ ဒီ structure က device ကို full screen ၊ back buffer အစရွိသျဖင့္ သတ္မွတ္ထိန္းခ်ဳပ္သြားတာပါ။ D3DPRESENT_PARAMETERS structure ကို define လုပ္ထားတဲ့ပုံစံက -
Code:
typedef struct D3DPRESENT_PARAMETERS {
    UINT BackBufferWidth, BackBufferHeight;
    D3DFORMAT BackBufferFormat;
    UINT BackBufferCount;
    D3DMULTISAMPLE_TYPE MultiSampleType;
    DWORD MultiSampleQuality;
    D3DSWAPEFFECT SwapEffect;
    HWND hDeviceWindow;
    BOOL Windowed;
    BOOL EnableAutoDepthStencil;
    D3DFORMAT AutoDepthStencilFormat;
    DWORD Flags;
    UINT FullScreen_RefreshRateInHz;
    UINT PresentationInterval;
} D3DPRESENT_PARAMETERS, *LPD3DPRESENT_PARAMETERS;
ZeroMemory(&d3d_para,sizeof(d3d_para)) ကိုေတာ့ D3DPRESENT_PARAMETERS structure တစ္ခုလုံးကို NULL ျဖစ္ေစဖို႔ သုံးထားတာပါ။
Quote:
d3d_para.Windowed=TRUE;
window ကို fullscreen ဟုတ္၊မဟုတ္ သတ္မွတ္ေပးတာပါ။ Value မွာ True ဆိုတာက window ပုံစံနဲ႔ပဲသုံးမွာပါ။ Full screen ျဖစ္ေစခ်င္ရင္ False ေပးရပါမယ္။ ဒါေပမယ့္ ဒီတစ္မ်ိဳးတည္း ေျပာင္းရင္ေတာ့ မရပါဘူး။ ေနာက္ပိုင္းမွ ဆက္ရွင္းေပးသြားပါမယ္။
Quote:
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
D3d present parameter ရဲ႕ member ျဖစ္တဲ့ SwapEffect ဆိုတာ Back buffer ကေန Front buffer ကို ဘယ္လိုပုံစံနဲ႔ေျပာင္းမယ္ဆိုတာ device ကိုသတ္မွတ္ေပးမွာပါ။ SwapEffect မွာ သုံးေလ့ရွိတဲ့ ပုံစံ ၃ မ်ိဳးကေတာ့-
D3DSWAPEFFECT_FLIP - buffer တစ္ခုနဲ႔တစ္ခု အကူးအေျပာင္းလုပ္တဲ့အခ်ိန္မွာ တစ္ဆင့္ျပီးတစ္ဆင့္ေျပာင္းျပီးလုပ္ေဆာင္ပါတယ္။သူ႔ရဲ႕လုပ္ေဆာင္ပုံကို ေအာက္မွာ ပုံျဖင့္ျပထားပါတယ္။


D3DSWAPEFFECT_COPY –back buffer ကိုမဖ်က္ပဲနဲ႔ front buffer သုိ႔ copy ကူးေပးျခင္းျဖင့္ ပုံမ်ားကို screen ေပၚမွာ ေပၚေစပါတယ္။ သူ႔ရဲ႕လုပ္ေဆာင္ပုံကေတာ့ ေအာက္မွာပါ။

D3DSWAPEFFECT_DISCARD – D3DSWAPEFFECT_FLIP နဲ႔လုပ္ေဆာင္ပုံတူေပမယ့္လည္း ပိုမိုျပီး ျမန္ဆန္စြာကူးေျပာင္းေပးနိုင္ပါတယ္။ အခု အသုံးျပဳထားတဲ့ပုံစံပါ။
Quote:
d3d_para.hDeviceWindow=hWnd;
Screen ေပၚမွာ backbuffer ရဲ႕ေနရာ အရြယ္အစားစသည္တုိ႔ကို device window က သတ္မွတ္ေပးဖို႔ပါ။
Quote:
CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3d_para,&d3ddevice);
CreateDevice function ကေတာ့ graphic device interface အတြက္ပါ။ ၎ရဲ႕ Prototype ကေတာ့
Code:
HRESULT CreateDevice(
    UINT Adapter,
    D3DDEVTYPE DeviceType,
    HWND hFocusWindow,
    DWORD BehaviorFlags,
    D3DPRESENT_PARAMETERS *pPresentationParameters,
    IDirect3DDevice9 **ppReturnedDeviceInterface);
D3DADAPTER_DEFAULT- graphic adapter အတြက္ပါ။မ်ားေသာအားျဖင့္ D3DADAPTER_DEFAULT ကို စက္မွာရွိတဲ့ primary video adapter ကိုအသုံးျပဳရန္အတြက္ အသုံးျပဳပါတယ္။
ဒုတိယ parameter ကေတာ့ device type အတြက္ပါ။ ဒီေနရာမွာ အသုံးမ်ားတဲ့ type သုံးမ်ိဳးကေတာ့
D3DDEVTYPE_HAL- hardware accelaration နဲ႔ rasterization အတြက္ပါ။ HAL ဆိုတာ Hardware Abstraction Layer ကိုေခၚတာပါ။ graphic အတြက္ hardware နဲ႔ process လုပ္ေပးမွာျဖစ္ျပီး hardware အသုံးမျပဳနိုင္တဲ့ စက္ေတြအတြက္ဆိုရင္ software နဲ႔အလုပ္လုပ္ေပးမွာပါ။Software ကိုသုံးရင္ေတာ့ graphic quality က်ပါတယ္။
D3DDEVTYPE_REF – Microsoft reference rasterizer ကိုအသုံးျပဳတာျဖစ္ပါတယ္။ တစ္ခါတစ္ေလမွာ hardware ေတြက direct3d လုပ္ေဆာင္ခ်င္တာေတြကို လုပ္ေပးနိုင္ဖို႔ အခက္အခဲေတြရွိတတ္ပါတယ္။ ဒီလိုအခါမ်ိဳးမွာ hardware ကို emulate လုပ္နိုင္ရန္အတြက္ အသုံးျပဳပါတယ္။
D3DDEVTYPE_SW – Pluggable Software device ကို အသုံးျပဳဖို႔အတြက္ပါ။
ေနာက္ထပ္ရွိေသးတဲ့ ႏွစ္မ်ိဳးကိုေတာ့ msdn မွာပါေလ့လာႀကည့္ပါ။
တတိယ parameter ကေတာ့ hFocusWindow ပါ။ Window က foreground mode ကေနျပီးေတာ့ background mode ကို ေျပာင္းသြားတဲ့အခ်ိန္္ေရာက္ရင္ focus window က Direct3d ကို alert ပို႔ေပးပါတယ္။Type ကေတာ့ hwnd ပါ။
BehaviorFlags ကေတာ့ device ေတြက ဘယ္လိုေဆာင္ရြက္တယ္ဆိုတာကို ထိန္းခ်ဳပ္ဖို႔အတြက္ပါ။ ၎ရဲ႕ flag ေတြက
D3DCREATE_SOFTWARE_VERTEXPROCESSING – vertex processing ကို software ျဖင့္ျပဳလုပ္ရန္
D3DCREATE_HARDWARE_VERTEXPROCESSING - vertex processing ကို hardware ျဖင့္ျပဳလုပ္ရန္

D3DCREATE_MIXED_VERTEXPROCESSING - vertex processing ကို ႏွစ္ခုစလုံးျဖင့္ ျဖင့္ျပဳလုပ္ရန္
၎ flags သုံးခုကို သင့္ေတာ္သလိုအသုံးျပဳလို႔ရပါတယ္။ အခုေတာ့ software ကိုပဲသုံးထားပါတယ္။ သာမန္ program ေတြမွာေတာ့ မထူးျခားေပမယ့္ ေနာက္ပိုင္း advance level ေတြမွာေတာ့ graphic ပုံေတြမွာ သိသာလာပါလိမ့္မယ္။
D3DPRESENT_PARAMETERS - ဒီ parameter မွာေတာ့ အေပၚမွာ ရွင္းျပထားတဲ့ d3d presentation parameter အတြက္ pointer ပါ။
IDirect3DDevice9 ** ကေတာ့ d3ddevice အတြက္ pointer ပါ။
ဒါဆိုရင္ေတာ့ d3d ကို initiate set up လုပ္တဲ့ function ျပီးသြားပါျပီ။ ဒီ function မွာေတာ့ d3d presentation parameter အတြက္ သတ္မွတ္ေပးျပီး createdevice function ကိုအသုံးျပဳျပီး graphic device interface ကို ဖန္တီးျခင္းျဖစ္ပ ါတယ္။
ကိုေဇာ္ is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 6 ဦးတို႔မွ ကိုေဇာ္ အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 23-02-2010, 01:58 AM
ကိုေဇာ္
ႀကီးေကာင္၀င္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 127
ေက်းဇူးတင္စကား: 20
ပို႔စ္ 65 ခုအတြက္ 323 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ကိုေဇာ္ is on a distinguished road
ျပန္စာ - Direct X programming

Code:
void renderframe(void)
{
	d3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
	d3ddevice->BeginScene(); //begins 3d scene
	//rendering back buffer
	d3ddevice->EndScene();
	d3ddevice->Present(NULL,NULL,NULL,NULL);

}
အခု ဒီ function ကို အသုံးျပဳျပီး ေနာက္ခံအနက္ေရာင္ရွိတဲ့ frame တစ္ခုကို render လုပ္မွာျဖစ္ပါတယ္။
Quote:
d3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
d3ddevice pointer ကိုသုံးျပီး back buffer အတြက္ အေရာင္သတ္မွတ္ဖို႔အတြက္ Clear() function ကိုေခၚပါတယ္။ဒီ function က back buffer ကို အရင္ clear လုပ္မွာျဖစ္ပါတယ္။
Code:
HRESULT Clear(
DWORD Count,
const D3DRECT *pRects,
DWORD Flags,
D3DCOLOR Color,
float Z,
DWORD Stencil
);
DWORD Count- pRects ထဲမွာရွိတဲ့ rectangle အေရအတြက္ပါ။ Back buffer ကို clear လုပ္တဲ့ေနရာမွာ ကုိယ္လိုခ်င္တဲ့ အပိုင္းလိုက္ပဲ ရွင္းလို႔ရပါတယ္။Back buffer တစ္ခုလုံးကို ရွင္းခ်င္တယ္ဆိုရင္ေတာ့ ဒီ parameter မွာ 0 ထားေပးရမွာပါ။
const D3DRECT *pRects- Back buffer ကိုရွင္းဖို႔အတြက္ ၎ေပၚမွာ အပိုင္းလုိက္သတ္မွတ္ေပးထားတဲ့ Rectangle Structure array တစ္ခုပါ။ Back buffer တစ္ခုလုံးကို ရွင္းဖို႔အတြက္ NULL အျဖစ္ထားေပးဖို႔လိုပါတယ္။
DWORD Flags- မိမိရွင္းလင္းခ်င္တဲ့ buffer ကိုသတ္မွတ္ေပးဖို႔အတြက္ပါ။ ဒီ parameter မွာေတာ့ flag သုံးခု ရွိပါတယ္။
D3DCLEAR_TARGET- frame buffer ကိုရွင္းျပီး Color parameter သုံးျပီး ေနာက္ခံအေရာင္သတ္မွတ္ေပးဖို႔အတြက္ပါ။
D3DCLEAR_STENCIL- Stencil buffer ကို ရွင္းျပီး Stencil parameter မွာ သတ္မွတ္ထားတဲ့ value ကို အသုံးျပဳထားမွာပါ။
D3DCLEAR_ZBUFFER- depth buffer ကို ရွင္းျပီး zbuffer parameter မွာ သတ္မွတ္ထားတဲ့ value ကုိ အသုံးျပဳမွာပါ။
ဒီ Flag parameter မွာေတာ့ အခု D3DCLEAR_TARGET ကိုပဲအသုံးျပဳထားပါတယ္။ဒီေနရာမွာ ကိုယ္လိုအပ္သလိုအသုံးျပဳလို႔ရပါတယ္။ မ်ားေသာအားျဖင့္ D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER ကိုတြဲျပီး pass ေပးေလ့ရွိပါတယ္။

Stencil buffer တို႔ Z buffer အေႀကာင္းသိခ်င္ရင္ေတာ့ ဒီလင့္ခ္ေတြမွာ ေလ့လာႀကည့္လို႔ရပါတယ္။
Link -1,2,
Link -1,2
D3DCOLOR Color- D3DCLEAR_TARGET parameter ကို အသုံးျပဳထားတဲ့အတြက္ ဒီေနရာမွာ ေနာက္ခံ background color ကို သတ္မွတ္ေပးရမွာပါ။ Color ကို သတ္မွတ္ေပးရမယ့္ပုံစံက 32 bit XRGB format နဲ႔ပါ။
D3DCOLOR_XRGB(0,0,0,0)- ေနာက္ခံအေရာင္ကို အနက္ေရာင္အေနနဲ႔သတ္မွတ္ထားပါတယ္။ေရွ႕ဆုံး parameter ကေတာ့ Alpha အတြက္ျဖစ္ေပမယ့္ frame buffer က အသုံးျပဳမွာမဟုတ္ပါဘူး။ color code ေတြကေတာ့ အားလုံးသိထားျပီးတဲ့ အတိုင္းျဖစ္လို႔ မိမိႀကိဳက္ႏွစ္သက္သလို သတ္မွတ္ေပးနိုင္ပါတယ္။

float Z- z parameter ကတန္ဖိုးကေတာ့ z buffer အတြက္ သတ္မွတ္ေပးဖို႔ျဖစ္ပါတယ္။ ဒီေနရာမွာ တန္ဖိုးက 0.0 နဲ႔ 1.0 ရွိတာမွာ 0.0 က အနီးဆုံးျမင္နိုင္တဲ့အကြာအေ၀းျဖစ္ျပီး 1.0 က အေ၀းဆုံးျမင္နိုင္တဲ့အကြာအေ၀းပါ။

DWORD Stencil- Stencil buffer အတြက္ integer တန္ဖိုးပါ။ တန္ဖိုးသတ္မွတ္ခ်က္ကေတာ့ 0 to 2n ျဖစ္ပါတယ္။ n ဆိုတာကေတာ့ stencil buffer ရဲ႕ bit depth ပါ။ Stencil buffer အသုံးမျပဳထားရင္ ဒီေနရာမွာ တန္ဖိုးက 0 ျဖစ္မွာပါ။


depth buffer
source: msdn.com

Quote:
d3ddevice->BeginScene(); မိမိရဲ႕ 3d scence စတင္ဆြဲျပီျဖစ္ေႀကာင္းစတင္ေႀကျငာျခင္းပါ။
ဒီ BeginScene() နဲ႔ EndScence ႀကားထဲမွာ back buffer အတြက္ render လုပ္မွာပါ။
Quote:
d3ddevice->EndScene(); မိမိရဲ႕ 3d scence ျပီးဆုံးေႀကာင္း ေရးသားတာပါ။
Quote:
d3ddevice->Present(NULL,NULL,NULL,NULL);
Present() function ကေတာ့ Page flipping ကို လုပ္ေဆာင္ေပးမွာျဖစ္ပါတယ္။ Page flipping ဆိုတာ back buffer ေပၚက ဆြဲထားတဲ့ အခ်က္အလက္၊ပုံေတြကို screen ေပၚမွာေပၚေအာင္လုပ္ေပးမွာ ျဖစ္ပါတယ္။
Code:
HRESULT Present( CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion );
CONST RECT *pSourceRect- back buffer ကေနျပီးေတာ့ display လုပ္ခိုင္းမယ့္ RECT structure ထဲက source rectangle ကိုညႊန္းတဲ့ pointer အတြက္ပါ။ ကၽြန္ေတာ္တို႔က Backbuffer တစ္ခုလုံးကိုသုံးမွာျဖစ္တဲ့အတြက္ NULL ပဲထားေပးရမွာပါ။
CONST RECT *pDestRect- destination rectangle ပါ၀င္တဲ့ တစ္ျခား RECT တစ္ခုအတြက္ pointer ပါ။ အသုံးျပဳရန္မလိုတဲ့အတြက္ NULL ပဲထားေပးပါတယ္။
HWND hDestWindowOverride- target area ကို အသုံးျပဳဖို႔အတြက္ destination window ပါ။ ကၽြန္ေတာ္တို႔က Presentation parameter structure မွာ window အတြက္သတ္မွတ္ေပးခဲ့ျပီျဖစ္တဲ့အတြက္ ဒီ parameter ကို NULL ပဲထားေပးရပါမယ္။
CONST RGNDATA *pDirtyRegion- ကေတာ့back buffer ကို လုိအပ္တဲ့ region အလုိက္ပဲ update လုပ္ခိုင္းဖုိ႔ျဖစ္ပါတယ္။ Back buffer တစ္ခုလုံးကို update လုပ္မွာျဖစ္တဲ့အတြက္ NULL ပါ။


Quote:
void cleard3d(void)
{
d3ddevice->Release();
d3d->Release();
}
ဒီ cleard3d function ကေတာ့ မိမိအသုံးျပဳထားတဲ့ d3ddevice နဲ႔ d3d တို႔ရဲ႕ memory ေတြကို အားလုံးလုပ္ျပီးသြားတဲ့အခါမွာ release လုပ္လုိက္တာပါ။ ဒါဆိုရင္ေတာ့ program တစ္ပုဒ္ျပီးသြားပါျပီ။ ဒီထဲမွာ မရွင္းတာေတြရွိရင္ ေမးလို႔ရပါတယ္။ ကၽြန္ေတာ္သိသေလာက္ ထပ္ျပီး ေျပာျပေပးပါမယ္။ ဒါေပမယ့္ ဒီလို game programming ကို စိတ္၀င္စားတဲ့သူက graphic theory ေတြ 3d နဲ႔ဆိုင္တာေတြ မ်ားမ်ားဖတ္ဖို႔ေတာ့လုိပါတယ္။ ဒီ program မွာတင္ တစ္ခ်ိဳ႕ parameter ေတြက graphic theory နဲ႔ဆိုင္တာေလးေတြပါလို႔ ေသခ်ာမရွင္းခဲ့တာေတြရွိပါတယ္။ တစ္ခုခ်င္းစီကို ေသေသခ်ာခ်ာပိုသိခ်င္ရင္ေတာ့ ကုိယ္တိုင္ေသေသခ်ာခ်ာေလ့လာမွ ျဖစ္မွာပါ။ အခုေနာက္ program ေတြမွာ ပုံေတြကို ဘယ္လိုဆြဲတယ္ဆိုတာ ေရးေပးပါမယ္။

Last edited by ကိုေဇာ္; 23-02-2010 at 02:08 AM..
ကိုေဇာ္ is offline   Reply With Quote
ေအာက္ပါအသင္း၀င္ 4 ဦးတို႔မွ ကိုေဇာ္ အား ေက်းဇူးတင္စကား ေျပာၾကားသြားပါသည္။
Old 05-09-2011, 12:00 PM
အသဲေလး၉၆
လမ္းေလွ်ာက္တတ္စ
 
အသင္း၀င္ေန႔စြဲ: Mar 2008
ေရးသားခ်က္မ်ား: 5
ေက်းဇူးတင္စကား: 3
ပို႔စ္ 1 ခုအတြက္ 1 ဦးမွ ေက်းဇူးတင္ေၾကာင္းေျပာပါသည္။
ပံုမ်ား: 2
အသဲေလး၉၆ is on a distinguished road
ျပန္စာ - Direct X programming

ဖတ္ရတာအရမ္းေကာင္းတယ္။ က္တကယ္လဲအသံုး၀င္ပါတယ္။ ေနာက္ထပ္မေရးေတာ့ဘူးလား ကိုတရုတ္။
အသဲေလး၉၆ is offline   Reply With Quote
Reply

တန္ဆာပလာမ်ား
ေဖာ္ျပမႈပံုစံ

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

ဖိုရမ္ေတြ ေက်ာ္ေရာက္ခ်င္ရင္ !

အျခားဆင္တူေဆြးေႏြးခ်က္မ်ား
ေဆြးေႏြးခ်က္ စတင္ေရးသားသူ ကြပ္ပ်စ္၀ိုင္း ျပန္စာမ်ား ေနာက္ဆံုးပို႔စ္
C# Programming Language ရုပ္ဆိုး ေဆြးေႏြးခ်က္မ်ား 8 21-03-2014 09:39 PM
phython ေမာင္ဧက ေဆြးေႏြးခ်က္မ်ား 7 31-12-2010 05:12 PM
Introduction to C++ programming and graphics ေမာင္ရုိး E-books မ်ား 1 18-05-2009 04:28 PM
An Introduction to Programming Using Visual Basic kothu E-books မ်ား 0 20-05-2008 04:19 AM


ဖိုရမ္၏ ပင္မအခ်ိန္သည္ ဂရင္းနစ္စံေတာ္ခ်ိန္ +6.5 ျဖစ္သည္။ေဒသစံေတာ္ခ်ိန္ 12:10 AM
Inactive Reminders By Icora Web Design