การสร้าง object ที่สำคัญของ Direct 3D

สร้าง Direct 3D กัน

LPDIRECT3D9g_pD3D= NULL;
LPDIRECT3DDEVICE9g_pD3DDevice = NULL;

g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
if( g_pD3D == NULL ) {
return;
}

สร้างตัว Device ของ Direct 3D

D3DDISPLAYMODE d3ddm;
if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) ) {
return;
}
HRESULT hr;
if( FAILED( hr = g_pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL,D3DRTYPE_SURFACE, D3DFMT_D16 ) ) )
{
if( hr == D3DERR_NOTAVAILABLE )
return;
}
D3DCAPS9 d3dCaps;
if( FAILED( g_pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dCaps ) ) ) {
return;
}
DWORD dwBehaviorFlags = 0;
if( d3dCaps.VertexProcessingCaps != 0 )
dwBehaviorFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
dwBehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;

D3DPRESENT_PARAMETERS d3dpp;
memset(&d3dpp, 0, sizeof(d3dpp));
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.Windowed = TRUE;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.BackBufferWidth = 1280;
d3dpp.BackBufferHeight = 720;
d3dpp.hDeviceWindow = g_hWnd;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, dwBehaviorFlags, &d3dpp, &g_pD3DDevice ) ) ) {
return;
}

Device ของ Direct 3D เปรียบเสมือนเป็นหน้าจอที่เราจะใช้แสดงผลนะครับ ในส่วนนี้จะให้ดูในส่วนที่สำคัญก็คือ

  • Windowed เป็นการบอกว่าจะแสดงผลเป็นแบบ window mode หรือ fullscreen mode
  • BackBufferWidth คือขนาดความกว้างของ back buffer
  • BackBufferHeight คือขนาดความสูงของ back buffer

ในส่วนนี้เราจะเห็นส่วนประกอบของการสร้าง device ขึ้นมา ส่วนหนึ่ง คือ buffer
ระบบ buffer นั่นคือ เมื่อเราต้องการ render ข้อมูลภาพต่าง ๆ เราจะได้ออกมาเป็นจุดสี ที่มีจำนวนจุดตามขนาดของ buffer เรีนกว่า color buffer นอกจากนี้ยังมี depth buffer ที่ใช้เก็บค่าความลึกของจุดแต่ละจุดไว้ หากในการ render มีการตรวจสอบความลึกด้วย เราจะไม่สามารถ render จุดสีที่มีความลึกมากกว่าจุดเดิมได้ ส่วน stencil buffer นั้นเป็น buffer ที่ใช้กรองการ render คล้ายกับ depth แต่ถูกสร้างมาเพื่อช่วยการ render ให้ดีขึ้น ถ้าศึกษาเทคนิดการ render เงา (shadow volume) ก็จะเห็นการใช้ buffer ชนิดนี้

บันทึกนี้เขียนที่ GotoKnow โดย  ใน การเขียนเกมด้วย DirectX



ความเห็น (0)