Unity의 Occlusion Culling(오클루전 컬링) 은 성능 최적화 기법 중 하나로, 카메라에서 보이지 않는 오브젝트(가려진 오브젝트)를 렌더링하지 않도록 하여 불필요한 연산을 줄이는 기술입니다. 이는 특히 복잡한 씬이나 실내 환경 등에서 성능 향상에 매우 유용합니다.
아래에 Occlusion Culling에 대한 개념과 구현 절차를 단계별로 정리했습니다.
🧠 Occlusion Culling 개요
- Frustum Culling: 기본적으로 Unity는 카메라 뷰 프러스텀(Frustum) 밖에 있는 오브젝트는 렌더링하지 않습니다.
- Occlusion Culling: 카메라 뷰 안에 있지만 다른 오브젝트에 가려져 실제로 보이지 않는 오브젝트도 렌더링하지 않도록 막아줍니다.
- 장점:
- 불필요한 드로우콜 제거
- CPU 및 GPU 부하 감소
- 씬 복잡도가 높을수록 효율 극대화
🛠️ Unity에서 Occlusion Culling 구현 순서
1. Static 설정
Occlusion Culling은 움직이지 않는 정적인 오브젝트에만 적용됩니다.
- Hierarchy에서 오브젝트 선택
- Inspector → Static 체크박스 활성화
- 드롭다운에서 Occluder Static, Occludee Static 선택
- Occluder Static: 다른 오브젝트를 가릴 수 있는 오브젝트
- Occludee Static: 다른 오브젝트에 의해 가려질 수 있는 오브젝트
일반적으로 모든 Static 오브젝트에 대해 이 둘을 모두 체크하는 것이 좋습니다.
2. Occlusion 영역 설정 (선택 사항)
Occlusion Area 컴포넌트를 사용하면 특정 영역에서 오클루전 컬링의 계산을 세밀하게 설정할 수 있습니다.
- GameObject → 3D Object → Occlusion Area 추가
- 필요한 위치 및 크기로 조정
- Inspector에서 설정값 조절
3. Occlusion 데이터 베이킹 (Bake)
오클루전 컬링은 미리 데이터를 계산해 저장해야 하므로 Bake 과정이 필요합니다.
- Window → Rendering → Occlusion Culling 창 열기
- Bake 탭 선택
- Bake 버튼 클릭
- Unity가 씬 전체를 스캔하여 Occluder/Occludee 정보를 기반으로 데이터를 생성
- 해당 씬을 저장해야 Bake 작업이 정상 작동함
4. Play 모드에서 확인
- Scene 창 → Camera View 선택 후 Play 모드 실행
- Scene 창에서 Visualization 탭 선택 → View Volumes 또는 Visibility Lines 확인
- Stats 창(Shift + Ctrl + Alt + S) 을 통해 드로우콜 수 변화 확인
🧪 팁 및 주의사항
- 동적 오브젝트(Movable)는 Occlusion Culling 대상이 아님
- 해당 오브젝트는 Visibility 체크가 되지 않음
- Bake는 씬마다 별도로 진행
- 씬 구조가 열려있거나, 전면적으로 보이는 구조면 효과가 미미할 수 있음
- URP/HDRP 사용 시에도 기본적으로 작동하지만, Renderer Feature에 따라 예외 발생 가능
✅ 요약
항목 설명
대상 | 정적(Static) 오브젝트만 적용 |
설정 방법 | Static 체크 + Occluder/Occludee 설정 |
성능 이점 | 불필요한 렌더링 제거, GPU 부하 감소 |
필수 단계 | Bake 과정 필요 |
디버깅 | Occlusion 창의 Visualization 탭에서 확인 가능 |
🧪 Occlusion Culling 데모 씬 구성 가이드
📁 1. 프로젝트 설정
- Unity 버전: 2020.3 이상 (권장: 2022.3 LTS)
- 렌더링 파이프라인: Built-in, URP, HDRP 모두 사용 가능
🧱 2. 씬 구성 예시
오브젝트 설명 설정
Main Camera | 플레이어 시점 | 기본 설정 유지 |
Directional Light | 광원 | 기본 설정 유지 |
Plane (바닥) | 바닥 역할, Occluder | Static → Occluder, Occludee 체크 |
Cube (벽) | 카메라 앞 벽 역할, Occluder | Static 설정 |
Sphere | 벽 뒤에 숨겨진 오브젝트 (Occludee) | Static 설정 |
벽(Cube)이 Sphere를 가리면, 카메라에서는 Sphere가 렌더링되지 않음.
⚙️ Static 설정 자동화 스크립트
씬 내 오브젝트들을 자동으로 Occluder와 Occludee로 설정하는 스크립트를 만들어 보세요:
using UnityEditor;
using UnityEngine;
public class OcclusionStaticSetter : MonoBehaviour
{
[MenuItem("Tools/Set Occlusion Static")]
static void SetOcclusionStatics()
{
GameObject[] allObjects = FindObjectsOfType<GameObject>();
foreach (GameObject obj in allObjects)
{
if (obj.GetComponent<Renderer>() != null)
{
GameObjectUtility.SetStaticEditorFlags(obj, StaticEditorFlags.OccludeeStatic | StaticEditorFlags.OccluderStatic);
Debug.Log($"Set Static for: {obj.name}");
}
}
Debug.Log("✅ Occlusion Static 설정 완료!");
}
}
사용 방법:
- 위 스크립트를 Editor 폴더에 저장
- Unity 상단 메뉴 → Tools → Set Occlusion Static 클릭
- 모든 Renderer가 포함된 오브젝트에 Static 설정 자동 적용
🧪 테스트 및 시각화
- Window → Rendering → Occlusion Culling 열기
- Bake 탭에서 Bake 클릭
- Scene 창에서 Visualization → Visibility Lines 활성화
- Play 모드로 실행 후 Scene 창에서 라인 확인
📦 Occlusion Culling 데모 패키지 구성
🔹 1. 씬 파일 (OcclusionDemo.unity)
단순한 구조의 테스트 씬으로, 아래 오브젝트들이 포함되어 있습니다:
오브젝트 이름 설명 Static 설정
Main Camera | 씬 관찰용 카메라 | ❌ |
Directional Light | 광원 | ❌ |
Plane | 바닥 역할, 크기: (10, 1, 10) | ✅ Occluder & Occludee |
Wall_Cube | 정면을 가리는 큐브 (카메라 시야 차단) | ✅ Occluder |
Hidden_Sphere | 큐브 뒤에 숨은 구체 | ✅ Occludee |
➡ Occlusion Culling이 적용되면 Wall_Cube 뒤에 있는 Hidden_Sphere는 카메라 시야에서 보이지 않기 때문에 렌더링되지 않음
🔹 2. Static 설정 스크립트 (OcclusionStaticSetter.cs)
이 스크립트는 상단 메뉴에서 실행하면 자동으로 씬 내 모든 적합한 오브젝트에 Static 설정을 적용해 줍니다.
// Assets/Editor/OcclusionStaticSetter.cs 위치
using UnityEditor;
using UnityEngine;
public class OcclusionStaticSetter : MonoBehaviour
{
[MenuItem("Tools/Set Occlusion Static")]
static void SetOcclusionStatics()
{
GameObject[] allObjects = FindObjectsOfType<GameObject>();
foreach (GameObject obj in allObjects)
{
if (obj.GetComponent<Renderer>() != null)
{
GameObjectUtility.SetStaticEditorFlags(obj,
StaticEditorFlags.OccludeeStatic | StaticEditorFlags.OccluderStatic);
}
}
Debug.Log("✅ Static 설정 완료");
}
}
🔹 3. 사용법 요약
- Unity에서 .unitypackage 임포트
- 씬 열기: OcclusionDemo.unity
- 메뉴에서 Tools → Set Occlusion Static 실행
- Window → Rendering → Occlusion Culling 열기
- Bake 탭에서 Bake 클릭
- Scene 뷰에서 Visualization → Visibility Lines 활성화
- Play 모드로 확인 → 벽 뒤 오브젝트가 렌더링 제외되는지 확인