게임 Hacker News · 5일 전

"무제한 렌더링인 줄 알았는데…" 언리얼 엔진 3D 스플랫 개발자의 현실적인 삽질기

핵심 요약
  • 언리얼 엔진의 GPU Scene이 가진 1,600만 개 인스턴스 제한 때문에 대규모 3D 가우시안 스플랫 렌더링이 깨지는 문제를 겪었습니다.
  • GPU Scene을 우회해 커스텀 버텍스 팩토리와 간접 드로(Indirect Draw) 파이프라인을 구축해 3,000만 개 이상을 렌더링하는 데 성공했습니다.
  • 하지만 드로 콜 제한을 풀자마자 실제 캡처 데이터의 막대한 VRAM 메모리 부족 한계에 부딪혀 결국 LOD 시스템 구현 단계로 넘어가게 되었습니다.
요약 언리얼 엔진에서 3D 가우시안 스플래팅(Gaussian Splatting) 렌더러를 개발하던 그래픽 엔지니어가 겪은 현실적인 삽질기와 최적화 과정이 개발자 커뮤니티에서 관심을 모았습니다. 작성자는 이전에 언리얼의 인스턴스 렌더링을 활용해 '무제한 스플랫 렌더링이 가능하다'고 호기롭게 발표했으나, 실제로는 숨겨진 1,600만 개(16M) 인스턴스 제한이라는 한계에 부딪혔다고 고백했습니다. 언리얼 엔진의 'GPU Scene'은 메쉬 인스턴스 수천 개 수준에 맞춰져 있어 단일 에셋당 약 1,600만 개를 넘어가면 렌더링이 깨지고 뷰포트에 에러가 출력되는 구조였습니다. 이를 해결하기 위해 작성자는 GPU Scene 등록을 완전히 우회하고, 고전적인 'DrawIndexedInstancedIndirect' 방식과 커스텀 버텍스 팩토리(Vertex Factory)를 활용한 간접 인스턴스 드로 파이프라인으로 전환했습니다. 스플랫 데이터를 텍스처에 보관하고 버텍스 셰이더 단계에서 쿼드를 절차적으로 생성하면서 프러스텀 컬링(Frustum Culling)까지 GPU에서 직접 처리하도록 설계해 3,000만 개 이상의 스플랫도 문제없이 렌더링하는 데 성공했습니다. 하지만 인스턴스 개수 한계를 뚫자마자 곧바로 'VRAM 메모리 한계'라는 더 큰 벽을 마주했습니다. 스플랫 하나당 데이터 용량을 약 32바이트까지 극한으로 압축했음에도 불구하고, 실제 환경을 초고해상도로 캡처한 방대한 씬 전체를 VRAM에 상주시키는 것은 하드웨어 용량상 불가능했습니다. 결국 전체 씬을 메모리에 한 번에 올릴 수 없다는 문제를 해결하기 위해, 작성자는 카메라 시점에 맞춰 필요한 부분만 선별해 로딩하고 표현하는 LOD(Level of Detail) 스트리밍 시스템 구축이라는 다음 과제로 넘어가게 되었다고 전했습니다.
Sponsored · 광고