CUDA + Lightmap 관련 잡설

예전에 NDC에서 발표했던 자료.

참고로…
라이트맵은 15년전에 만든 엔진에도 들어가 있었고 코룸온라인/묵향 온라인에 적용해서 서비스했었다. blur도 들어가지 않은 raw라이트맵이었다. 그래도 그 시절엔 꽤 괜찮아보였다.
후에 이소프넷 망하고 묵향쪽이 분사하면서 라이트맵 베이킹도 안하게 됐다. 나도 다른 회사 갔고 그 회사엔 더 이상 코드 유지보수할 사람도 툴 사용법을 제대로 아는 사람도 없어서 그냥 깔끔하게 포기했던걸로 안다.

당시에 3dsmax에서 구워서 쓰는 업체들이 있었는데 그렇게 하면 텍스처 낭비가 어마어마하게 심해지고 라이트 변경이 어려운 문제가 있다.
난 그렇게 안했고 엔진에서 폴리곤 모델 전개해서 라이트맵 좌표 새로 만들어주고 텍스처 조각은 모아서 팩킹했다. 펜티엄3 듀얼 쓰던 시절에 멀티스레드로 계산했었다. 듀얼 CPU에선 190%정도 성능 향상이 있었다.

2009년까진 멀티스레드로 구웠고 2010년부터 CUDA로 라이트맵을 구웠다. 그 당시 내가 진행하던 프로젝트에서 CUDA 베이킹을 적용했다. 디자이너들 PC에 CUDA설치해서 실제 작업을 CUDA로 했다. CPU 멀티스레드 버전에 비해 10배 이상 빨랐기 때문에 디자이너들이 상당히 만족해했다. 당연히 CUDA용 라이트맵 베이킹 라이브러리 따윈 없었고 텍셀의 패치로부터 광원까지 ray 쏴서 계산했다.

3dsmax에서 라이트맵 굽는것과 마찬가지로 따로 나오는 외부제품은 자체 엔진에는 붙이기가 상당히 까다롭다. 코드를 붙이는 문제가 아니고 폴리곤데이터의 포맷이 다르기 때문이다. 외부 베이킹 라이브러리를 붙이면 라이트맵 좌표를 줄때 문제가 생긴다. 텍스처 낭비가 심해지고 라이트 위치를 쉽사리 변경하지 못하게 된다. 내 엔진에선 BSP + ROOM/PORTAL방식을 사용하므로 모델데이터 import하면 bsp트리에 맞춰서 모델을 다 쪼개서 재구성한다. 이 상태에서 더더욱 외부 라이브러리는 붙이기 어렵다.

하여간…
라이트맵 좌표 부여하는것도 상당히 빡센 이슈이고. 이거 막상 구현해보면 쉽지 않다.
찾아보면 더 있긴 할텐데 내가 본 국산게임중 라이트맵을 구현했던 게임은 RYL온라인이 처음이었다.
일단 국내에서 직접 구현한 라이트맵으로 게임 출시해본 사람 아마 거의 다 내가 아는 사람들일거고. 정말 몇명 안된다.

그중에서 CUDA로 직접 구현해서 구워본 사람은 아마 나밖에 없을거라고 생각한다.


답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중