FMeshBoolean 코드 분석 후기
실무에서 런타임에 메쉬의 연산이 필요한 케이스가 있었다. 정확히는 A메쉬에서 B메쉬 모양만큼 제거를 해야하는 케이스이다. 그리고 언리얼 엔진에서 제공하는 기능이 있었는데 바로 FMeshBoolean이다.

에픽에서 설명하는 불린을 참고하면 된다. 일단 언리얼에서 이 메쉬불린은 런타임에서 실시간 편집을 위한 기능이기 보다는 모델링 툴에서 스태틱 메쉬를 편집하기 위해 구현된 기능으로 보인다.
하지만 프로시저럴 메쉬 컴포넌트를 이용하면 런타임에서 실시간 메쉬 구성이 가능하고, 실제로 슬라이스를 통해서 동적 편집 테스트도 했었기에 메쉬 불린 자체가 너무 무겁지만 않다면 제한적으로 런타임에 실시간 편집이 가능하지 않을까 싶었다. 해서, 어떤 로직들로 편집이 되는지 코드 분석을 해볼 필요가 있다.
실제 분석해야할 코드의 분량이 생각보다 엄청났다. 이걸 일일히 하나씩 분석했다가는 너무 많은 시간이 소요될 것 같았다. 그래서 클로드 코드의 힘을 빌리기로 했다. 언리얼 엔진 자체가 엄청 크기 때문에 클로드 코드로 거시적인 분석은 어렵지만 부분적인 코드 분석은 충분히 잘 해낼 수 있기 때문에 부분적으로 분석을 해서 짜집기를 했다.
1차 코드 분석은 클로드 코드에게

클로드 코드에게 분석을 요청한 결과이다. 내용은 좋은데 가독성이 너무 떨어진다.
분석한 내용을 옵시디언 노트로 복사, 2차 정리

일단 클로드 코드가 분석한 내용을 옵시디언 노트로 복사를 한다. 옵시디언 노트에는 내가 정리하고 있는 문서들의 포맷이 있다. 클로드 코드에게 참고해야할 문서들을 던져주면서 이 포맷에 맞추어 다시 문서를 정리해달라고 요청하면 정말 깔끔하고 던져준 문서의 포맷에 맞춰 정리를 해준다.
이 부분에 대해서 클로드 코드의 생성 제한에 도달해서 제미나이 CLI를 통해 동일한 요청을 해봤지만 결과물이 여전히 마음에 들지 않는다. 클로드 코드가 훨씬 내가 생각했던 의도에 맞게 편집을 해준다. 무료 모델을 사용해서 그런건지, 제미나이 CLI자체의 한계인지 모르겠다.
정리된 내용 검토, 학습, 직접 정리
클로드 코드가 정리를 잘해주긴 하지만 읽지 않으면 내것이 될 수 없다. 정리된 내용을 읽으면서 이해도 하고, 필요 없는 부분은 쳐내고. 보충 혹은 수정이 필요해보이는 부분은 수정을 하는등 후처리를 해준다.
또 하나의 노트에 내용을 정리하기에는 너무 방대하고 길어서 읽기가 쉽지 않다. 이전에 프로시저럴 메쉬 슬라이스 분석 부분을 하나의 노트에 정리하면서 깨닳았던 부분이다. 이번에는 최대한 아토믹하게 내용을 분리해서 각 노트로 분리했다. 결과적으로 FMeshBoolean분석 정리된 노트의 갯수가 40개가 넘어간다.
분석을 해보니
두 메쉬간의 결합 관계에 대한 연산이고, 결국은 각 정점별로 연산이 이루어질 수 밖에 없다. 또한 이 연산은 CPU에서 이루어진다. 상당히 부담이 될 수 밖에 없다.
내부 로직을 살펴보니 각 정점을 옥트리를 이용한 공간분할, 해쉬 그리드 맵, 패스트 와인딩 넘버등을 사용해 최적화한 흔적들이 보인다. CPU를 사용하긴 하지만 병렬처리가 가능한 부분은 병렬처리까지 한 것으로 보인다. 이정도면 런타임에 실시간으로 메쉬 불린 연산을 부분적으로 사용해봄직하다.
물론 몇가지 제한 사항들은 있다. 하이 폴리곤끼리의 연산, 동시에 여러 메쉬 연산과 같이 리소스 측면이나 로드밸런싱과 같은 사용하는 측면에서 회피해야할건 회피하고 최적화에 신경써야할건 신경써야 한다.
마지막으로 메쉬 불린 연산의 결과인 FDynamicMesh3을 프로시저럴 메쉬로 컨버팅하는 로직은 없어서 이 부분은 직접 작성해서 사용해야 했다. 컨버팅했던 부분은 따로 포스팅할 예정이다.
위키 공개
분석 및 정리했던 부분은 따로 위키 사이트에 공개해두어 필요할 때 외부에서 편하게 읽을 수 있도록 추가해두었다.





댓글을 남겨주세요
Want to join the discussion?Feel free to contribute!