'프로그래밍/3D 엔진 프로그래밍'에 해당되는 글 6건

  1. 2011.12.20 Programming A Multiplayer FPS In DirectX
  2. 2011.11.25 빠른 시야 절두체 구하기
  3. 2011.11.07 3D Game Engine Programming - 4장
  4. 2011.10.12 3D Game Engine Programming - 3장
  5. 2011.10.07 3D Game Engine Programming - 2장
  6. 2011.10.05 3D Game Engine Programming - 1장
반응형
 

















흠 간단하게 네트워크 연결되는 FPS 게임을 만드는 책이 있었네 -0-;;;

몰랐다... 간단하게 읽어보았는데 확실히 게임을 만드는 위주로 나와있어서 나쁘지 않다.

한번 쭉 훑어보고 따라 쳐볼만한듯 ㅎㅎ 

엔진 만들때 참고하면 괜찮을듯..
반응형
Posted by msparkms
,
반응형

원제 : fast extraction of viewing frustum planes from the world-view-projection matrix

링크 : http://crazyjoke.free.fr/doc/3D/plane%20extraction.pdf

존에 시야 절두체를 구할때는 로컬 좌표계의 절두체를 만들고 행렬을 곱해서 변환시켰었는데 

여기 소개된 방법을 이용하면 월드-뷰-프로젝션 행렬의 값을 가지고 바로 만들어 낼 수 있다.

예전에 읽어봤던 내용이였고 스터디때 발표도 했었는데 다시 보게되어서 올린다.

Direct3D, OpenGL은 Handness와 좌표계 처리가 다르기 때문에 각각 구한 내용이 있고

평면의 방정식에 대해서도 간략하지만 잘 설명해 놓았다.

안 읽어봤으면 한번쯤은 읽어볼만한 내용이다.

요즘 보는 예제들 프러스텀 컬링은 다 이 방식을 사용한다. ㅎㅎ 
반응형
Posted by msparkms
,
반응형


4장의 내용은 SIMD를 이용한 수학라이브러리를 만들고 적용하는 것이다.

이 장의 목표는

* 어셈블러 프로그래밍의 기초를 다진다.
* 다양한 CPU의 확당 명령어들을 간단히 배운다.
* CPU를 식별하는 법을 배운다.
* vector, matrix등 프로세서에 최적화해서 프로그래밍 하는 법을 배운다.
* 그밖에 충돌체크나 쿼터니언도 만들어 본다.



다른건 그렇다 치고 어셈블러 프로그래밍의 기초를 다진다!

이 부분은 정말 기초적인 내용뿐이다.



이 내용에 대해서 엔진파트에 정리하는건 아닌거 같고 마침 어셈블리 카테고리가 있으니

어셈블리 카테고리에 포스팅하도록 하겠다.

이 글이 필요는 없지만 4장을 했다는걸 그냥 표시라도 해놓으려고 -0-;;; ㅋ 



 
반응형
Posted by msparkms
,
반응형


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
,
반응형

2장은 비교적 짧은 편이다.

엔진의 직접적인 구현에 대한 내용은 나오지 않고

엔진을 만들기 위한 기본적인 생각과 이 책을 통해 만들엔진의 구조에 대해서 간략히 설명한다.

게임에 종속적이지 않은 엔진을 만들기 위해서는 특정 게임이나 API와 별개로 만들어져야 한다.

엔진에서 사용하는 상수, 구조체등을 따로 다시 만들어야 한다.

그렇지 않으면 특정 게임에 종속적인 엔진이 될 수 밖에 없다.





그 뿐만 아니라 게임에서 사용되는 클래스등을 알고 그 클래스에 대한 처리를 넣어서도 안된다.

CBossEnemy* boss;
renderer->render(boss);

이런식으로 내가 어떤 객체를 그리고자 할 때 그 객체를 넘겨서 그리는 식으로 만든다면 구현부 코드는 깨끗하나

엔진입장에서는 이 클래스를 사용하는 특정 게임용 엔진이 되버린다.

그래서 되도록 범용적인 함수를 제공해야 한다.

render함수에서 버텍스정보와 인덱스정보등을 넘겨받는식으로 만들면

굳이 CBossEnemy란 클래스를 몰라도 무언가를 그려낼 수 있다.

위의 문제점들을 해결하기 위해서 인터페이스 개념을 사용한다.

엔진에서는 인터페이스를 제공하고 이 인터페이스를 이용해 구현하면 

사용하는 쪽에서는 인터페이스를 상속받아서 적절히 구현하거나 사용하면 된다.





또한 엔진은 DirectX든 OpenGL이든 Custom Renderer든 엔진을 사용하는 쪽에서는 

구현부분에 있어서 변화가 있어서는 안된다. 이 또한 엔진 내부에서 인터페이스를 통해서 

각 렌더링 엔진에 맞게 구현해 놓는다면 사용자는 인터페이스만 불러서 사용해주면 된다.





인터페이스와 같은 개념을 사용하다보면 결국 상속을 받아서 사용하게 되는데 상속받은 녀석을 생성하기 위해서는

게임쪽이든 어디든 그 자식 클래스를 알고 있어야 된다. 

Manager등을 두어서 그곳에만 처리하는 식으로 진행이 될 것 같다.

---------------------------------------------------------------------------------------------------------

이 엔진의 목표기능은 4가지이다.

* 효율적인 렌더링
* 키보드등을 통한 입력처리
* 사운드 처리
* 기본 네트워크 처리(Quake 데스매치정도 되는 규모인듯?)


이렇게 4가지를 기본으로 두고 만들어진다.

그래서 엔진 구성도를 보면 4가지 모듈로 나눠져 있음을 알 수 있다.

모듈당 하나의 인터페이스와 이 인터페이스를 구현한 single DLL이 하나씩 존재한다.

현재 DirectX만 사용하는등 구현을 하나만 사용하기 때문인데 아마 더 추가가 된다면 DLL 갯수가 추가 될 것이다.

그리고 각 모듈당 Static Library가 하나씩 붙는데 DLL을 로드해주는 기능으로만 사용된다.

그리고 게임에서 사용할 Helper 클래스와 Helper 함수용으로 Static Library가 두개정도 더 붙는다.

나도 일단은 이 구조를 따를 것이며 더 분리하거나 추가될 것이 있다면 해볼 것이다.

예를 들어 물리 모듈을 추가하거나 AI 모듈을 추가할 수도 있겠다.




이제 본격적인 구현은 3장부터니 정신 똑바로 차리고 해보겠다!!

되는대로 바로바로 올리도록 하겠다. 

3장에서 엔진 기본 틀을 구현해서 창정도는 띄울 것 같고

4장은 SSE를 이용한 수학 라이브러리 구축부분이다.

저번에 SIMD 관련되서 간단하게 공부해 본적은 있는데 이번에 정리해 볼 것 같다. 
반응형
Posted by msparkms
,
반응형
3D Game Engine Programming 1장 부분은 엔진 개발에 직접적인 관련은 없다.

3D 게임 엔진의 정의와 필요성에 대해서 설명한다.

간략하게 게임 개발의 역사를 훑어 보며 하드웨어의 발전에 의해서 개발 패러다임이 로우 레벨의 최적화도 중요하지만

하이 레벨의 장면관리와 같은 데이터 관리 부분도 매우 중요하다는 것을 강조하고 게임엔진의 특징에 대해서 설명해준다.

딱히 정리할 만한 내용은 없다.

2장부터 제대로 엔진을 조금씩 만들어가기 시작할 것이다.

2장은 이 책을 통해 만드려고 하는 엔진의 기본 구성에 대해서 설명될 것이다. 

이왕 만드는거 엔진이름도 본인 마음에 들게 잘 지으라고 하니 생각좀 해봐야 겠다. 
반응형
Posted by msparkms
,