irrlicht engine 사용기

subtitle : 2달 정도 만져보고 간단한 프로젝트를 완료후의 irrlicht 사용 소감

장점

빈곤한 자의 게임 엔진 / C++의 확장성

요즘 트렌드는 unity engine인거 게임업계 사람 아닌 나도 안다. 근데 유니티에서 오큘러스 리프트를 사용하려면 pro버전을 질러야한다. pro버전은 165만원… 취미로 갖고놀게 엔진이나 사볼까? 하기에는 너무 비싸다. 게다가 opencv 장착, 또는 raspberry pi로의 확장도 고려하고 있어서 unity는 버렸다.

아직도 살아있는 오픈소스 게임엔진

오픈소스 엔진중에서 포럼이 활성화되어있는거 찾아보면 irrlicht, ogre 정도 뿐인거같더라.

크로스플랫폼

프로젝트에서 사용한 플랫폼은 맥, 윈도우인데 양쪽에서 적절히 굴러간다. 그래서 신경안쓰고 윈도우 유저와 맥 유저가 섞여서 팀을 구성했다.

게임엔진

별도의 라이브러리 없이 완전한 게임을 만들 수 있다. irrlicht하고 맨날 비교되는 ogre엔진의 경우는 렌더링밖에 없다. 입력처리는 OIS에 외주를 맡기고 GUI는 CEGUI에 외주를 맡긴다. 하지만 일리히트는 그런거 필요없ㅋ엉ㅋ 단, 사운드 엔진, 본격적인 물리 엔진은 포함되어있지 않다. 사운드 엔진의 경우는 irrKlang라고 같은 사람이 만든걸 갖다붙이면 특별한 문제가 없다. 본격적인 물리엔진은 없지만 충돌처리는 지원해서 간단한거는 그냥 구현할 수 있다.

라이브러리형 엔진(?)

미천한 지식으로 3d 엔진 몇개 구경하고보고 느낀게 있는 엔진은 라이브러리형 엔진과 프레임워크형 엔진, 2가지로 나눌 수 있겠더라. 이 용어가 표준 용어인지 나는 모른다. 그냥 비전엔진을 이용한 MMORPG 개발에서도 쓰길래 갖다쓴거다. ogre엔진은 프레임워크형 엔진이다. irrlicht 라이브러리형 엔진이다. 라이브러리형 엔진이 구조를 파악하는데 훨씬 유리하다. 자세한 설명이 필요없다. 일리히트 튜토리얼 1과 오우거 튜토리얼 1의 소스를 비교하면 답이 나온다.

irrlicht sample code

int main()
{
     IrrlichtDevice *device =
          createDevice( video::EDT_SOFTWARE, dimension2d<u32>(640, 480), 16,
               false, false, false, 0);
              
     IVideoDriver* driver = device->getVideoDriver();
     ISceneManager* smgr = device->getSceneManager();

     IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2");
     IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );
     smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));
     while(device->run())
     {
          driver->beginScene(true, true, SColor(255,100,101,140));
          smgr->drawAll();
          driver->endScene();
     }
}

ogre sample code

class TutorialApplication : public BaseApplication {
public:
    TutorialApplication(void);
    virtual ~TutorialApplication(void);

protected:
    virtual void createScene(void);
};

class BaseApplication : public Ogre::FrameListener, public Ogre::WindowEventListener, public OIS::KeyListener, public OIS::MouseListener, OgreBites::SdkTrayListener {
..............
}

int main(int argc, char *argv[])
{
     TutorialApplication app;
     app.go();
}

일리히트 튜토리얼은 게임메인 루프가 투명하게 보인다. 대체 엔진이 어떻게 돌아가는지를 쉽게 파악할 수 있다. ogre엔진의 경우는 답이 없다. 어떻게 굴러가는지는 완전히 숨겨져있다. 게다가 튜토리얼에서 상속받는 BaseApplication에 대한 설명은 튜토리얼 맨 끝에서야 등장한다. 오우거 소스를 분석하면 결국은 일리히트랑 똑같다능! 하고 우길수도 있겠지만 튜토리얼은 엔진의 입문자용 설명서라는걸 잊으면 안된다. 튜토리얼에 등장하는 코드를 엔진에서 권장하는 코딩스타일이라고 해도 틀린건 아닐테니까…

우월한 튜토리얼

튜토리얼이 잘 준비되어있다. 엔진안에 튜토리얼 소스까지 전부 들어있어서 공부하기 좋다.

간단한 Scene Graph

irr::scene::ISceneNode를 상속받아서 잘 구현하면 손쉽게 씬그래프를 확장할 수 있다. 멍청한 내가 쓸 수 있을정도면 구조가 매우 단순하다는거다.

단점

Remember, No DirectX 10/11

지원하는 Dx는 8,9이다. 03년도부터 개발하기 시작한 엔진에 너무 많은걸 바라면 안된다. 다만, 공식은 아니지만 dx11을 지원하도록 일리히트를 개조하는 프로젝트가 있더라. irrlicht-20xx (물론 나는 돌려보지도 않았다)

크로스 플랫폼

장점으로 등장했던 크로스플랫폼이 이번에는 단점으로 등장한다. 크로스플랫폼이 왜 단점인가? 각각의 OS별로 메인테이너가 붙어있지 않으면 기능이 박살나도 모른다. 우리팀이 당한 함정은 irrlicht용 퀘이크 콘솔같은거를 만들고 콘솔을 띄우는 단축키를 `(~)로 연결시켜놨다. 그런데 맥에서는 `(~)가 F5로 인식되서 작동하지 않았다. 게임엔진이다보니까 규모는 거대한데 그에 비해 메인테이너의 숫자는 그렇게 많지 않다보니까 이런식의 함정이 많이 숨겨져 있을 듯하다.(고작 2달 쓰면서도 몇개 밟았는데 앞으로 쓰면 얼마나 많이 밟을지…)

윈도우에서 게임 패드 진동이 지원 안함

윈도우에서 입력시스템은 DirectInput을 사용해수 구현했다. 근데 이거는 게임패드 진동을 지원하지 않는다. irrlicht가 dx8부터 지원하는 엔진으로 추측하건데 호랑이 담배피던 시절에 DirectInput으로 구현하고 XInput 등장 이후에 안바꾼같다. SuperTuxKart의 경우는 게임패드 진동을 구현하기 위해서 irrlicht 내장 input system 안쓰고 OIS를 썻다고 카더라

정신나간 솔루션

엔진 예제코드에 들어가면 솔루션 파일이 8개나 존재한다.

  • visual studio 2003
  • visual studio 2005
  • visual studio 2008
  • visual studio 2010
  • visual studio 2012
  • dev-c++
  • code::block
  • makefile

이걸 전부 관리한다고? 미친거 아냐? 그래서 우리팀은 irrlicht에 cmake를 붙여서 사용했다

ifdef 도배

크로스플랫폼을 하려다보니까 ifdef..endif가 도배되어있다. ifdef…endif를 사용했다는건 크로스플랫폼이니까 이해한다. 그런데 너무 막장으로 사용한 곳이 많아서 흐름파악할때 골때리더라.

수동 레퍼런스 카운팅

ptr->drop(), ptr->grab() 으로 레퍼런스 카운팅을 수동으로 하게 되어있다. 03년도부터 만든 엔진이니까 shared_ptr을 안쓴듯하다. 레거시가 다 그렇지뭐…

개떡같은 애니메이션 지원

엔진 기능 정보는 보면 애니메이션 포맷은 다음을 지원한다고 되어있다.

  • B3D files (.b3d, r, skeleton)
  • Microsoft DirectX (.x, r) (binary & text, skeleton)
  • Milkshape (.ms3d, r, skeleton)
  • Quake 3 models (.md3, r, morph)
  • Quake 2 models (.md2, r, morph)

md2, md3는 스켈레톤이 아니니까 버리고 b3d는 Blitz3D Model은 듣보잡 엔진에서 지원하는 포맷이라서 버리고 ms3d는 툴이 없어서 버리면 선택지는 x 포맷뿐이다. 근데 이거는 exporter도 멀쩡한게 별로 없고 게다가 일리히트가 제대로 구현 안 했는지 exporter 옵션에 따라서 로딩이 잘 안되더라. 스켈레톤 애니메이션을 제대로 하고 싶으면 직접 만들거나 스켈레톤 애니메이션을 포기하고 md2, md3로 가는거 외에는 답이 없다. (우리팀의 경우는 x포맷을 쓰면 되겠지 하고 시도했다가 망했다)

구식 material system

엔진이 dx8부터 지원하고 software rendering도 지원하는데 기본 material같은게 최신 트렌드를 따라갈리가 있나… 마테리얼 시스템만 보면 10년도 더된 퀘이크3보다 구식의 느낌이다. 그렇다고해서 마테리얼 시스템 확장이 불가능한건 아니다. programmable shader가 지원되니까 필요하면 glsl/hlsl로 적절히 만들면 된다. (irrlicht engine에서 oculus rift를 지원할때 이게 사용되었다)

NEXT?

opencv라든가 raspberry pi라든가로의 확장을 생각하고 있기떄문에 요즘트렌드인 유니티는 쓰지 않을거다.(165만원주고 unity pro 사주는 호구가 있으면 생각이 바뀔지도?)

ogre는 예전에 크게 데인적이 있어서 쓸 생각이 없다(지랄같은 상속구조…. “너무 잘된” 추상화…덕분에 내부가 어떻게 굴러가나 파악하기 어려워…)

irrlicht engine은 다른 단점은 다 참고 쓰겠는데 멀쩡한 애니메이션 지원이 없다라는 점과 구식코드라는 점에서 다음 프로젝트에서는 쓰지 않기로 했다.

그래서 소규모 프로젝트가 망하는 지름길인 자체엔진개발을 선택했다 ㅋㅋㅋㅋ…..뭐 irrlicht engine은 안쓰지만 설계는 마음에 들어서 자작엔진 만들떄 참고할 생각이다.

추가링크


comments powered by Disqus