DirectX/DirectX 11

Tutorial 02 : Rendering a Triangle 코드 분석

whereareyoung 2023. 10. 23. 17:14

윈도우 프로그래밍 

"win32" 로 윈도우 프로그래밍을 하는 방법은 심플한 편에 속한다. 따라서 main으로 시작하는 기본 템플릿만 알면 윈도우 프로그래밍 자체는 별로 어렵지 않다. 단, 다양한 컨트롤러를 붙이는 과정에서 시간이 소요되기는 한다. 

 

DirectX 공부방법 

Microsoft 에서 배포한 공식 튜토리얼을 통해 기본적인 구조와 활용법을 익히기만 해도 DirectX의 기능을 충분히 활용할 수 있다.

이 카테고리를 통해서는 DirectX 11 Tutorial 파일들을 분석하며 기본적인 구조를 익혀보려고 한다. 

 

학습을 위한 세팅 

1) DirectX_Tutorial 파일을 생성하여 기본적으로 제공된 튜토리얼들을 넣어두었다. 

 

2) Visual Studio 실행 > 로컬 폴더 오픈 > sln (솔루션) 폴더 오픈

너무 옛날 파일이기 때문에 (2008년, 2010년) 업데이트를 할 것이냐고 물어봄 

현재 나는 Visual Studio 2022를 사용하고 있고, 오픈하려는 솔루션이 너무 오래되었기 때문에 이러한 창이 뜬다. 

확인을 눌러주면 별 문제없이 2022버전으로 적용된다. 

 

3) 실행

실행하면 다음과 같이 기본 삼각형이 출력되는 프로그램이 들어있다. 

 

< 코드 분석 >

1) wWinMain메인문

int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
{
    UNREFERENCED_PARAMETER( hPrevInstance );
    UNREFERENCED_PARAMETER( lpCmdLine );

    if( FAILED( InitWindow( hInstance, nCmdShow ) ) )
        return 0;

    if( FAILED( InitDevice() ) )
    {
        CleanupDevice();
        return 0;
    }

    // Main message loop
    MSG msg = {0};
    while( WM_QUIT != msg.message )
    {
        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
        else
        {
            Render();
        }
    }

    CleanupDevice();

    return ( int )msg.wParam;
}

 

코드 분석에 있어 제일 기초가 되는것은 메인문인데, 윈도우 프로그래밍에서의 형식은 다음과 같이 사용한다.

int WINAPI wWinMain (...)
{
}

 

" w " 가 앞에 붙었다는 것은 워드타입을 이야기 하는데

이 것이 유니코드 프로젝트라는 뜻인데, 유니코드는 여러가지 스타일이 있다.  2010년대 쯤에 유니코드 스타일은 2byte 체계였는데 

여기서 문자열이 날라오는 것은 다 2byte 타입의 문자열로 날라온다. 

키 입력을 받았거나 할때 문자열을 읽어보면 한 문자가 다 2byte 라는거지 

HINSTANCE hPrevInstance

이런것을 보면 옛날에 win16 에서 사용하던 것을 

 

 

전반부는 대충 넘어가고 

UNREFERENCED_PARAMETER( hPrevInstance );
    UNREFERENCED_PARAMETER( lpCmdLine );

    if( FAILED( InitWindow( hInstance, nCmdShow ) ) )
        return 0;

    if( FAILED( InitDevice() ) )
    {
        CleanupDevice();
        return 0;
    }

(Visual Studio 에서 Windows Project 를 만들면 자동으로 여기까지는 다 만들어 준다. )

 

 

// Main message loop
    MSG msg = {0};
    while( WM_QUIT != msg.message )
    {
        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
        else
        {
            Render();
        }
    }

이 뒷부분을 자세히보면 "PeekMessage()" 함수를 사용하는데, 게임에서는 PeekMessage 함수를 쓰고, 게임이 아닌거에서는 GetMessage를 쓴다. 

 

PeekMessage : 메세지 이벤트가 발생을 하지 않을경우에도 밑으로 내려옴 

GetMessage : 메세지 이벤트가 발생을 안하면 그대로 Blcok 걸려서 wait상태가 됨 

 

GetMessage 메세지 이벤트를 안하면 블락걸림 
유효시간에 게임에서는 열라 렌더링을 해야하기때문에 그렇고 



TranslateMessage
DispatchMessage 
종료메세지가들어있는지를 확인하고 

return 하고 끝나는거 

매개함수, 초기화, 게임루프, 종류 

InitWindow - 일반적인 윈도우 프로그래밍하는거는 다 똑같이 나온다

보시면 이게 아마 비주얼스튜디오에서 기본적으로 어플리케이션 하나 시작을하면 g_hwd 옛날 스타일
윈도우 핸들은 - 게임에서 전역변수 로 사용을 많이 하기 때문에 

code template 에서 만들어주는게 그렇지도 않음..
이부분은 Direct 에서 특화된 부분 
Device 라는 말은 Direct X 몸체, Body 임


윈도우 함수들은 대부분의 함수들이 h result 성공인지 실패인지를 판단을 하는것

faild 아니면 successed 겠지 
CleanUPDevice return 0 로 

CleanUp Device 로 가봐야겠네 현재 윈도우 MainWindow 사이즈 
왼쪽모서리 상단 위쪽 모서리 이러닉으로 되서 하단 오른쪽모서리 
left right bottom top 해서 이 안에 보시면 이렇게 되어있음

이거 그냥 쉽게 말하면 내 윈도우 사이즈 구해주는 건데 
올느쪽 왼쪽 빼면 .. 빼면 이 사이즈의 윈도우를 만드는것
이 사이즈의 Direct x 표면을 만드는거 
Debug 빌드일때 _Debug 가 선언이 되어있는데 
Direct x 를 Debug 모드로 설정이 되어있는 것

 

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

Direct X 개발 세팅  (1) 2023.10.23