LOD(Level Of Detail)와 오쿨루전 컬링(Occlusion Culling)에 대해

옙권·2025년 4월 8일

특강에서 배운 LOD와 오쿨루전 컬링에 대해 새로 알아봤다.

LOD (Level Of Detail)

LOD는 3D 모델 디테일 자동 시스템으로

카메라와 오브젝트 간의 거리가 얼마나 멀리 있는지에 따라 해상도의 메시를 자동으로 선택해서 렌더링하는 기술이라 배웠다.

즉 "멀리 있는 건 대충 보여도 된다"는 식이다.

EX)

가까이 있으면 고해상도 모델 (디테일 많음)

멀리 있으면 저해상도 모델 (디테일 적음)

쓰는 이유
→ 멀리 있는 건 어차피 잘 안 보이니까, 디테일을 줄여서 렌더링 성능을 아끼는 거다.

스크립트 제어 방법

public class LODController : MonoBehaviour
{
    private LODGroup lodGroup;

    void Start()
    {
        lodGroup = GetComponent<LODGroup>();
    }

    void Update()
    {
        //거리에 따라 수동으로 LOD 바꾸기
        float distance = Vector3.Distance(Camera.main.transform.position, transform.position);

        if (distance > 50f)
        {
            // 강제로 가장 낮은 LOD로
            lodGroup.ForceLOD(2); // LOD2
        }
        else if (distance > 20f)
        {
            lodGroup.ForceLOD(1); // LOD1
        }
        else
        {
            lodGroup.ForceLOD(0); // LOD0 (해상도 높은 거)
        }
    }
}

오쿨루전 컬링 (Occlusion Culling)

오쿨루전 컬링(Occulusion Culling)은 다른 오브젝트에 가려 카메라에 보이지 않는 오브젝트의 렌더링을 비활성화하는 기능이라 배웠다.

즉, '안 보이는 건 렌더링 안 해도 된다'는 식이다

ex)
건물 뒤에 있는 나무 → 카메라에 안 보이면 렌더링 안 함

왜 쓸까?

유저는 안 보이는데 GPU가 열심히 그리면 손해니까 보이는 것만 렌더링해서 성능을 아끼는 것이다.

스크립트 제어
예시) 카메라 설정을 통한 제어

public class OcclusionControl : MonoBehaviour
{
    private Camera cam;

    void Start()
    {
        cam = Camera.main;

        // 오쿨루전 컬링 켜기 (기본값 true)
        cam.useOcclusionCulling = true;
    }

    void Update()
    {
        // 키보드로 껐다켰다
        if (Input.GetKeyDown(KeyCode.O))
        {
            cam.useOcclusionCulling = !cam.useOcclusionCulling;
        }
    }
}

0개의 댓글