3D 가우시안 스플래팅(3DGS)을 게임에 적용할 때 고려할 점
3D 가우시안 스플래팅의 렌더링 특성과 파일 압축, 충돌 프록시, 동적 조명 연동을 살펴보고 게임 프로토타입에서 검증할 설계 선택지를 정리합니다.

3D 가우시안 스플래팅(3DGS)을 게임 개발에서 검토할 때
3D 가우시안 스플래팅(3D Gaussian Splatting, 이하 3DGS)은 2023년에 발표된 장면 표현·렌더링 기법이다. 원 논문은 미분 가능한 3D 가우시안 표현과 타일 기반 래스터라이저를 제안했고, 1080p에서 실시간 렌더링을 보고했다. 실제 프레임률은 장면, 해상도, GPU와 구현에 따라 달라지므로 특정 수치를 모든 프로젝트에 적용할 수는 없다.
3DGS를 게임의 상호작용 공간으로 활용하는 방법은 연구와 프로토타입에서 검토되고 있다. 아래 충돌·조명 연동은 특정 스튜디오 사례를 재현하는 설명이 아니라 프로젝트에서 검증할 수 있는 설계 선택지다. 스캔은 시각적 배경 제작을 줄일 수 있지만, 충돌용 메시, 애니메이션, 게임플레이 로직과 최적화 작업을 없애지는 않는다.

3DGS를 게임 프로토타입에 적용할 때 고려할 점
3DGS는 위치와 모양, 불투명도, 시점에 따른 색상을 담은 가우시안들의 집합으로 장면을 표현한다. 메시 표면을 직접 저장하는 방식과 다르므로 메시 기반 게임 기능과 함께 쓸 때는 별도 데이터나 구현이 필요한지 확인해야 한다.
1. 콜리전(Collision) 및 물리 연산 부재 극복
가우시안 스플랫은 메시 표면을 직접 저장하는 형식이 아니므로, 렌더링 데이터만으로 전통적인 메시 콜라이더를 바로 구성할 수는 없다. 캐릭터의 보행·충돌에는 별도 콜라이더나 파생 프록시가 필요하다.
프로젝트별로 검토할 수 있는 접근법은 다음과 같다. 아래는 특정 인디 스튜디오가 실제 사용한다고 확인된 기법 목록이 아니라 설계 예시다.
- 파생 프록시 메시: 장면 재구성 연구에서 사용되는 깊이·법선 정보와 표면 추출 기법을 이용해 단순화한 충돌 메시를 만들 수 있다. 결과의 빈틈과 오차를 검사하고 게임플레이에 맞게 수작업 보정해야 한다.
- 화면 공간 깊이 질의: 렌더링 깊이 버퍼로 시점에 보이는 표면을 근사할 수 있지만, 카메라에 보이지 않는 면이나 안정적인 물리 충돌을 대신하지는 않는다. 용도와 오차 한계를 제한한 별도 효과에 적합한지 프로토타입에서 평가한다.
2. 메모리 폭증과 VRAM 한계 극복 (SOG 및 SPZ 압축)
원 논문의 일반적인 RGB 구면 조화 함수 표현에서 3차 SH까지 저장하면 위치 3개, 척도 3개, 회전 4개, 불투명도 1개, SH 계수 48개로 float32 값이 총 59개(236바이트)다. 따라서 500만 개를 이 배열만으로 저장해도 약 1.18GB(십진 단위)가 필요하며, 정렬 패딩·렌더링 버퍼·인덱스 등은 별도다. 실제 파일 포맷과 런타임 표현에 따라 메모리 사용량은 달라진다.
파일 크기를 줄이는 포맷 예로 PlayCanvas의 SOG(Spatially Ordered Gaussians)와 Niantic의 SPZ가 있다. 이들은 저장·전송 포맷이며, 압축 파일 크기 감소가 그대로 같은 비율의 런타임 VRAM 절감이나 자동 스트리밍 LOD를 뜻하지 않는다. 런타임 메모리는 디코딩된 표현과 엔진의 버퍼 구성으로 별도 측정해야 한다.
3. 동적 조명(Dynamic Lighting)과 재조명 연구
일반적인 3DGS 장면은 촬영 당시의 조명과 외관을 색상 및 시점 의존 표현에 담으며, 물리 기반 재질과 별도 광원 파라미터를 메시처럼 직접 제공하지 않습니다. 따라서 추가적인 재조명 기법을 구현하지 않으면 게임 내 밤낮 변화나 동적 광원(포인트 라이트, 플래시라이트)에 자연스럽게 반응한다고 기대하기 어렵습니다.
연구에서는 가우시안의 공분산이나 추가 깊이·법선 정보를 표면 방향의 근사치로 사용하는 방법을 다룬다. 예를 들어 DN-Splatter 연구는 깊이·법선 단서를 활용한다. 짧은 공분산 축을 법선으로 보는 것은 근사이며, 모든 장면에서 정확한 표면 법선은 아니다. 이런 입력을 이용해 별도 조명을 합성하는 것은 연구·프로토타입 선택지이지, 일반적인 인디 제작 파이프라인으로 확인된 기술은 아니다.

3DGS 기반 실시간 게임 플레이 파이프라인 Architecture
다음 다이어그램은 스캔 데이터부터 엔진 연동까지 가능한 프로토타입 흐름을 나타낸다. 프록시 메시 생성과 검증은 프로젝트별 구현이 필요하다.
flowchart TD
A[현실 공간 촬영 및 포토그래메트리 데이터 수집] --> B[3DGS 학습 및 PLY 파일 생성]
B --> C[SuperSplat / splat-transform 기반 데이터 정제]
subgraph Data Optimization
C --> D1[Vector Quantization & SPZ/SOG 압축]
C --> D2[선택적 연구·프로젝트별 Proxy Mesh 추출]
end
D1 --> E[Unity / UE5 3DGS Render Pipeline]
D2 --> F[Physics Engine Invisible Collider Layer]
subgraph Realtime Game Engine Loop
E --> G[Compute Shader Tile Sorting & Rasterization]
F --> H[RigidBody Collision & NavMesh Generation]
G --> I[선택적 실험용 동적 조명 합성]
end
H --> J[Final Gameplay Output & Interaction]
I --> J
주요 게임 엔진별 구현 기술 및 인디 생태계 도구 분석
Unity 생태계: UnityGaussianSplatting 프로젝트
Unity용 공개 프로젝트 aras-p/UnityGaussianSplatting은 3DGS 렌더링 구현을 살펴볼 수 있는 참고 자료다. 특정 프로젝트의 채택률이나 성능 향상을 뜻하지 않으며, 사용 시에는 저장소의 Unity 버전·라이선스·하드웨어 조건을 확인한다.
Unreal Engine: 플러그인별 호환성 확인
Unreal Engine에서 3DGS를 쓰려면 플러그인별 지원 버전, 렌더링 경로, 그림자·조명 호환성을 확인해야 한다. Niagara, Lumen, Nanite와의 연동 여부는 플러그인과 렌더링 경로에 따라 다를 수 있으므로, 지원 여부를 제품 기능으로 단정하지 않는다. 각 플러그인의 문서와 샘플 프로젝트로 필요한 기능을 직접 검증한다.
실시간 게임 플레이 요소를 위한 데이터 구조 및 C# 구현 예시
다음 예시는 Unity 6.0 API와 Unity.Collections 패키지를 사용하는 C# 골격으로, 스플랫 중심점의 축 정렬 바운드를 계산한다. 입력 위치와 BoxCollider가 브리지 오브젝트의 로컬 좌표라고 가정하며, 가우시안의 척도·회전·공분산은 반영하지 않으므로 실제 표면이나 정밀 충돌 범위가 아니라 단순 영역 근사다. GaussianSplatData 역시 전체 SH 데이터를 담는 렌더러 포맷이 아니다.
using System.Runtime.InteropServices;
using UnityEngine;
using Unity.Collections;
[StructLayout(LayoutKind.Sequential)]
public struct GaussianSplatData
{
public Vector3 position;
public Vector3 scale;
public Quaternion rotation;
public Color32 color;
public float opacity;
}
public class GaussianGameplayBridge : MonoBehaviour
{
[SerializeField] private BoxCollider proxyColliderPrefab;
private NativeArray<GaussianSplatData> splats;
private Bounds sceneBounds;
private BoxCollider proxyCollider;
public void InitializeSplatGameplayProxy(GaussianSplatData[] loadedSplats)
{
if (loadedSplats == null || loadedSplats.Length == 0) return;
if (splats.IsCreated)
{
splats.Dispose();
}
splats = new NativeArray<GaussianSplatData>(loadedSplats, Allocator.Persistent);
sceneBounds = CalculateSplatBounds(splats);
// 스플랫 분포 기반 자동 경계 콜라이더 설정
if (proxyCollider == null)
{
proxyCollider = Instantiate(proxyColliderPrefab, transform);
}
proxyCollider.center = sceneBounds.center;
proxyCollider.size = sceneBounds.size;
proxyCollider.isTrigger = false;
Debug.Log($"3DGS Proxy Initialized: Total Splats = {splats.Length}, Bounds Center = {sceneBounds.center}");
}
private Bounds CalculateSplatBounds(NativeArray<GaussianSplatData> splatsData)
{
if (splatsData.Length == 0) return new Bounds();
Vector3 min = splatsData[0].position;
Vector3 max = splatsData[0].position;
for (int i = 1; i < splatsData.Length; i++)
{
Vector3 pos = splatsData[i].position;
min = Vector3.Min(min, pos);
max = Vector3.Max(max, pos);
}
Bounds bounds = new Bounds();
bounds.SetMinMax(min, max);
return bounds;
}
private void OnDestroy()
{
if (splats.IsCreated)
{
splats.Dispose();
}
}
}
차세대 인디 게임 생태계에서 3DGS가 가져올 미래와 시사점
3DGS는 스캔 기반 장면을 게임에 활용하는 실험적 선택지다. 실제 프로젝트에서는 시각 품질뿐 아니라 메모리, 충돌 프록시, 애니메이션, 조명 일관성, 대상 하드웨어 성능을 함께 검증해야 한다.
동적 변형이나 절단을 포함하려면 선택한 데이터 포맷과 플러그인이 해당 기능을 지원하는지 확인해야 한다. 파괴·유체 표현을 목표로 한다면 필요한 동작을 제공하는 별도 시스템과 성능을 먼저 검증한다.




