Graphics/filament

filament 렌더링 엔진 여행기 #1 - 구글의 오픈소스 엔진은 렌더링을 어떻게 할까?

J'Heel; 2025. 4. 13. 17:21

요즘 출시되는 게임들을 보면 상당히 많은 게임들이 상용 엔진을 이용해 제작되고 있다.

 

 

국내 게임사 대부분은 상용 엔진인 언리얼과 유니티를 활용해 게임을 개발하고 있고, 꼭 게임이 아니라도 렌더링이 필요한 여러 분야에서 상용 엔진을 사용하고 있다.

 

 

확실히 상용 엔진은 직접 엔진을 개발해서 사용하는 것에 비하면 훨씬 싸게 먹힌다. 그러면서 품질 좋은 렌더링 결과를 제공하기 때문에 자연히 상용 엔진의 점유율을 높을 수 밖에 없을 것이다.

 

 

그런데 상용 엔진을 배우고 개발하는 많은 개발자들 중에서 엔진의 핵심적인 부분 중 하나인 렌더링 관련 영역에 대해 자세히 알고 있는 개발자는 얼마나 있을까? 아마 많지 않을 것이다.

 

 

이게 참 쉽지 않다. 일반적인 게임 혹은 기타 프로그램 개발에서 렌더링 관련 부분까지 깊게 파고 들어서 소스 코드 동작을 컨트하는 경우가 거의 없을 테니 당연하다.

 

 

하지만 분명히 어딘가에선 저수준의 렌더링 코드 동작을 알아봐야하거나 커스터마이징이 필요한 순간이 찾아올 것인데... 그렇다면 궁금하지 않은가?

 

 

언리얼이든 유니티든 상용 엔진들은 모바일, PC 등 다양한 플랫폼에서 작동하도록 빌드할 수 있도록 DirectX12, Vulkan, OpenGL 등 여러 렌더링 API를 지원한다.

 

 

특히나 렌더링 API의 경우 GPU 동작 특성 상 비슷한 부분은 있으나 실제 사용하기에는 상당한 차이점이 있을 수 밖에 없음에도 불구하고, 간단한 설정 변경만으로 사용자들은 원하는 백엔드 렌더링 API를 설정할 수 있도록 제공하고 있다.

 

 

분명 이를 위한 고도의 추상화를 구현하고, 그러면서도 성능 저하를 최소화 하기 위한 인터페이스를 구축했을 것인데 그 구조가 대체 어떻게 되어 있는 걸까?

 

 

그래서 한 번 알아보자!

 

 

렌더링 엔진은 대체 어떻게 생겨먹은 것인가!

 

 

 

 


 

 

 

filament 렌더링 엔진

https://github.com/google/filament

 

GitHub - google/filament: Filament is a real-time physically based rendering engine for Android, iOS, Windows, Linux, macOS, and

Filament is a real-time physically based rendering engine for Android, iOS, Windows, Linux, macOS, and WebGL2 - google/filament

github.com

이 포스팅에선 Google의 오픈 소스 프로젝트인 filament를 통해 렌더링 엔진에 대하여 탐구해볼 것이다.

 

 

filament는 오픈 소스 실시간 물리적 기반 렌더링 엔진으로 Android, iOS, Linux, macOS, Windows 및 WebGL 에서 동작할 수 있는 크로스 플랫폼 렌더링 엔진이다. google에서 하는 오픈 소스 프로젝트라지만 공식적으로 제공하는 제품은 아니란 것도 특징이다.

 

 

그 중에서도 Android에 최적화되어 엔진 자체가 가볍다는 특징이 있으며 오픈 소스 렌더링 엔진 중에서도 상당히 많은 기능을 제공한다.

 

 

지원하는 백엔드로는 OpenGL, Vulkan, Metal, WebGL 이 있어 렌더링 엔진 구조를 공부하기에 매우 적절한 교보재라고 볼 수 있다.

 

 

다만, DirectX 계열 API는 아쉽게도 지원하지 않는다.. 이는 아마 filament가 Android를 최우선으로 하여 개발되었기 때문으로 보인다. dx를 사용하는 개발자라면 아쉬운 점일 것이다.

 

 

마음 같아선 언리얼이나 유니티를 뜯어보고 싶었으나... 유니티는 엔진 소스 코드에 접근하려면 라이센스가 필요하고, 언리얼의 경우 뜯어보는 거야 문제가 없으나 오픈 소스여도 라이센스 문제 때문에 함부로 공개할 수가 없다...(에픽게임즈에 허가를 받는다면 가능할 수도 있겠으나.. 개인 블로그에서 하나하나 허가를 받으면서 글을 적는 것도 문제다)

 

 

하지만 아무리 차이가 있을지 언정 다양한 플랫폼과 백엔드를 지원하기 위한 구조를 만드는 핵심 원리와 이론 등을 학습하고, 이 정교한 엔진이 어떻게 동작하는 지 이해하기엔 아무런 문제가 없다.

 

 

filament의 구조만 충분히 이해해도 이 지식을 활용해 언리얼이든 유니티든 내부 엔진 코드를 직접 뜯어보는 것도 충분히 가능할 것이다!

 

 

이 포스팅의 목적은 결국 필자가 여지껏 공부한 것들을 정리하는 것이지만... 혹여나 렌더링 기술에 관심이 있고, 게임 엔진 개발에 관심이 있는 사람이 있다면 나름 도움이 되지 않을..까..? 기대한다.

 

 

혹시나 filament를 직접 빌드해보고 싶다면 아래 링크를 참고하자

https://github.com/google/filament/blob/main/BUILDING.md

 

filament/BUILDING.md at main · google/filament

Filament is a real-time physically based rendering engine for Android, iOS, Windows, Linux, macOS, and WebGL2 - google/filament

github.com

 

 

빌드해서 실행하는 방법을 적어둘까 생각도 해봤지만.. 이미 잘 정리된 자료가 있기에 굳이 적어두진 않겠다.

 

 

샘플 프로젝트도 많이 있기 때문에 하나씩 실행해보는 것도 좋다. 샘플 중에서도 material_sandbox 샘플 프로젝트를 통해 filament 에서 제공하는 기능들에 관해 다양하게 확인해볼 수 있다.

 

그림 1 filament 샘플 프로젝트 material_sandbox

 

렌더링 엔진의 구조를 분석하는 것은 쉬운 일이 아니다. 추상화를 달성하기 위한 상속과 인터페이스 구조에 대한 많은 이해가 필요하고, 성능이 중요한 렌더링 엔진이기 때문에 성능 최적화를 위한 온갖 기술이 녹아있어 이에 대한 충분한 이해도 필요하다. 거기에 각 렌더링 API에 대한 지식도 어느 정도 있어야 왜 이 부분을 이렇게 만들었는지 제대로 이해할 수 있다.

 

 

그래서 필자가 여지껏 이해한 것들을 모두 글로 적어내려면 상당히 많은 분량이 되지 않을까 생각된다.. 심지어 filament는 꾸준히 업데이트가 되고 있는 프로젝트이기 때문에 기껏 적은 포스팅을 수정하거나 보완하는 일도 일어나지 않을까 싶다. 하지만 여지껏 그래왔든 계속하다보면 언젠간 끝이 오지 않을까? 

 

 

다음 글부터는 본격적인 엔진 구조 탐색을 시작할 예정이다. 우선 가볍게 filament의 렌더링 과정이 어떻게 이뤄지고 있는지와 렌더링의 기본이 되는 VertexBuffer의 구조 등을 먼저 알아보도록 하겠다.

 

 

이 글은 Apache License 2.0으로 공개된 Google의 Filament 프로젝트를 참고하여 작성되었습니다. 원본 라이센스 보기