Featured image of post anisotropic 샘플링

anisotropic 샘플링

그전부터 지적되어 오던, ‘겜브리오는 이미지가 왠지 선명하지 못하고 부옇다’ 라는 문제를 개선하기 위한 연구발표입니다.
정 순호 스승님의 도움으로 완성할 수 있었습니다.

사건의 발단은 아래의 사진
언리얼 화면을 연구하면서 쉐이더 교체를 했던 그 때 입니다.
맨 왼쪽이 기존 쉐이더, 맨 오른쪽이 언리얼 쉐이더 화면, 가운데가 개선된 겜브리오 쉐이더와 텍스쳐였습니다.
그런데 이제 퀄리티는 어느 정도 비슷해 져서 별로 꿀리지 않을 레벨까지 갔습니다만 …

이제 뭔가 눈에 띄는 문제는 텍스쳐의 질감이 확실히 뿌옇다… 라는 것이었습니다.
보시면 알겠지만, 겜브리오 쪽이 확실히 디테일이 떨어지고 뿌옇게 보입니다. 이래서야 열심히 그려도 별로 티가 안나니 잘 그릴 필요도 없어지고, 화면이 전체적으로 블러 필터라도 낀 듯이 흐려져 보이게 되겠지요. (그렇다고 텍스쳐를 흐리게 그리면 더 흐려져서 빈곤의 악순환이…)

이 문제는 엔진의 한계야 …라는건 사실 구조적 문제가 아닌 이상 핑계에 가깝고, 어차피 DX9을 이용한 렌더러는 구현 공식만 같으면 같은 결과를 나타내 줍니다. 때문에 세운 가설은 ‘텍스쳐 셈플링’ 과 ‘밉맵 바이어스’ 쪽의 문제일 것이라고 생각하였고, 그 부분을 접근해 보았습니다.

몇 번의 삽질과 실패 끝에 텍스쳐 샘플링 필터 쪽이 해결되어 올립니다. 밉맵 바이어스는 구현되는 것을 정순호 스승님이 확인했습니다만, 겜브리오 엔진의 버그로 작동하지 않고 있었습니다. 이것은 곧 수정되어 결과가 발표될 예정입니다.

텍스쳐 샘플링

기존의 기본 샘플링은 텍스쳐가 기울어질 때, Liner하게 처리합니다. 텍스쳐가 기울어진다는 것은 기울어진 방향으로 텍스쳐가 좁아지는 것과 같고, 곧 안티 알리아싱 같은 효과가 나오게 되는 것이지요. Liner 방식은 필터링 방식 중 속도는 빠르지만 텍스쳐가 너무 뿌옇게 된다는 단점이 있습니다. 덕분에 급격하게 꺾인 부분의 섬세한 텍스쳐는 갑자기 블러라도 먹인 듯 뿌옇게 나타난다는 단점이 있었죠.

이것을 그렇게 단순하게 처리하지 않고, 주변의 텍셀들을 참조하여 연산해서 자신(픽셀) 의 색상을 보다 정밀하게 계산하는 방식들이  Bilinear, Trilinear 라는 샘플링 방식들입니다.
그렇지만 그 방식중에서 가장 퀄리티가 좋은 방법이 바로 anisotropic 샘플링입니다.
긴 설명은 스킵하고 당장 퀄리티를 보도록 하지요.

좌측이 기존에 우리가 겜브리오에서 사용하던 Liner 샘플링 방식입니다.
보시면 알겠지만, 섬세한 텍스쳐가 기울어지면서 완전히 날라가는 것을 볼 수 있습니다 (주전자 뚜껑을 보세요)

그리고 오른쪽이 anisotropic 4단계입니다. 텍스쳐 퀄리티가 확연히 다른 것을 알 수 있습니다. 두 주전자와 두 플렌은 완전히 동일한 텍스쳐인데 말입니다.

이 기능은 엔진에서 지원해 주는 기능은 아닙니다. 단지 우리가 못 찾고 있었고, 겜브리오에서도 기본으로 보여주지 않았을 뿐이지요. (신경을 안 쓰고 있었달까)

어쨌건 그래서 나온 실제 결과물의 차이는
 위와 같습니다.
기울어진 부분의 텍스쳐가 확실히 섬세해진 것을 볼 수 있습니다. 위 예제보다 좀 더 복잡하고 섬세한 텍스쳐라면 그 효과는 더더욱 잘 나타나게 됩니다. 특히 건물의 벽면과 같이 기울어진 부분이 많이 보게 될 이미지는 이 샘플링의 효과가 클 것이라 보여집니다.

문제점과 결론

이 방식을 시스템에서 제어하는 것이 아니라, 쉐이더에서 제어할 수 있게 됨에 따라 여러가지 가능성을 가지게 되었습니다. 위 그림도 base 맵핑만 anisotropic 필터링을 적용한 것이고, normal이나 gloss는 적용하지 않았습니다. 이런 세부 조정이 가능해지게 되지요.

문제점이라면 이것도 일종의 하드웨어 가속을 받는 안티 알리아싱 기법인 관계로, 그래픽 카드의 자원을 많이 소모하는 편의 기술이라는 것입니다. 물론 주변에 알아본 바에 의하면  anisotropic 정도는 이제 기본으로 사용하고 있다고 합니다만.
게다가 게임의 특성상 과연 이게 느껴질만큼 캐릭터가 확대될 것인가? 도 늘 고려사항입니다. 물론 좀 멀리 떨어지더라도 기울어진 면의 선명도는 확실히 올라가겠지만, 그 효과가 시스템 자원 소비 이상의 값어치가 있느냐는 것이지요. 

그렇지만 다행히도 쉐이더 단계에서 수동으로 조정이 가능하며, 소스를 고칠 필요도 없고 언제건 옛날 방식으로 돌아오기가 매우 용이한 편이니 일단 넣어 놓고 진행하는 것으로 하겠습니다. 옵션에 따라 조정할 수도 있고, 여러 가지 선택지가 많다는 점은 매우 매력적이니까요. 

배경 타일에도 사용해 보았습니다만, 우리 프로젝트 같은 경우에는 특별히 좋은 느낌을 받지는 못했습니다.이것은 텍스쳐 디자인 자체가 랜덤성 있는 이미지들로 이루어져 있어서가 아닐가 생각합니다. 오히려 배경 타일은 지금 연구되고 있는 밉맵 바이어스 조절 기능을 기대해 보는 것이 좋을 듯 합니다. (밉맵을 밀어버리는 겁니다) 

어쨌건, 알면서 필요에 의해 안쓰는 것과 몰라서 아예 못쓰는 것과는 차이가 있는 것이니까요.

Hugo로 만듦
JimmyStack 테마 사용 중