반응형


3장의 목표는 다음과 같다.

- 정적, 동적 링킹 라이브러리 만들기
- 프로그램과 상호작용을 하는 윈도우 다이얼로그창 사용하기
- 정적 라이브러리로 엔진의 렌더러 개발하기
- DLL을 이용하여 Direct3D 초기화하고 연결하기
- Engine을 이용한 프레임워크 구축하기


3장만 끝나도 오우거 엔진 기본 셋팅처럼 간단한 다이얼로그 창에서 셋팅을 하고
윈도우로 들어가서 Direct3D가 켜지는 예제를 만들 수 있다는 이야기이다!

이번 장이 이 책을 통해서 만들 엔진의 기본 구조이므로 확실히 익히고 넘어가야 한다.



Interface에 대한 설명

Interface를 이용하여 코드를 분리하고 독립적이면서도 재 사용가능한 코드를 짤 수 있음을 설명하고
C++ 문법의 가상함수와 순수 가상함수을 설명하고 추상 클래스를 만드는 부분을 설명한다. 

virtual void MyPureVirtualFunction(void) = 0;



DLL에 대한 설명

DLL실시간에 로드가 가능하기 때문에 재 컴파일이 필요없는 점과 선택적으로 로드가 가능하다는 점이 유용하다.
이런점때문에 일단 실행가능하게 만든뒤 최적화 하기도 편하다.

* DLL을 로드하는 두가지 방법
 

1. 정적라이브러리로 링킹되는 DLL을 부르는 방법
2. 특정 함수 호출을 통해 DLL을 부르는 방법

앞의 방식을 이용하면 DLL의 함수가 추가되거나 변경되었을 때는 다시 컴파일 해야하기 때문에
두번째 방법을 사용할 것이다.

DLL에 선언된 함수를 이용하려면 함수를 선언할 때 __declspec(dllexport)를 명시해 주어야 한다.
다른 방법으로는 .def 파일에 함수의 리스트를 적어 제공하는 것이다.

DLL의 자세한 내용은 윈도우 관련 서적을 한번 보는게 더 좋을 것 같다.
DLL에 대해서도 자세히 한번 정리해서 올려봐야 겠다.



DLL에 있는 클래스를 사용

1. 인터페이스를 상속받은 클래스를 선언한다.
2. DLL에 이 클래스를 구현한다.
3. 이 클래스의 객체를 생성하는 함수를 DLL에 작성한다.
4. 이 함수가 객체를 리턴할 때 인터페이스 타입으로 캐스팅하고 리턴해준다.

이 방법을 통하면 클래스를 DLL에 넣을 수 있고 사용하는 쪽에서는 인터페이스만 알고 있으면 사용가능해진다.



정적 라이브러리를 이용한 렌더러 구현

렌더러 안에서 DLL을 로드해준다.

Direct3D의 생성과 RenderDevice 획득, 생성된 자원들의 해제를 해주고
렌더링관련된 함수들을 연결할 수 있어야한다.

이 정적 라이브러리는 DLL을 만들 때 자동으로 생성되는 정적 라이브러리가 아니라 우리가 따로
DLL을 부르기 위해서 직접 만든 정적 라이브러리이기 때문에 DLL의 장점을 그대로 이용할 수 있다.

이 책의 저자는 다음과 같이 파일을 나누었다.

RenderDevice.h -> 렌더링 관련된 함수들의 인터페이스

Renderer.h       -> DLL을 부르고 Direct3D를 생성, 해제
Renderder.cpp


이름은 렌더러로 칭했지만 결과적으로는 렌더링관련 코드가 구현된 함수들이 있는 DLL을 불러주고 
이 함수들을 사용하기 위한 인터페이스를 제공해주는 역할
로 사용된다.



Direct3D를 위한 DLL 만들기

위에서 만든 RenderDevice 인터페이스를 구현할 DLL을 만들어야 한다.

이 책의 저자는 다음과 같이 파일을 나누었다.

d3d.def             -> DLL 함수들의 목록
d3d.h               -> RenderDevice를 상속받는 클래스 선언
d3d_init.cpp      -> Direct3D 초기화, 해제 관련된 함수들 구현
d3d_enum.cpp  -> Direct3D Enumeration 관련된 함수들 구현
d3d_main.cpp   -> 나머지 함수들 구현


이 저자는 한 클래스에 대해서 기능별로 파일을 쪼개서 cpp를 여러개 만들었다.
한 파일이 너무 긴 것을 싫어하는 취향이기 때문에 이대로 해도되고 각자 알아서 하면 된다.



2부로 넘겨서 정리해보려고 했는데 보니까 위의 내용이 다였다...

현재 구현은 다이얼로그 창과 연동할 필요를 못 느껴서 그냥 초기화 하는 부분만 넣어놓았다.

위에처럼 굳이 cpp파일을 나눠서 할 필요도 없이 그냥 RenderDevice를 생성, 해제해주는 함수를 구현해주고

내부적으로 Direct3D를 초기화해주는 부분만 넣어도 된다.

바로 4장으로 넘어가자!



 
반응형
Posted by msparkms
,