콘텐츠로 이동

Unity 카메라 컬링과 렌더링 최적화

카메라 시야 밖의 오브젝트를 자동으로 렌더링에서 제외합니다. Unity가 기본으로 수행하며, 오브젝트의 Bounds가 View Frustum과 교차하는지 검사합니다.

최적화 포인트: Bounds가 너무 크면 시야 밖에 있어도 렌더링됩니다.

// 커스텀 Bounds로 컬링 범위 조정
var renderer = GetComponent<MeshRenderer>();
renderer.bounds = new Bounds(transform.position, new Vector3(2, 2, 2));
// 수동 Frustum Culling 검사
Plane[] planes = GeometryUtility.CalculateFrustumPlanes(Camera.main);
if (GeometryUtility.TestPlanesAABB(planes, renderer.bounds))
Debug.Log("시야 내");

다른 오브젝트에 가려진 오브젝트를 컬링합니다.

설정:

  1. 오브젝트에 Static → Occluder Static / Occludee Static 체크
  2. Window → Rendering → Occlusion Culling → Bake
// 카메라의 Occlusion Culling 활성화
Camera.main.useOcclusionCulling = true;
// 런타임 결과 시각화 (에디터 전용)
// Scene뷰 → Occlusion 오버레이

대형 실내 맵(복도, 방 구조)에서 특히 효과적입니다.

레이어별로 카메라에서 렌더링 여부를 제어합니다.

// 특정 레이어만 렌더링
Camera.main.cullingMask = LayerMask.GetMask("Default", "Player");
// 특정 레이어 제외
int mask = Camera.main.cullingMask;
mask &= ~LayerMask.GetMask("UI", "Debug");
Camera.main.cullingMask = mask;

UI 카메라 분리 패턴:

// 메인 카메라: UI 레이어 제외
mainCamera.cullingMask &= ~LayerMask.GetMask("UI");
// UI 전용 카메라: UI 레이어만
uiCamera.cullingMask = LayerMask.GetMask("UI");
uiCamera.clearFlags = CameraClearFlags.Depth; // 배경 투명

레이어별로 다른 컬링 거리를 지정합니다.

void SetLayerCullDistances() {
float[] distances = new float[32];
// 기본값: 0 = 메인 카메라 Far Clip Plane 사용
distances[LayerMask.NameToLayer("Foliage")] = 80f; // 풀, 나무 잎
distances[LayerMask.NameToLayer("Debris")] = 40f; // 파편
distances[LayerMask.NameToLayer("Decals")] = 30f; // 데칼
Camera.main.layerCullDistances = distances;
Camera.main.layerCullSpherical = true; // 구형 컬링 (사각형보다 자연스러움)
}

LOD 전환 거리를 전역으로 조정합니다.

// 높을수록 높은 LOD를 더 멀리서 사용
QualitySettings.lodBias = 2.0f; // 기본값 1.0
// 카메라별 설정
Camera.main.fieldOfView = 60f; // FOV가 넓을수록 LOD 전환 빨라짐

오브젝트의 가시성 변화를 감지합니다.

// 화면에 보일 때만 AI 업데이트 실행
public class AIController : MonoBehaviour {
bool _visible = false;
void OnBecameVisible() { _visible = true; }
void OnBecameInvisible() { _visible = false; }
void Update() {
if (!_visible) return;
UpdateAI(); // 보일 때만 실행
}
}
  • Frustum Culling은 자동, Occlusion Culling은 별도 베이크 필요
  • layerCullDistances로 원거리 소품류 레이어는 짧은 컬링 거리 설정
  • UI는 전용 카메라로 분리해 cullingMask 관리
  • OnBecameVisible/Invisible로 보이는 오브젝트만 업데이트
  • lodBias로 전체 LOD 거리를 플랫폼별로 조정