#include <string>
#pragma comment(lib, "d3d9.lib")
using namespace std;
//전역변수
LPDIRECT3D9 g_pD3D = NULL; // D3D 디바이스를 생성할 D3D 객체 변수
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 랜더링에 사용 될 D3D 디바이스
///Direct3D 초기화
HRESULT InitD3D(HWND hWnd)
{
///디바이스를 생성하기 위한 D3D 객체 생성
if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp; // 디바이스 생성을 위한 구조체
ZeroMemory(&d3dpp, sizeof(d3dpp)); // 반드시 구조체를 깨끗이 지워야한다.
d3dpp.Windowed = TRUE; // 창모드
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 가장 효율적인 SWAP 효과
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //현재 바탕화면 모드에 맞춰서 후면 버퍼 생성
if(FAILED(g_pD3D -> CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,
&g_pd3dDevice)))
{
return E_FAIL;
}
///디바이스 상태 정보를 처리할 경우 여기에서 함
return S_OK;
}
///초기화 된 객체들 소거
VOID Cleanup()
{
if(g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if(g_pD3D != NULL)
g_pD3D->Release();
}
//화면 그리기
VOID Render()
{
if(NULL == g_pd3dDevice)
return;
//후면 버퍼를 파란색으로 지운다.
g_pd3dDevice->Clear(0,NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0,0,255),1.0f,0);
//랜더링 시작
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
//실제 랜더링 명령들이 나열될 곳
//랜더링 종료
g_pd3dDevice->EndScene();
}
//후면 버퍼가 보이는 화면으로
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
//윈도우즈 프로시저
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
case WM_PAINT:
Render();
ValidateRect(hWnd, NULL);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
//프로그램의 시작점
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
string className = "D3D Tutorial";
wstring str2(className.length(), L' '); // Make room for characters
// Copy string to wstring.
copy(className.begin(), className.end(), str2.begin());
//...
//윈도우 클래스 등록
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
(LPCTSTR)"D3D Tutorial", NULL};
RegisterClassEx(&wc);
//윈도우 생성
HWND hWnd = CreateWindow((LPCTSTR)"D3D Tutorial", (LPCTSTR)"CreateDevice",
WS_OVERLAPPEDWINDOW, 100, 100, 600, 480,
GetDesktopWindow(), NULL, wc.hInstance, NULL);
//Direct3D 초기화
if(SUCCEEDED(InitD3D(hWnd)))
{
//윈도우 출력
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
//메시지 루프
MSG msg;
while(GetMessage(&msg, NULL, 0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//등록된 클래스 소거
UnregisterClass((LPCTSTR)"D3D Tutorial", wc.hInstance);
return 0;
}
P.S 창 이름이 한문으로 깨져서 나온다.
이유를 아시는 분은 꼭 댓글로 가려쳐 줬으면 합니다.
이 코드 인터넷 상에 많이 떠도는 데
붙여 넣기가 안되도록 많이 들 막아 놨더군요.
인터넷 세상 공유하면서 삽시다.
댓글 없음:
댓글 쓰기