반응형

//-----------------------------------------------------------------------------
// File: CreateDevice.cpp
//
// Desc: 이것은 Direct3D 사용 첫번째 튜토리얼이다. 이 튜토리얼은 Direct3D를 사용해
//          장치 생성과 윈도우 초기화를 사용한다.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#include  // Direct3D9 를 사용하기 위한 헤더파일
#pragma warning( disable : 4996 ) // disable deprecated warning
#include
#pragma warning( default : 4996 )

 


//-----------------------------------------------------------------------------
// 전역 변수
//-----------------------------------------------------------------------------
LPDIRECT3D9         g_pD3D = NULL; // D3DDevice를 생성하기 위해 사용하기위한 변수
LPDIRECT3DDEVICE9   g_pd3dDevice = NULL; // device에 그리기 위한 변수

 


//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: 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; // 스왑 효과
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // 후면 버퍼 생성

    // Direct3D 장치 생성.
    // 디폴트 비디오 카드를 사용한다.
    // HAL 디바이스를 생성한다(HW 가속장치 사용)
    // 정점 처리는 모든 카드에서 지원하는 SW 처리로 생성한다(HW로 생성할 경우 성능 향상

    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,                          hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,                                  &g_pd3dDevice ) ) )

    {
        return E_FAIL;
    }

    // 디바이스 상태 정보를 처리할 경우 이곳에서 한다.

    return S_OK;
}

 


//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: 초기화된 객체들을 소거한다
//-----------------------------------------------------------------------------
VOID Cleanup()
{
 // 생성의 역순서로 해제 해야한다.
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

    if( g_pD3D != NULL )
        g_pD3D->Release();
}

 


//-----------------------------------------------------------------------------
// Name: Render()
// Desc: 화면을 그린다
//-----------------------------------------------------------------------------
VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;

    // 백버퍼를 지정된색(RGB)으로 지운다.
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 175, 100 ),                                      1.0f, 0 );

    // 렌더링 시작
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // 실제 렌더링 명령들이 나열되는 곳

        // 렌더링 종료
        g_pd3dDevice->EndScene();
    }

    // 후면 버퍼를 보이는 화면으로
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

 


//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: 윈도우 메시지 처리
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY: // 종료
            Cleanup();
            PostQuitMessage( 0 );
            return 0;

  case WM_KEYDOWN: // 키를 눌렀을때
   if( wParam == VK_ESCAPE ) { // esc를 눌렀을때
         ::DestroyWindow(hWnd);
          return 0;
   }

        case WM_PAINT:  // 화면 출력
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

 


//-----------------------------------------------------------------------------
// Name: wWinMain()
// Desc: 프로그램 시작 지점
//-----------------------------------------------------------------------------
INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{
    // 윈도우 클래스 등록
    WNDCLASSEX wc =
    {
        sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0L, 0L,
        GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
        L"D3D Tutorial", NULL
    };
    RegisterClassEx( &wc );

    // 윈도우 창 생성
    HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 01: CreateDevice",
                              WS_OVERLAPPEDWINDOW, 100, 100, 500, 500,
                              NULL, 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( L"D3D Tutorial", wc.hInstance );
    return 0;
}

반응형

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

[DirectX 9.0] Textures  (0) 2014.02.11
[DirectX 9.0] Lights  (0) 2014.02.11
[DirectX 9.0] Matrices  (0) 2014.02.11
[DirectX 9.0] Vertices  (0) 2014.02.11
DirectX 설치 및 설정 방법  (0) 2011.03.02

+ Recent posts