yuchi's Development Home
라이트맵을 구현해 보신 분들은 아실겁니다.
시각적으로는 연결되어있는 오브젝트라도 기하구조상으로는 잘려있는 경우라든가 매쉬의 모서리 부분이라든가 라이트맵을 적용할때 어쩔 수 없이 금이 가는 현상이 있습니다.
오브젝트를 자르고 오브젝트 안에서 면을 펼쳐서 라이트맵의 uv좌표를 부여하다보면 인접한 매쉬가 반드시 인접한 텍셀을 가지도록 보장할 수 없습니다.
즉 모서리를 기준으로 바로 옆의 삼각형이지만 라이트맵 텍스쳐 상으로는 멀리 떨어진 텍스쳐 공간일 수 있다는 것이죠.
이 경우는 텍스쳐 블랜딩의 수혜를 받기는 커녕. 텍스쳐 블랜딩으로 오히려 금이 가는 현상이 더 도드라지게 보입니다.
퇴사 후 이 문제에 대해서 좀 진지하게 생각을 해봤습니다.
고민의 결과 3차원 상에서 텍셀들을 블러링 시키는 방법을 생각해봤습니다. 사실 별 대단할 것도 없는 아이디어지요.
bsp트리같은걸 만들어서 씬 전체의 엣지를 싸그리 때려넣고 3차원상의 텍셀(저는 LIGHTMAP PATCH라고 부릅니다.)을 몽땅 때려넣어서 엣지 부근의 텍셀들을 잡아서 엣지를 따라 움직이며 블러링 하는 방법입니다.
이 아이디어로 지난 일주일 정도 코딩을 해서 일단 결과는 봤습니다.
속도문제나 그런건 어느 정도 해결을 했는데 문제는 역시나 퀄리티. 더 정확하게 말하면 블러링을 해도 인접한 텍셀이 영 쌩뚱맞은 녀석들이기 때문에 렌더링시 텍스쳐 블랜딩의 결과로 전혀 상관없는 텍셀의 영향을 받게 된다는 거죠.
으...그러니까 애초에 근본적으로 블러링의 문제보다 인접한 텍셀이 관계있는 놈인 경우, 관계없는 놈인 경우에 대한 처리가 선행되어야 했던 겁니다.
라이트맵을 꽤 오랜 시간 붙들고 있었지만 그 문제에 대해서 확실히 처리해본 적은 없었어요. 아니 고민조차 안해봤습니다.
3차원상에 텍셀을 위치시키고 그림자와 라이트에 대해서 컬러값만 계산하면 된다고 생각했었었죠. 그 텍셀들이 삼각형 안에 확실히 포함되는지 아니면 걸치는지 바깥으로 나가는지에 대해선 고민을 안해봤었던 겁니다.
해서 다시 요 몇일 새 유효한 텍셀과 그렇지 않은 텍셀로 구분하는 작업을 했습니다. 별거 아닙니다. 텍스쳐 위에다 삼각형을 그려서 마스크용 비트맵을 만드는거죠. 라이트텍스쳐와 1:1 대응되는 흑백 마스크 텍스쳐를 만들어두면 텍셀의 유효성 처리에 상당히 요긴하게 쓸 수 있으니까요.
아이디어는 단순했지만 막상 텍셀 위에다 삼각형을 그려보니 이것도 간한하지가 않데요. 지금까지는 삼각형의 레스터라이즈를 구현해본적이 없었습니다. 당연히 GPU가 해주니까요.
어쨌든 직접 구현해보니 생각할게 많더군요. 하여간 삼각형을의 세 점을 Y축으로 소트하고 수평선을 기준으로 자르고 하면서 레스터라이즈 코드를 작성했습니다. 임의의 숫자들을 부여해서 테스트를 해보니 잘 돌아갔습니다만 역시나 복잡한 데이타를 넣으니 오차 문제가 속을 썩히더군요.
라이트맵 좌표는 0.0000673이런식으로 아주 작은 숫자가 나오는 경우가 많아서 기울기 계산이라든가 할때 골때리는 문제가 꽤 발생했습니다.
집중되는 새벽 시간을 이용해서 끈기있게 디버깅을 하고 코드를 튜닝해서 어느 정도 제대로 작동하게 만들었습니다.
일단 마스크 비트맵을 뽑았고 이제 할 수 있는게 훨씬 많아졌네요. 당장 라이트맵 텍셀 드로잉 시에 생겼던 문제들도 깔끔하게 해결할 수 있을것 같습니다.
2006년도 이후로 라이트맵 텍스쳐를 어떻게 사용하고 있는지 확인을 안해봤는데 이번에 뽑아보니 나름 감회가 새롭네요. 생각보다 공간 활용 잘 했구나 싶기도 하고.
여튼 그런 작업들을 하고 있습니다. 뭔가 비주얼적으로 공개할만한게 생기면 또 포스팅 하겠습니다.