게임 배경, 환경 최적화에 매우 중요하게 쓰이는 기술 Trim Sheet
게임, 실시간3D 최적화에 대단히 중요하게 사용되고 효과도 좋은 기술인데, 잘 모르시는 분들도 많고, 잘 사용하지 못하거나 개념을 잘 이해하지 못하시는 분들도 꽤 많은 것 같아서 작성하는 글 입니다.
게임 최적화에 대해서 공부해보면, 한 화면에 보여지는 재질의 수를 최대한 줄이면 SetPass, 드로우콜 등이 줄어들면서 FPS를 크게 향상시킬 수 있는 방법이 되는 것을 아실텐데, 그렇게 해 줄 수 있는 텍스쳐링 방법입니다.
주어진 한계의 자원을 최대한 효율적으로 사용해야 하는 게임(실시간) 3D 환경에 주로 쓰는 Trim Sheets에 대해 알아봅니다.
우선 Trim Sheets가 무엇인지를 이해해야 하겠죠.
일종의 Atlas 맵을 구성하고 만드는 것과 같은데요.
우주선 복도와 같은 환경, 씬을 제작한다고 할 때, 잘 분석해 보면, 이 씬에 들어갈 소품(Prop)들의 텍스쳐들이 공유 되거나 반복되어도 문제가 없다는 것을 알 수 있습니다.
이를 잘 이용해서 하나의 환경 씬을 하나 또는 몇 장의 텍스쳐로 구성되도록 모델들의 UV를 잘 구성하고, 텍스쳐를 제작하는 것이라고 이해하면 되겠습니다.
씬 전체를 Trim sheets로 구성하긴 어려운 경우도 있을 텐데, 최대한 부분적으로 사용해도 게임, 실시간 3D 성능에서는 조금이라도 이익을 얻을 수 있습니다.
참고로 아래 영상을 보면 도움이 됩니다.
https://www.youtube.com/watch?v=uUJShalzWy8
이 영상의 설명을 빌어보면 Trim Sheet는 재질들(Materials)의 리스트라고 할 수 있다는 것입니다.
위 영상의 아파트 벽을 만드는 사례를 살펴보면, 필요한 재질들이 벽돌벽(Bricks), 돌/시멘트(Stone), 창문(Windows), 무늬가 있는 돌/시멘트 재질 등으로 나누어져 있다고 분석되고 이를 토대로 Trim Sheet 텍스쳐를 제작한 후 이에 맞춰 UV 작업을 해주면 완성이 되겠죠.
위 영상에서 Trim Texture sheet는 아래 이미지 처럼 제작했습니다.
Trim Sheet 텍스쳐
이 텍스쳐 한 장으로 아래 이미지에서 볼 수 있는 것처럼, 빌딩의 모델의 텍스쳐링을 모두 커버할 수 있는 것입니다.
보시면 아시겠지만, 텍스쳐의 부분 부분을 모델에 맞는 부위에 반복적으로 사용해서 자원활용을 최적화 하는 것입니다.
간단한 예를 보여준 것이어서 크게 감흥이 없을 수도 있습니다만, 이를 잘 구성하고 활용하게 되면 단 몇 장의 Trim Sheets texture 맵들로도 하나의 게임레벨을 커버할 수 있을 수도 있습니다. (다양한 사례들을 인터넷이나 유튜브에서 검색해 보세요)
Trim Sheets 작업은 크게 두 가지로 나뉘어 질 수 있습니다.
1. Model 들의 UV 작업
2. 텍스쳐링 작업
아래의 Adobe Substance Painter 에서 작업하는 튜토리얼 영상을 보시면, 복잡한 환경을 어떻게 Trim Sheets로 구성하는지 배우실 수 있을 것 입니다.
https://www.youtube.com/watch?v=dE4LWGMwypc&t=34s
Trim Sheets 텍스쳐(아틀라스)를 구성하는 것부터 Substance Painter를 이용하는 것이 흥미롭습니다. 영상을 보시면 아시겠지만, 정사각형 Plane mesh를 쪼개어 Grid 폴리곤으로 나누어 놓고, Substance Painter에서 폴리곤 선택모드로 각 그리드 별로 아틀라스맵을 구성하도록 나누어 일종의 id맵처럼 색을 부여해서 작업을 시작하네요.
영상을 보시면 쉽게 이해하실 수 있을테니 어려운 점은 없을 것 같습니다.
https://www.youtube.com/watch?v=QoVWM-IKmFw&t=2s
다음은 SF 느낌이 나는 텍스쳐들을 실제로 작업하는 장면들이 주를 이루는 2번째 튜토리얼 영상인데, 이렇게 끝이 나는 줄 알았는데 간만인 최근 세 번째 영상이 또, 올라왔습니다.
Trim Sheet 텍스쳐에 맞춰 UV를 작업하는 영상입니다.
https://www.youtube.com/watch?v=Dp2ZpGIaumA&t=161s
위에서 설명한 글과 영상을 보시고 나면, 이해하는데에는 크게 어려움이 없으실 텐데요.
그보다는 자신의 환경 씬에 어떻게 Trim Sheets를 구성할지 실제로 해보면서 연습이 되고 자신만의 노하우가 습득되면서 더 최적화된 Trim Sheets를 구성할 수 있을 것입니다.
좋은 Trim Sheets란 무엇일지 이해하는 것이 중요할 것 같습니다.
우선 Trim Sheets를 만드는 이유가 앞서 강조한 것처럼 실시간 렌더링 엔진에서 주로 쓰는 만큼 최적화가 중요합니다. 최대한 같은 재질이 적용되도록 구성해 주어 더 적은 수의 Trim Sheets 텍스쳐로 씬 전체를 구성하면 좋습니다.
이렇게 같은 Material을 공유해서 씬 전체에 더 적은 Material을 사용하면 좋은 점은 유니티엔진의 경우를 예로 들어 대략 설명하자면, Static batching, SRP batching(SRP 사용 시)같은 것이 적용되면서 draw call의 수가 줄어들 수 있게 됩니다.
CPU에서 GPU로 그리는 명령을 내리게 되는데, 각 오브젝트마다 명령을 내리면 그 수가 몇 천, 몇 만개를 넘어가게 되고, 그러면 CPU부하가 크게 걸리면서 그 병목으로 인해 FPS가 크게 떨어지게 됩니다. 그런데, 같은 오브젝트에 같은 material이면, 또는 다른 오브젝트들이라도 같은 재질을 공유하고 있으면 이들을 묶어서 CPU가 GPU에 그리는 명령을 내릴 수 있게 되고, 명령을 내리는 수, draw call의 수는 줄어들 수 있는 것입니다.
다만, 무조건 최적화만 된다고 좋은 것은 아닌 부분은 씬의 룩이 너무나 같은 재질의 반복느낌이 나 버린다거나 전체적인 씬의 재질이 너무 단순해 져 버린 느낌이 나지 않도록 해야 합니다.
Trim Sheets를 썼지만, 씬의 룩에는 Trim Sheets의 느낌이 전혀 묻어나지 않는 것이 가장 좋은 Trim Sheets 구성 입니다.
아무리 그렇더라도 반복적인 부분은 생길 수 밖에 없는데, 이럴 때 적용할 수 있는 좋은 팁은 Vertex color 정보를 이용해 Variation을 주는 방법이 있습니다.
이 부분에 대한 것은 유니티엔진에서 사용한다면, HDRP의 Layered Lit shader를 이용하는 방법이나 제가 제작한 Shader를 사용하는 방법 등이 있습니다. (https://blog.naver.com/sspsos74/222667490551)
[Unity] HeightMap Blending TriPlanar
아래에서 제작했던 HeightMap Blending Shader는 기본적으로 Terrain과 같은 바닥을 이루는 오브젝트...
blog.naver.com
이를 더 극대화해서 사용한 사례를 보여주는 글도 제가 포스팅 한 적이 있으니 참고해 보시면 좋을 듯 하네요.