언어/기타
2006.08.26 02:50

1. DirectX 8.0 sdk 해보기.

조회 수 478 추천 수 1 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

안녕하세요~


저는 클라비스2의 프로그래머 케이코(소년y)입니다.


그냥 DirectX_SDK에 대해 끄적여 보겟습니다;ㅁ;


 


이 강의시리즈를 듣기위해서 필요한 지식과 프로그래밍도구.





















 


최소사양 


귄장사양 


 c/c++ 숙달도


포인터, 클래스의 계념이 있는사람 


포인터, 클래스, 상속을 잘 사용하는 사람.


 api숙달도


윈도우를 제작해본 사람 


윈도우에 비트맵을 만들어 움직여본 사람. 


 directx_sdk 버전


8.0 


8.0 


 


강의를 시작하기에 앞서서 윈도우를 만들어 줘야 한다.


 


각자 윈도우를 만드는 소스는 차이가 있겟지만, API정복이라는 책에 나온 윈도우를 만드는 소스를 첨부하도록 하겠다.


 


자, 다이렉트를 쓰기 전에 다이렉트초기화란걸 시켜줘야 한다.


 다이렉트 초기화는 아래와 같다.


 


시스템 초기화법.


 


1. D3D인터페이스를 만들어냄.


 


2. 화면모드를 선택함. (윈도우모드, 풀스크린모드)


 


3. Presentation Method를 설정함.


 


4. 장치인터페이스를 생성하고 화면을 초기화함.


 


오늘은  D3D시스템 초기화에 대해서 알아보겟습니다.


 


해더 d3d8.h


라이브러리 d3d8.lib


해더 파일 참조는 #include로 하면 될것이고,


라이브러리 참조는 위의 탭에서 프로그잭트 -> 셋팅 -> 링크에 라이브러리 모듈이 넣으면 된다.


 


 (1). D3D인터페이스를 만들어냄.


 


지금 말하면 늦은 감이 없지않아 있지만 DIRECTX_SDK는 COM을 알아야한다.


COM이라하면, Component Object Module이다. 뭐.. COM에 대해서는 이러저러한 말들이 많지만, 필자는 COM에 대해서는 간단히 무엇인줄만 알면 될것같기도 하다.


COM을 사용하는 함수들엔 앞에 I가 붙는다. 함수명 앞에 I가 붙으면 COM인터페이스라고 생각하면 될것이다.


자. 본론으로 돌아와서..


인터페이스를 생성하는것은 IDirect3D8함수를 사용할것이다.


  *(필자의 컴퓨터엔 Directx_sdk_8을 사용하고 있다.)


 


IDirect3D8의 인자는 하나뿐이다.


바로 sdk의 버전인데, Direct_sdk의 거의 대부분의 생성을 돕는 함수들은 sdk의 버전을 인수로 줘야한다.


함수는 다음과 같다.


 


   IDirect3D8 *Direct3DCreate8(UINT SDK_VERSION);


 


자 인터페이스를 생성해 보자!


 전역변수로


   IDirect3D8 D3D = NULL;


를 만들어 주기 바란다.


그리고 따로 초기화 함수를 만들어서


 


D3D = Direct3DCreate8( D3D_SDK_VERSION );


 


를 넣어주면 된다.


이렇게 하면 D3D인터페이스 생성 완료이다..


어떠한가 간단하지 않은가?


하지만 인터페이스 생성이 되지않았을 경우에는 어떻게 할것인가?


인터페이스가 생성되지 않을 경우 빌더는 오류를 보내지 않고 프로그램을 그냥 실행 시킨다.


그렇기에 다음과 같이 해줘야 할것이다.


//전역변수 선언지역//


      IDirect3D8 *Direct3DCreate8(UINT SDK_VERSION);


/////////////////////


int Init()


{


      if( (D3D = Direct3DCreate8( D3D_SDK_VERSION )) == NULL)


     {


      //메세지 박스 호출.


      //프로그램 닫기


     }


}


 


이렇게 한다면 인터페이스 생성이 실패면 프로그램이 자동으로 메세지 박스를 호출하면서 꺼지게 될것이다.


 


 


 (2). 화면 모드 선택하기.


 


간단히 구조체를 보고 넘어 가도록 하자.


화면 정보는 D3DDISPLAYMODE구조체에 저장된다.


D3DDISPLAYMODE구조체는 화면 크기, 주사율, 색상형식을 저장할수있는데,


주사율은 0을 기입한다면 디폴트값으로 전환된다.


색상형식은 색상요소인 빨강, 초록, 파랑, 알파의 비트수로 나타낸다.


비트수가 뭐라고 한다고 어렵게 생각하면 안된다.


32비트를 사용할경우 빨강에 8비트, 초록에 8비트, 파랑에 8비트, 알파에 8비트 이런방식인 것이다.


위의 32비트예를 프로그래밍 소스화로 한다면, A8R8G8B8 이런식이다.


눈치 빠른 사람들은 벌써 눈치 챗겟지만, A는 알파, R은 빨강, G는 초록, B는 파랑을 나타낸다.


자 이정도 알았으면 구조체를 봐보도록 하자.


 


   typedef struct _D3DDISPLAYMODE


  {


     UINT Width;


     UINT Height;


     UINT RefreshRate;


     D3DFORMAT Format;


  }D3DDISPLAYMODE;


 


설명을 듣고 구조체를 보니 왠지 아무것도 없는 느낌일 것이다.


  -그냥 구조체를 봐도 알아듣는 사람이 있긴하지만..


 


자 구조체 변수 선언을 해볼까?


모두 알다시피


  D3DDISPLAYMODE D3DDM //Direct3D Display Mode.  변수명은 마음대로해도 좋다.


  D3DDM.Width = 640;  //대부분의 풀스크린 화면 너비이다.


  D3DDM.Height = 480; //대부분의 풀스크린 화면 높이이다.


  D3DDM.RefreshRate = 0; // 디폴트 값을 사용할것이다.


  D3DDM.Format = D3DFMT_X8R8G8B8 // 빨랑,파랑,초록 전부 8비트를 사용하고 8비트는 안쓴다는 것이다.


 


이렇게 설정하면 될것이다.


하지만 위 색상형식은 지원을 하는 컴퓨터도 있을것이고, 지원을 하지 못하는 컴퓨터도 있을것이다.


 


그것을 알아봐야할것이다.


 


   if(FALED(D3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &D3DDM,&D3DDM,FALES)))


  {


    // 에러 메세지 호출.


    // 프로그램종료.


  }


 


위처럼 한다면 컴퓨터가 프로그래머가 지정한 색상형식을 지원하는지 않지원하는지 알수있고 만약 지원하지 않는 컴퓨터라면 프로그램을 종료시킨다.


 


이 강의에선 화면을 풀스크린으로 할려고 한다.


그렇다면,


(1)에서 생성한 D3D인터페이스를 이용해야한다.


 


   D3D->GetDisplayMode(D3DADAPTER_DEFAULT, &D3DDM);


 


위 처럼 썻다고 해서 꼭 디스플레이 모드설정이 꼭 성공으로 끝날서 없다.즉, 실패할 경우도 있을 것이라는 것이다.


그럴경우를 대비하여 아래와 같은 코드로 변형시켜줘야한다.


 


  if(FALED(D3D->GetDisplayMode(D3DADAPTER_DEFAULT, &D3DDM)))


  {


     //에러 메시지 호출


     //프로그램종료


   }


 


(3) Presentation Method를 설정함.


 


시작하기도 전에 영어가 나왔다. 과연 Presentation Method는 무엇일까?


Presentation은 표시란 뜻이고, Method는 방식, 방법이란 뜻이 있다.즉 표현방식을 설정하는것인데, 그렇게 막 어렵지는 않을 것이다.


 


표현방식을 설명하기 전에 백버퍼에 대해 알아야 할것이다.


백버퍼란 말그대로 뒤에 있는 버퍼이다.


즉, 화면상에는 백버퍼의 내용은 출력되지 않는다.


이것을 FLIP이란 연산을 통하면 백버퍼를 앞으로 옴겨 놓을수 있다.


처음 프로그래밍을 접하는 사람은 왜 이런게 필요할지 모를지도 모르나 C -> C++ -> API -> DIRECT과정을 거친 사람이라면 API부분에서 백버퍼의 필요성을 절실히 느낄것이다.


백버퍼 없이도 화면에 모든것을 출력시킬수 있고, 움직이게 할수이도 있다.


하지만, 만약 여기에 의문을 가지는 자라면 더블버퍼링에 대해 공부하고 오도록 한다.


 


다음으로 표현방식을 설정할때의 구조체를 보도록 하자.


구조체 이름은 D3DPRESENT_PARAMETERS이다.


구조체 원형은 다음과 같다.


 


 


    typedef struct _D3DPRESENT_PARAMETERS


    {


        UINT BackBufferWidth;


        UINT BackBufferHeight;


        D3DFORMAT BackBufferFormat;


        UINT BackBufferCount;


        D3DMULTISAMPLE_TYPE MultiSampletype;


        D3DSWAPEFFECT SwapEffect;


        HWND hDeviceWindow;


        BOOL Windowed;


 


        BOOL EnableAutoDepthStencil;


        D3DFORMAT AutoDepthStencilFormat;


        DWORD Flags;


        UINT FullScreen_RefreshRateInHz;


        UINT FullScreen_PresentationInterval;


    }D3DPRESENT_PARAMETERS;


 


쫌 길긴 길지만 대부분의 맴버변수는 사용하지 않을 것이다.


다 대부분의 맴버변수를 0으로 채워줘야한다. 그래서 제로메모리를 사용할 것이다.


 -일종의 초기화이다;;;


선언과 사용은 다음과 같이 합니다.


 


    D3DPRESENT_PARAMETERS D3DDPM // Direct3D Dispaly Presentation Method


 


    ZeroMemory(&D3DDPM, sizeof(D3DPRESENT_PARAMETERS));


    D3DDPM .Windowed = false;  //ture는 윈도우 모드
    D3DDPM .SwapEffect = D3DSWAPEFFECT_FLIP;
    D3DDPM .BackBufferFormat = D3DFMT_R5G6B5;
    D3DDPM .BackBufferWidth = 800;
    D3DDPM .BackBufferHeight = 600;
    D3DDPM .BackBufferCount = 2;
    D3DDPM .EnableAutoDepthStencil = false;
    D3DDPM .AutoDepthStencilFormat = D3DFMT_D16;
    D3DDPM .SwapEffect = D3DSWAPEFFECT_DISCARD;



 


 (4) 장치인터페이스를 생성하고 화면을 초기화하기.


 


IDirect3D8를 기역하는가?


그 클래스 안의 멤버 함수중 CreatDevice란 함수가 있다 이를 이용하면 장치인터페이스를 생성할수있다.


 


함수 원형은 다음과 같다.


 


  HRESULT IDirect3D8::CreatDevice


 (


    UINT Adapter,


    D3DDEVTYPE DeviceType,


    HWND hFocusWindow,


    DWORD BehaviorFlags,


    D3DPRESENT_PARAMETERS *pPresntationParameters,


    IDirect3DDevice8 *ppReturnedDeviceInterface


 );


 


왠지 모르게 복잡해 보이지만 그렇지도 않다.


뭐 그냥 인수만 넘겨주면 다 알아서 하니 그냥 인수만 넘겨 주도록 하자.


선언과 사용은 다음과 같다.


 


    IDirect3DDevice8 *D3DD //Direct3D Device 역시 변수명은 마음대로 해도 좋다만, 이대로 하는것이 좋을것이다.


    D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DDPM,&D3DD);


 


위 처럼 하면 장치 인터페이스가 생성 된것이다.


 


하지만, 위의 다른 항목들도 그랫듯이 장치인터페이스의 생성이 실패 됬을때도 고려해 봐야된다.


 


    if(FAILED(D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DDPM,&D3DD)))


    {


       //에러 메세지 호출.


       //프로그램 종료.


     }


 


 


이로써 D3D시스템 초기화를 마쳤다.


자 다음엔 그리고 출력하고 하면 될것이다!


다음 강의는 드로잉을 해보겟다.


자기만의 세상을 만들기 위해 현재까지는 우주의 아무것도 없는 그런 새상을 만들었다고 보면 된다.


이제 그 아무것도 없는 우주에 하나씩 점(그림들)을 찍어보도록 하자!


이 강좌의 소스는 파일에 첨부하도록 하겠다.


 


이상한게 있으면 댓글 필수입니다~ /ㅂ/


후아- 요즘 프로잭트 진행 할때 디버그 하나 할때마다 4-8시간씩 잡아 먹으니 정말 돌아버리겠습니다=ㅂ=;;


다른사람이면 1시간이면 충분한걸 인자를 하나 안줘서 이상한 버그가 생간다던지..


함수 오버로딩에서 이상하게 되는것도 있고 .. 정말 ;ㅁ;..


뭐.. 오늘은 이만 자야겠네요..


밭에 가서 일했다가 와서.. 'ㅁ'/


정말 이럴땐 제주도에서 태어난걸 원망하는,...


젝일슨=ㅂ=;;;<


 


First.cpp - 윈도우를 만드는 아주 기본적인 소스.


 


test.cpp - 이 강의의 소스


 

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
984 RPG Maker -Jindow_v0.1-체험판 file -제이- 2007.01.16 1357
983 언어/기타 -_- 훗... 비법따위 이정도로.. 예화 2005.12.09 355
982 언어/기타 -ㅅ- 누가 아이디어좀 제공해주세요. 린쌍 2005.11.26 418
981 언어/기타 0.0 [S's-S] 2006.01.05 277
980 언어/기타 0.0초 대기시간 분석 (전에 올렸는데 없어졌군요) [S's-S] 2006.09.01 397
979 언어/기타 0.0초 대기시간 분석 (전에 올렸는데 없어졌군요) [S's-S] 2006.09.01 394
978 언어/기타 0.0초를 다룰때 조심할점 3 A. 미스릴 2009.03.13 2646
977 언어/기타 0707후반기[제작자포럼]공성결과 천무 2007.08.01 1372
976 RPG Maker 1 - 1. 변수 응용 프로그램 만들기 (난수) 천영진 2007.03.06 1279
» 언어/기타 1. DirectX 8.0 sdk 해보기. file 케이코냥이 2006.08.26 478
974 언어/기타 1. 게임 시나리오의 기초 1 샤르엘 2007.11.27 1884
973 언어/기타 1. 변수 응용 프로그램 만들기 천영진 2007.02.21 1602
972 언어/기타 100%고수강의!(변수이론) 늑대소년 2005.05.18 2428
971 RPG Maker 11. 맵배치 (숲길, 건물, 건물 안속 만들기) 천영진 2007.02.24 2065
970 언어/기타 1맵=1bgm? 고정관념을 깨자! rukia 2006.02.10 710
969 언어/기타 1픽셀씩 맵스크롤 1 file 설사즙 2010.07.12 1141
968 언어/기타 2. Direct로 그림그리기! file 케이코냥이 2006.09.10 530
967 RPG Maker 2000,2003으로만드는 전략시뮬 무역장사 2005.07.30 1470
966 언어/기타 2000용 케릭의 모션 도트 "몸통만" 1 ◈ÐÆЯΚ◈찰드 2007.05.15 930
965 RPG Maker 2006.6.19 님의 질문에 대한 설명..... 『연금술사』 2006.02.16 440
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 51 Next
/ 51






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)