꽃미남 프로그래머 김포프가 창립한 탑 프로그래머 양성 교육 기관 POCU 아카데미 오픈!
절찬리에 수강생 모집 중!
프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 밥을먹는선비
-들어가며..

제가 쓰는 내용은 일리히트엔진에 관한 내용이 주가 되다보니 일반적인 이론은 좀 소홀히 하는 경향이 있습니다.
사실 이론적인 부분은 저보다 실력있는 필자분들이 많이 계시니 저는 엔진을 분석하는 데 촛점을 두려고합니다.

-메쉬란?

폴리곤들을 단위별로 모아서 랜더링 작업을 체계적으로 하기 위해 만들어 놓은 자료 구조입니다. 2디 게임으로 치면 픽셀이 폴리건 이고 비트멥 이미지가 메쉬가 되겠습니다.



잘 이해가 안되 신다면 위 그림 처럼 Mesh 스타킹을 연상하시면됩니다.

이전 시간에 버텍스 와 인덱스 리스트를 직접 다뤄 보았는데요. 사실 이렇게 drawprimitive 함수등으로 버텍스를 직접 넣어서 쓸거면 엔진을 쓰는 의미는 거의 없습니다. 그냥 랜더러 랩핑한 라이브러리 수준이겠죠. 사실 제가 어린시절(1994년도 쯤...) 처음 3D프로그램시작할때 메쉬라는것도 모르고 게임을 만든적이있었는데 그때 정말 진정한 카오스를 경험 한적이 있었습니다.
그래서 어느순간부터 버텍스와인덱스 정보를 쌍으로 관리해서 사용을 했었는데 나중에 그런것들을 사람들이 메쉬라고 하던 거였더군요. 그리고 어느순간부터 dxsdk에 메쉬기능이 붙어서 나오기도 하더군요.

- 일리히트엔진에서의 메쉬 구현

일리히트엔진은 메쉬구조내에 메쉬버퍼라는 구조를 여러개 따로 가질 수 있습니다.
메쉬버퍼는 메트리얼이 따로 적용될수있는 최소 단위 이기도 합니다. 메트리얼은 참조본이 아닌 원본을 가지고있으며 고유하게 하나의 메쉬 버퍼에만 사용됩니다. 

일리히트엔진의 특징중 하나는 씬노드 단에서는 메트리얼객체를 포인터나 참조를 써서 공유할수없다는 것입니다.  이 점이 대부분의 엔진과 가장 큰 차이점 중하나입니다. 대부분 메트리얼을 따로 만들고 그것을 여러곳에서 참조할수있는 반면 일리히트엔진은 메쉬버퍼와 메트리얼이 일부일처제 입니다. 
그래서 메쉬버퍼를 필요이상으로 많이 나눠서 만들경우 상당히 메모리가 낭비되어지는 것에 주의 하셔야합니다.

실제로 씬노드들은 각자 한개 이상의 인스턴스화된 원본들만 가지고 있습니다.( 씬노드 편에서  다시 한번 다루도록하겠습니다.)

다수의 메쉬 버퍼(irr::scene::IMeshBuffer)들이 모여서 메쉬(irr::scene::IMesh) 가 됩니다. DXSDK와 좀 비슷합니다.(거의 같다고 봐야할지도??)




기본 메쉬형 이외에 아래와 같이 에니메이션을 위한 확장된 형태의 메쉬들을 제공합니다.




- 메쉬 생성하기

일리히트엔진에서는 기본적으로 평면 ,큐브, 실린더,구,원뿔형태의 기본 메쉬를 만들어 주는 함수들을 제공합니다.

SceneManager::getGeometryCreator() 라는 함수를 이용해서 IGeometryCreator   받아옵니다. 그리고 이 객체의 멤버 함수들을 이용해서 기본 메쉬 들을 생성할 수 있습니다. 

이함수들을 써서 메쉬를 만들경우 따로 메쉬 버퍼를 만들지 않아도 됩니다. 도우미 함수들이 내부적으로 알아서 만든 다음 먹기(?) 좋은 상태로 메쉬객체를 반환 해주기 때문입니다.



- 메쉬 버퍼 생성하기 

또한 메쉬 버퍼도 직접 만들어볼 수 있습니다.


메쉬버퍼는 따로 만들어주는 도우미 함수 들이 없기 때문에 위와 같이 직접 메모리를 할당해서 만들어 줍니다.
할당받은 메쉬 버퍼의 객체 (pbuffer)내용물속에 있는 Vertices, Indices 직접 체워 넣을수있습니다.

아래 소스 처럼 SMeshBuffer 는 CMeshBuffer탬플릿 기반으로 만들어 진 클래스 입니다.
메쉬버퍼종류는 기본적으로 3 종류가 있습니다.


위에서 설명한 기본적인 메쉬버퍼 외에도 아래 상속 도표 처럼


터래인과 스키닝 에니메이션을 위함 메쉬버퍼가 있습니다.




랜더링은 메쉬를 바로 드로우하는것이 아니라 메쉬 버퍼단위로 드로우를 해줍니다. 


이상의 내용으로 결론은 일리히트엔진은 DXSDK의 메쉬와 매우 유사하게 되어있다는 사실을 아실수있습니다.









 

댓글을 달아 주세요

  1. 히이로 2012.03.15 02:26  댓글주소  수정/삭제  댓글쓰기

    일리히트 정말 좋은 엔진이지요...

    기업에서 쓰길 꺼려 한다면 아마추어 게임제작팀에서 써도 좋을듯한데..

    매우 아쉬운 엔진이에요 ㅎㅎ 강의 감사합니다 ! ㅎㅎ :)

    • Favicon of https://gamedevforever.com 밥을먹는선비 2012.03.17 00:23 신고  댓글주소  수정/삭제

      댓글 감사합니다. ^^;

      엔진 원 개발자가 공부하려고 만든엔진이다보니 특히 학생들이 공부하면서 만들기도 매우 좋은 엔진입니다^^; 물론 기본기를 기르고싶은 실무자들에게도 좋습니다.

  2. 이기현 2012.05.21 17:25  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 좋은 강좌 감사합니다.
    궁금한게 있어서요.
    혹 .x 파일은 애니메이션이 되는데 load 하는데 시간이 오래 걸려서요.
    그래서 혹 .x 파일을 .irrmesh로 바꿔서 소스상에서 load 하는 방법이 없을까요 ?
    혹 알고 계시면 cosinee@naver.com 으로 답변 부탁 드립니다.
    감사합니다.