본문 바로가기

Programming/DirectX

기본 Winmain.cpp 다이렉트x 초기화 포함

#include <Windows.h> #include <d3dx9.h> #pragma comment ( lib, "d3d9.lib" ) #pragma comment ( lib, "d3dx9.lib" ) #pragma comment ( lib, "winmm.lib" ) //사용자 추가 전역 변수 int ActiveFlage = TRUE; // 반복 체크 LPDIRECT3D9 pDX = NULL; // dx객체 LPDIRECT3DDEVICE9 pDevice = NULL; // dx디바이스 D3DPRESENT_PARAMETERS stParam; // 파라메터 구조체 // 사용자 추가 핸들 // 콜백 함수 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); // 다이렉트x 초기화 VOID Device_Init(INT WIDTH, INT HEIGHT, HWND hwnd); int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) { static TCHAR szAppName[] = "My Project"; MSG msg; HWND hwnd; WNDCLASSEX wndclass; //HDC hdc; int WIDTH = 800,\ HEIGHT = 600; int roop = 1; bool bWindow = TRUE; // 창모드 체크 wndclass.cbSize = sizeof( wndclass ); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon( NULL, MAKEINTRESOURCE( IDI_APPLICATION ) ); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = ( HBRUSH )GetStockObject( WHITE_BRUSH ); wndclass.lpszMenuName = NULL; // 메뉴없음 wndclass.lpszClassName = szAppName; wndclass.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); RegisterClassEx ( &wndclass ); hwnd = CreateWindow( szAppName, szAppName, WS_SYSMENU, ( GetSystemMetrics( SM_CXSCREEN ) - WIDTH ) / 2, ( GetSystemMetrics( SM_CYSCREEN ) - HEIGHT ) / 2, WIDTH, HEIGHT, NULL, NULL, hInstance, NULL ); ShowWindow( hwnd, iCmdShow ); UpdateWindow ( hwnd ); //다이렉트 X 관련 Device_Init(WIDTH, HEIGHT, hwnd); D3DXMATRIX mWorld; // 월드 행렬 D3DXMATRIX mView; // 뷰 행렬 D3DXMATRIX mProj; // 투영 행렬 // 투영행렬 셋팅 D3DXMatrixPerspectiveFovLH ( &mProj, 1.0f, 1.333f, 0.1f, 1000 ); float fCamera_x = 0.0f; float fCamera_y = 0.0f; float fCamera_z = 100.0f; while( roop ) { while( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) != 0 ) { if( GetMessage( &msg, NULL, 0, 0 ) == 0 ) { roop = 0; } TranslateMessage( &msg ); DispatchMessage( &msg ); } if ( ActiveFlage == TRUE ) // 실제 게임 코딩영역 { if ( GetAsyncKeyState(VK_ESCAPE) ) { ActiveFlage = FALSE; roop = NULL; } if ( GetAsyncKeyState( 'W' ) ) { fCamera_z-=0.01f; } if ( GetAsyncKeyState( 'S' ) ) { fCamera_z+=0.01f; } if ( GetAsyncKeyState( 'A' ) ) { fCamera_x+=0.01f; } if ( GetAsyncKeyState( 'D' ) ) { fCamera_x-=0.01f; } if ( GetAsyncKeyState( VK_SPACE ) ) { fCamera_x = 0.0f; fCamera_y = 0.0f; fCamera_z = 100.0f; } // 카메라 셋팅 D3DXMatrixLookAtLH ( &mView, &D3DXVECTOR3(fCamera_x, fCamera_y, fCamera_z), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f) ); pDevice->Clear( 0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, 0xff000000, 1.0f, 0UL ); // 화면을 검은색으로 지움 pDevice->BeginScene(); // 그리기 시작 pDevice->EndScene(); // 그리기 종료 pDevice->Present( NULL, NULL, NULL, NULL ); // 화면에 뿌려줌 } } pDevice->Release(); // 디바이스 해제 return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch ( iMsg ) { case WM_ACTIVATE: { break; } case WM_CREATE: { ActiveFlage = TRUE; break; } case WM_CLOSE: { ActiveFlage = FALSE; PostQuitMessage(0); break; } case WM_PAINT: break; default: break; } return DefWindowProc( hwnd, iMsg, wParam, lParam ); } VOID Device_Init(INT WIDTH, INT HEIGHT, HWND hwnd) { stParam.AutoDepthStencilFormat = D3DFMT_D24X8; // 깊이 버퍼를 24비트로 만듬 stParam.BackBufferCount = 1; // 1개의 백버퍼를 만듬 stParam.BackBufferFormat = D3DFMT_X8R8G8B8; // 백버퍼 포멧형태 stParam.BackBufferHeight = HEIGHT; // 버퍼 크기 stParam.BackBufferWidth = WIDTH; // 버퍼 크기 stParam.EnableAutoDepthStencil = TRUE; // 스텐실 버퍼 자동생성 사용 stParam.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; // 시스템 자체가 백버퍼를 건딜 수 있게 한다 ( 하지만 작동 안함 ) stParam.Windowed = TRUE; // 창모드로한다 stParam.hDeviceWindow = hwnd; // 디바이스가 어느 윈도우랑 연결될지 체크 윈도우 핸들을 넣어준다 stParam.SwapEffect = D3DSWAPEFFECT_DISCARD; // 백버퍼에서 프론트버퍼로 가져올 방식 stParam.FullScreen_RefreshRateInHz = 0; // 모니터 주사율 창모드는 0 stParam.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // 프레젠트 명령어가 호출되면 바로 프론트 버퍼에 뿌림 stParam.MultiSampleQuality = D3DMULTISAMPLE_NONE; // 멀티셈플링 옵션으로 안씀(느려서) pDX = Direct3DCreate9( D3D_SDK_VERSION ); pDX->CreateDevice(0, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &stParam, &pDevice ); // 맨앞 0번은 몇번째 그래픽 카드를 쓸것인지 0번이 현재 모니터에 뿌려주고있는 그래픽카드 }


이 소스코드는 기본적인 윈도우창을 띄움과 다이렉트x를 초기화 하는 코드이다.

에러가 나지 않으려면 다이렉트X JUNE 2010 SDK를 설치해야 하며 추가 라이브러리와 포함디렉토리를 설정해주어야한다.

또한 유니코드가 아닌 멀티바이트 형식으로 해야 에러가 나지 않을것이다.

'Programming > DirectX' 카테고리의 다른 글

색상 입히기  (0) 2013.12.13
인덱스 버퍼(Index Buffer) / 버텍스 버퍼(Vertex Buffer)  (1) 2013.12.12
DirectX Text 출력 클래스  (0) 2013.11.30