특강에서 배운 LOD와 오쿨루전 컬링에 대해 새로 알아봤다.
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 (해상도 높은 거)
}
}
}
오쿨루전 컬링(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;
}
}
}