Direct3D 객체를 생성해 이것으로 디바이스(Device) 생성하는 방법을 코드로써 알려 준다.

여기서 짚고 넘어가야 할 부분은 바로 Direct3D 객체와 Device 객체를 먼저 알아야 한다.

DirectX 가 버전이 있다는것을 다들 알고 있다. 사용하기 불편했다고 하던 1~7 씨리즈 가장 많이 변했다고 하던 8 씨리즈, 그리고 현재 가장 많이 사용하며, 우리가 공부해야 할 9 씨리즈, 그리고 앞으로 사용 한다고 하는 10 씨리즈,

이때 Direct3D 객채는 윈속 로드와 비슷한 개념으로 생각된다(개인적으로 이렇게 본다). 도움말에선 "Direct3D 능력을 열거 및 얻어온다" 라고 설명되어 있다. 이 객체를 선언하는 방법은 없고, 특정 함수로 로드해 포인터를 뱉어내는 함수를 이용하는 방법이 있다.

그 특정 함수로 Direct3D 객체의 포인터를 얻어 왔다면,  그것으로 디바이스를 생성한다. 디바이스 생성은 Direct3D 개체를 이용하여 생성할수 있다.(디바이스 생성에는 여러가지가 있는데 이것은 소스코드에 따로 표기 하겠다.)


여기까지 쉽게 정리한다면, Direct3D API를 사용하기
1. 특정함수로 Direct3D 객체를 생성한다.
2. Direct3D 객체를 이용해 디바이스를 생성한다.

이 Direct3D 디바이스를 이용하여, 그림도 그리고 이것저것 한다.


그렇다면 언제 Direct3D 객체를 만들고 디바이스를 만들까?
이것은 튜토리얼 코드로 표기한다. 크게 이번 장에서 크게 신경 써야 할 부분만 주석 달아 놓고 끝마친다.
개인적으로 함수 파악자체가 힘들다..

//-----------------------------------------------------------------------------
// File: CreateDevice.cpp
//
// Desc: This is the first tutorial for using Direct3D. In this tutorial, all
//       we are doing is creating a Direct3D device and using it to clear the
//       window.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#include 
#pragma warning( disable : 4996 ) // disable deprecated warning
#include 
#pragma warning( default : 4996 )

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




//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D9               g_pD3D = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9   g_pd3dDevice = NULL; // Our rendering device


//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
    
    
    // Direct3D 객체를 생성하고 뱉은 포인터로 g_pD3D에 넣는다.
    // 이때 Direct3DCreate9의 인자값으론 D3D_SDK_VERSION 를 넣어 준다.
    // 인터페이스를 로드하는 개념으로 받아 들여진다.
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;    

    // 윈도우 모드인지, 전면 후면 버퍼 스왑 상태라든지 백버퍼 포맷 상태라든지 정말 많고 다양한 설정을 하고,
    // 이것을 기반으로 디바이스를 만들때 쓴다. .. 인자값 설명에 대해서는 도움말을 참조 해야 한다. 너무 방대하기 때문에.
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof( d3dpp ) );        // <-- 중요, 주요 정보들의 기본값은 0이기 때문에, 이렇게 하고, 변경할것이 있다면
                                                            // 별도로 설정해준다.
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    // 디바이스를 만드는데, 사용하는 함수, 아까 만들었던 d3dpp의 포인터를 넘긴다.
    // 1,2,3번째 인자에 대해서는 별도로 공부할 필요성을 느끼게 해준다.
    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: Releases all previously initialized objects
// 내용 : 초기화된 다이렉트 디바이스와 객체를 릴리지 해준다.
// 가능하다면 초기화 시점과 해체 시점을 맞추어야 한다고 책에서 설명하고 있다.
//-----------------------------------------------------------------------------
VOID Cleanup(){

    // 꼭 디바이스 먼저 해체 하고
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

    // Direct3D 를 해체해야 한다.
    if( g_pD3D != NULL )
        g_pD3D->Release();
}    


//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Draws the scene
//-----------------------------------------------------------------------------
VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;

    // Clear the backbuffer to a blue color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );

    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Rendering of scene objects can happen here

        // End the scene
        g_pd3dDevice->EndScene();
    }

    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}




//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window's message handler
//-----------------------------------------------------------------------------
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 );    
}



//-----------------------------------------------------------------------------
// Name: wWinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
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 );

    // Create the application's window
    HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 01: CreateDevice",
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                              NULL, NULL, wc.hInstance, NULL );
    
    

    // 정석은 윈도우를 생성한 후에 Direct3D 객체를 생성하고 디바이스를 생성하는것이다.
    // 특이한 경우가 아니라면, 정석대로 가는게 제일 좋다.
    if( SUCCEEDED( InitD3D( hWnd ) ) )    // <-- 이부분에서 Direct3D 와 디바이스를 생성한다.
    {
        // Show the window
        ShowWindow( hWnd, SW_SHOWDEFAULT );    // Direct3D 를 생성해야지만 ShowWindow와
        UpdateWindow( hWnd );                            // UpdateWindow 를 한다.

        // Enter the message loop
        MSG msg;
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }

    // 종료시 앲앨것들을 앲앤다.
    UnregisterClass( L"D3D Tutorial", wc.hInstance );
    return 0;    
}



  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기