-들어가며..
제가 쓰는 내용은 일리히트엔진에 관한 내용이 주가 되다보니 일반적인 이론은 좀 소홀히 하는 경향이 있습니다.
사실 이론적인 부분은 저보다 실력있는 필자분들이 많이 계시니 저는 엔진을 분석하는 데 촛점을 두려고합니다.
-메쉬란?
폴리곤들을 단위별로 모아서 랜더링 작업을 체계적으로 하기 위해 만들어 놓은 자료 구조입니다. 2디 게임으로 치면 픽셀이 폴리건 이고 비트멥 이미지가 메쉬가 되겠습니다.
잘 이해가 안되 신다면 위 그림 처럼 Mesh 스타킹을 연상하시면됩니다.
이전 시간에 버텍스 와 인덱스 리스트를 직접 다뤄 보았는데요. 사실 이렇게 drawprimitive 함수등으로 버텍스를 직접 넣어서 쓸거면 엔진을 쓰는 의미는 거의 없습니다. 그냥 랜더러 랩핑한 라이브러리 수준이겠죠. 사실 제가 어린시절(1994년도 쯤...) 처음 3D프로그램시작할때 메쉬라는것도 모르고 게임을 만든적이있었는데 그때 정말 진정한 카오스를 경험 한적이 있었습니다.
그래서 어느순간부터 버텍스와인덱스 정보를 쌍으로 관리해서 사용을 했었는데 나중에 그런것들을 사람들이 메쉬라고 하던 거였더군요. 그리고 어느순간부터 dxsdk에 메쉬기능이 붙어서 나오기도 하더군요.
- 일리히트엔진에서의 메쉬 구현
일리히트엔진은 메쉬구조내에 메쉬버퍼라는 구조를 여러개 따로 가질 수 있습니다.
메쉬버퍼는 메트리얼이 따로 적용될수있는 최소 단위 이기도 합니다. 메트리얼은 참조본이 아닌 원본을 가지고있으며 고유하게 하나의 메쉬 버퍼에만 사용됩니다.
일리히트엔진의 특징중 하나는 씬노드 단에서는 메트리얼객체를 포인터나 참조를 써서 공유할수없다는 것입니다. 이 점이 대부분의 엔진과 가장 큰 차이점 중하나입니다. 대부분 메트리얼을 따로 만들고 그것을 여러곳에서 참조할수있는 반면 일리히트엔진은 메쉬버퍼와 메트리얼이 일부일처제 입니다.
그래서 메쉬버퍼를 필요이상으로 많이 나눠서 만들경우 상당히 메모리가 낭비되어지는 것에 주의 하셔야합니다.
실제로 씬노드들은 각자 한개 이상의 인스턴스화된 원본들만 가지고 있습니다.( 씬노드 편에서 다시 한번 다루도록하겠습니다.)
다수의 메쉬 버퍼(irr::scene::IMeshBuffer)들이 모여서 메쉬(irr::scene::IMesh) 가 됩니다. DXSDK와 좀 비슷합니다.(거의 같다고 봐야할지도??)
기본 메쉬형 이외에 아래와 같이 에니메이션을 위한 확장된 형태의 메쉬들을 제공합니다.
- 메쉬 생성하기
일리히트엔진에서는 기본적으로 평면 ,큐브, 실린더,구,원뿔형태의 기본 메쉬를 만들어 주는 함수들을 제공합니다.
SceneManager::getGeometryCreator() 라는 함수를 이용해서 IGeometryCreator 받아옵니다. 그리고 이 객체의 멤버 함수들을 이용해서 기본 메쉬 들을 생성할 수 있습니다.
이함수들을 써서 메쉬를 만들경우 따로 메쉬 버퍼를 만들지 않아도 됩니다. 도우미 함수들이 내부적으로 알아서 만든 다음 먹기(?) 좋은 상태로 메쉬객체를 반환 해주기 때문입니다.
메쉬버퍼는 따로 만들어주는 도우미 함수 들이 없기 때문에 위와 같이 직접 메모리를 할당해서 만들어 줍니다.
할당받은 메쉬 버퍼의 객체 (pbuffer)내용물속에 있는 Vertices, Indices 직접 체워 넣을수있습니다.
아래 소스 처럼 SMeshBuffer 는 CMeshBuffer탬플릿 기반으로 만들어 진 클래스 입니다.
메쉬버퍼종류는 기본적으로 3 종류가 있습니다.
위에서 설명한 기본적인 메쉬버퍼 외에도 아래 상속 도표 처럼
터래인과 스키닝 에니메이션을 위함 메쉬버퍼가 있습니다.
랜더링은 메쉬를 바로 드로우하는것이 아니라 메쉬 버퍼단위로 드로우를 해줍니다.
제가 쓰는 내용은 일리히트엔진에 관한 내용이 주가 되다보니 일반적인 이론은 좀 소홀히 하는 경향이 있습니다.
사실 이론적인 부분은 저보다 실력있는 필자분들이 많이 계시니 저는 엔진을 분석하는 데 촛점을 두려고합니다.
-메쉬란?
폴리곤들을 단위별로 모아서 랜더링 작업을 체계적으로 하기 위해 만들어 놓은 자료 구조입니다. 2디 게임으로 치면 픽셀이 폴리건 이고 비트멥 이미지가 메쉬가 되겠습니다.
잘 이해가 안되 신다면 위 그림 처럼 Mesh 스타킹을 연상하시면됩니다.
이전 시간에 버텍스 와 인덱스 리스트를 직접 다뤄 보았는데요. 사실 이렇게 drawprimitive 함수등으로 버텍스를 직접 넣어서 쓸거면 엔진을 쓰는 의미는 거의 없습니다. 그냥 랜더러 랩핑한 라이브러리 수준이겠죠. 사실 제가 어린시절(1994년도 쯤...) 처음 3D프로그램시작할때 메쉬라는것도 모르고 게임을 만든적이있었는데 그때 정말 진정한 카오스를 경험 한적이 있었습니다.
그래서 어느순간부터 버텍스와인덱스 정보를 쌍으로 관리해서 사용을 했었는데 나중에 그런것들을 사람들이 메쉬라고 하던 거였더군요. 그리고 어느순간부터 dxsdk에 메쉬기능이 붙어서 나오기도 하더군요.
- 일리히트엔진에서의 메쉬 구현
일리히트엔진은 메쉬구조내에 메쉬버퍼라는 구조를 여러개 따로 가질 수 있습니다.
메쉬버퍼는 메트리얼이 따로 적용될수있는 최소 단위 이기도 합니다. 메트리얼은 참조본이 아닌 원본을 가지고있으며 고유하게 하나의 메쉬 버퍼에만 사용됩니다.
일리히트엔진의 특징중 하나는 씬노드 단에서는 메트리얼객체를 포인터나 참조를 써서 공유할수없다는 것입니다. 이 점이 대부분의 엔진과 가장 큰 차이점 중하나입니다. 대부분 메트리얼을 따로 만들고 그것을 여러곳에서 참조할수있는 반면 일리히트엔진은 메쉬버퍼와 메트리얼이 일부일처제 입니다.
그래서 메쉬버퍼를 필요이상으로 많이 나눠서 만들경우 상당히 메모리가 낭비되어지는 것에 주의 하셔야합니다.
실제로 씬노드들은 각자 한개 이상의 인스턴스화된 원본들만 가지고 있습니다.( 씬노드 편에서 다시 한번 다루도록하겠습니다.)
다수의 메쉬 버퍼(irr::scene::IMeshBuffer)들이 모여서 메쉬(irr::scene::IMesh) 가 됩니다. DXSDK와 좀 비슷합니다.(거의 같다고 봐야할지도??)
기본 메쉬형 이외에 아래와 같이 에니메이션을 위한 확장된 형태의 메쉬들을 제공합니다.
- 메쉬 생성하기
일리히트엔진에서는 기본적으로 평면 ,큐브, 실린더,구,원뿔형태의 기본 메쉬를 만들어 주는 함수들을 제공합니다.
SceneManager::getGeometryCreator() 라는 함수를 이용해서 IGeometryCreator 받아옵니다. 그리고 이 객체의 멤버 함수들을 이용해서 기본 메쉬 들을 생성할 수 있습니다.
이함수들을 써서 메쉬를 만들경우 따로 메쉬 버퍼를 만들지 않아도 됩니다. 도우미 함수들이 내부적으로 알아서 만든 다음 먹기(?) 좋은 상태로 메쉬객체를 반환 해주기 때문입니다.
- 메쉬 버퍼 생성하기
또한 메쉬 버퍼도 직접 만들어볼 수 있습니다.
메쉬버퍼는 따로 만들어주는 도우미 함수 들이 없기 때문에 위와 같이 직접 메모리를 할당해서 만들어 줍니다.
할당받은 메쉬 버퍼의 객체 (pbuffer)내용물속에 있는 Vertices, Indices 직접 체워 넣을수있습니다.
아래 소스 처럼 SMeshBuffer 는 CMeshBuffer탬플릿 기반으로 만들어 진 클래스 입니다.
메쉬버퍼종류는 기본적으로 3 종류가 있습니다.
위에서 설명한 기본적인 메쉬버퍼 외에도 아래 상속 도표 처럼
터래인과 스키닝 에니메이션을 위함 메쉬버퍼가 있습니다.
랜더링은 메쉬를 바로 드로우하는것이 아니라 메쉬 버퍼단위로 드로우를 해줍니다.
이상의 내용으로 결론은 일리히트엔진은 DXSDK의 메쉬와 매우 유사하게 되어있다는 사실을 아실수있습니다.
반응형
'프로그래밍' 카테고리의 다른 글
Box2D Lite 소개 (물리엔진 공부의 좋은 시작) (8) | 2012.03.14 |
---|---|
나... 나도 병렬 프로그래밍 할래!! - #4 (7) | 2012.03.10 |
네트워크 게임 튜터리얼 4 - 로비, 그리고 할말이 많다 (22) | 2012.03.06 |
나... 나도 병렬 프로그래밍 할래!! - #3 (11) | 2012.03.01 |
코딩 스탠다드, 정말 이리 빡셀 필요 있나? (28) | 2012.03.01 |