[Unity VR] 성능 한계를 공포 연출로 커버한 라이트맵 최적화 경험

2026. 5. 8. 18:38·Dev Notes/Unity

1. 들어가며

VR 개발에서 프레임레이트는 단순한 성능 지표가 아닙니다. Meta Quest 2의 권장 프레임레이트는 72fps인데, 이를 밑돌면 화면 끊김이 신체적인 불쾌감, 즉 멀미로 직결됩니다.

이 글은 나폴리탄 괴담 장르를 기반으로 제작한 Meta Quest 2용 1인칭 VR 공포 어드벤처 게임 Line 0를 개발하던 중 마주친 프레임 저하 문제를 해결한 과정을 공유합니다. 단순히 성능을 끌어올리는 것에서 그치지 않고, 최적화 과정에서 생긴 한계를 공포 게임의 연출로 커버한 경험이기도 합니다.


2. 문제 상황: 30fps, 멀미가 나는 게임

초기 빌드를 플레이테스트했을 때 프레임레이트가 30fps 언저리에 머물렀습니다. 일반 게임이라면 "조금 버벅이는 수준"으로 넘길 수 있지만, VR에서는 달랐습니다. 헤드셋을 쓴 플레이테스터들이 실제로 멀미를 호소했습니다.

Unity Profiler로 병목을 분석한 결과, 원인은 명확했습니다.

  • 씬 전체에 배치된 실시간 조명의 연산 비용이 매 프레임마다 발생하고 있었습니다.
  • VR은 좌우 눈 각각에 대해 렌더링을 수행하기 때문에, 일반 3D 게임 대비 GPU 부하가 약 2배에 달합니다.
  • 실시간 조명과 VR의 이중 렌더링이 맞물리면서 프레임이 목표치의 절반도 채 되지 않았습니다.

3. 해결 방안 모색

가장 먼저 든 생각은 "조명의 수를 줄이거나 품질을 낮추자"였습니다. 하지만 공포 게임 특성상 조명은 분위기를 결정하는 핵심 요소였고, 단순히 줄이는 것은 게임의 완성도를 떨어뜨리는 선택이었습니다.

결국 방향을 완전히 바꿨습니다. 실시간 연산 자체를 없애고, 조명 결과를 텍스처에 미리 구워버리는 베이크 방식으로 전환하기로 했습니다.

핵심 아이디어는 이것이었습니다. "조명을 실시간으로 계산하는 대신, 미리 계산해서 텍스처에 저장해두자."


4. 라이트맵 베이크 전환 적용

Unity의 Lighting 설정에서 씬의 모든 조명을 100% 베이크 방식으로 전환하고, 라이트맵을 생성했습니다.

Mixed Lighting → Baked Indirect 에서
Baked GI → 100% Baked 로 전환

추가로 텍스처 해상도도 낮춰 GPU 메모리 부담을 줄였습니다.

결과는 기대 이상이었습니다.

항목 전환 전 전환 후
프레임레이트 ~30fps ~72fps
실시간 조명 연산 매 프레임 발생 없음
멀미 호소 있음 없음

5. 새로운 문제: 실시간 그림자가 사라졌다!

성능 문제는 해결됐지만 새로운 문제가 생겼습니다. 베이크된 라이트맵은 조명 결과를 텍스처에 고정시키기 때문에, 오브젝트의 움직임에 반응하는 실시간 그림자 연산이 불가능해집니다. 플레이어나 NPC가 움직여도 그림자가 따라오지 않았습니다.

일반적인 게임이라면 치명적인 단점이었겠지만, 저는 여기서 개발 중인 게임의 장르에 주목했습니다.

이건 공포 게임이다.

공포 게임은 원래 플레이어의 시야를 의도적으로 방해합니다. 어두운 환경, 짙은 안개, 제한된 시야각은 공포 연출의 기본 문법입니다. 그림자가 어색해도, 어두우면 보이지 않습니다.


6. 한계를 연출로 커버하기

실시간 그림자 부재를 숨기기 위해 다음과 같은 연출을 적용했습니다.

  • 베이크된 라이트맵의 전체 명도를 낮춰 씬을 전반적으로 어둡게 처리했습니다.
  • 지하철 역사 특유의 형광등 깜빡임 효과를 추가해 조명이 불안정한 환경임을 자연스럽게 연출했습니다.
  • 안개를 적극적으로 활용해 먼 거리의 그림자 부재가 눈에 띄지 않도록 했습니다.

결과적으로 플레이테스터들은 그림자 부재를 인식하지 못했고, 오히려 어두운 환경이 공포감을 높이는 데 기여했다는 피드백을 받았습니다.


7. 마무리 및 회고

이 경험에서 얻은 가장 큰 교훈은 "기술적 한계가 때로는 연출의 조건이 될 수 있다" 는 점입니다.

실시간 그림자를 포기한 것은 처음엔 명백한 결함처럼 느껴졌습니다. 하지만 장르의 특성을 이해하고 있었기에, 그 한계를 오히려 공포 연출의 도구로 전환할 수 있었습니다. 단순히 문제를 해결하는 것을 넘어, 제약 조건 안에서 최선의 결과를 만들어내는 것이 개발의 본질이라는 것을 다시 한번 느꼈습니다.

프로젝트 전체 코드는 아래 GitHub 레포지토리에서 확인하실 수 있습니다.

GitHub - unity-vr-game-project


8. 참고 자료

  • Unity 공식 문서 - Lightmapping: 라이트맵 베이크의 기본 개념과 Unity에서의 설정 방법.
    https://docs.unity3d.com/Manual/Lightmappers.html
  • Unity 공식 문서 - VR Performance Optimization: Meta Quest 환경에서의 VR 성능 최적화 가이드.
    https://docs.unity3d.com/Manual/xr-performance-optimization.html
  • Meta Quest Developer Docs - Performance Guidelines: Quest 2의 권장 프레임레이트 및 GPU 최적화 기준.
    https://developer.oculus.com/documentation/unity/unity-perf/

'Dev Notes > Unity' 카테고리의 다른 글

[Shadertoy] Shadertoy 입문 — 브라우저에서 시작하는 실시간 셰이더 개발  (0) 2026.05.11
'Dev Notes/Unity' 카테고리의 다른 글
  • [Shadertoy] Shadertoy 입문 — 브라우저에서 시작하는 실시간 셰이더 개발
lalunru
lalunru
머릿속에 흩어진 생각들을 글로 정리하며 성장합니다.
  • lalunru
    lalunru.blog
    lalunru
  • 전체
    오늘
    어제
    • 분류 전체보기 (11)
      • Dev Notes (5)
        • Frontend (3)
        • Unity (2)
      • Projects (6)
        • Unity (3)
        • Frontend (1)
        • Machine learning (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
    • Portfolio
  • 공지사항

  • 인기 글

  • 태그

    MSW
    navmesh
    공포게임
    셰이더토이
    tailwindcss
    다중엔딩
    프론트엔드
    shap
    Meta Quest 2
    트러블슈팅
    컴포넌트설계
    XR Interaction Toolkit
    ToonShading
    c#
    프래그먼트셰이더
    react
    websocket
    Meta Quest
    셰이더
    Shadertoy
    glsl
    zustand
    NPR
    TypeScript
    악성URL
    포트폴리오
    VR
    Unity
    STOMP
    피처엔지니어링
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
lalunru
[Unity VR] 성능 한계를 공포 연출로 커버한 라이트맵 최적화 경험
상단으로

티스토리툴바