컴퓨터 그래픽스 - LOD (Level Of Detail)
컴퓨터 그래픽스에서 가장 근본적으로 추구하는 것은 최종적으로 렌더링되는 장면의 품질이다.
어떻게 하면 우리가 의도한 것을 그대로 화면에 표현할 수 있는지 혹은 얼마나 더 자연스럽고 사실적으로 표현할 수 있는가에 대한 탐구가 컴퓨터 그래픽스의 근본적 목적이다.
하지만, 우리의 하드웨어는 한계가 있다. 가상의 공간에 현실과 유사하게 렌더링 할 수 있는 기술은 이미 수십년 전부터 마련이 되어 있었지만, 현재 까지도 하드웨어는 그 연산을 모두 감당할 수 없는 상태이다.
이러한 문제로 인해, 그래픽스 분야에선 다양한 최적화 기법이 연구되고 있지만 당연하게도 최적화 기법을 적용하게 되면 어느정도의 품질 손상을 감수해야만 한다.
가능한 품질의 손상을 적게 하면서 높은 수준의 최적화를 이룰 수 있는 방법으로 고안된 최적화 기법 중 가장 대표적인 것이 LOD이다.
LOD (Level Of Detail)
LOD란, 이름 그대로 디테일의 정도를 조절하는 기능이다.
그래픽스에서 최적화를 달성하는 방법은 크게 두 가지가 있다.
하나는 드로우 콜을 줄이는 것이고, 하나는 렌더링되는 폴리곤을 줄이는 것이다.
LOD는 후자에 속한다. 렌더링이 되는 매쉬의 폴리곤을 줄이는 것이다.
그런데, 폴리곤을 무작정 줄이면 오브젝트의 모양이 상당히 부자연스럽게 보일 것이다.
아래 사진을 보자.
언리언 엔진의 기능을 사용하여, LOD를 적용한 것이다.
왼쪽은 원본 그대로이고, 오른쪽은 폴리곤의 수를 줄인 채로 렌더링한 것이다.
상당히 부자연스럽고 뾰족하게 렌더링된 것을 볼 수 있다.
이렇게 렌더링하면, 최적화 부분에서야 당연히 이점이 있겠지만 렌더링 퀄리티가 너무 처참하게 낮아진다.
그럼에도 불구하고 LOD를 쓰는 이유는 뭘까?
아래 사진도 한 번 보자.
이번엔, 조금 멀리서 오브젝트를 렌더링하였다. 가까이 봤을 때랑 비교했을 때, 차이가 느껴지지 않는다.
주변에 배경이 깔리고 여러가지 효과가 적용되면 사실상 차이를 느끼지 못할 것이다.
폴리곤의 개수를 줄이면, 가까이서 봤을 땐 매쉬의 모양이 상당히 부자연스럽게 렌더링된다.
하지만, 멀리서 본다면 제대로 렌더링 했을 때와 그렇게 큰 차이를 느낄 수가 없다.
그렇다면, 멀리서 볼 땐 폴리곤의 개수를 줄이는 것이 좋은게 아닐까?
LOD는 이런 개념에서 시작된 것이다. 오브젝트가 멀어지거나 작아질수록 디테일하게 렌더링되지 못한다.
그러므로, 폴리곤을 줄이거나 텍스쳐의 해상도를 낮춰도 거의 티가 나지 않는다.
이처럼, 거리 등을 기준으로 폴리곤의 개수를 유동적으로 줄였다 늘렸다 하는 기술이 LOD이다.
폴리곤의 개수가 10만개인 매쉬를 화면에 렌더링한다고 해보자.
그런데, 오브젝트가 아주 멀리있어서 거의 점처럼 보이는 상황이라면, 폴리곤을 무식하게 2~3개로 줄여버려도 큰 차이를 느끼지 못할 것이다. LOD를 사용하면, 10만개의 폴리곤을 2~3개로 만들어버릴 수도 있는 것이다. (실제로는 이렇게 극단적으로 줄이는 경우는 거의 없을 것이다.)
거리 기반 LOD, 면적 기반 LOD
LOD는 어떤 기준에 따라 폴리곤을 줄이고 늘리는 기법이다.
그 기준이 되는 것은 보통 거리와 면적이 있다.
거리란, 카메라의 위치를 기준으로 물체가 얼마나 멀리있느냐를 기준으로 하는 것이다.
오브젝트가 충분히 멀리있다면 폴리곤의 수를 기존보다 줄이고 충분히 가깝다면 원래의 폴리곤으로 렌더링을 하는 것이다.
거리 기반 LOD는 면적 기반에 비해 연산이 상대적으로 가볍지만, 한 가지 문제가 있다.
거리로 봤을 때는 멀리 있지만, 실제로는 화면에 크게 렌더링되는 경우가 있다.
뒤 쪽의 황금 나무를 보자.
실제로는 카메라와 거리가 상당히 먼 곳에 위치하고 있지만, 그 크기가 매우 커서 화면에 아주 크게 렌더링되고 있다.
LOD는 어쨋든, 화면에서 잘 눈에 안띄어서 폴리곤의 수를 줄여도 시각적 경험의 차이가 적도록 하는 것이 목적이다.
그런데, 저렇게 크게 렌더링되고 있는 대상의 폴리곤을 무작정 줄여버리면 부자연스럽게 보일 수도 있을 것이다.
반면, 거리는 가까이 있지만 크기가 작아 디테일하게 표현할 필요가 없는 대상을 디테일하게 렌더링하는 경우도 있을 수 있다.
이 때문에, 거리 기반 LOD의 경우 상황에 따라 렌더링 품질이 감소하거나, LOD를 제대로 적용하지 못해 최적화를 달성하지 못하는 문제가 발생할 수 있다.
면적 기반 LOD는 물체가 화면에서 얼마나 차지하는 가를 기준으로 LOD를 적용한다. 화면에서 실제로 렌더링되고 있는 크기를 기준으로 폴리곤의 수를 조절하기 때문에, 거리 기반 LOD에 비해 렌더링 품질을 더 보존할 수 있다는 장점이 있다.
다만, 면적을 계산하는 과정을 CPU에서 진행해야 하기 때문에 CPU에 부하를 줄 수 있다는 단점이 있다.
거리 기반 LOD | 면적 기반 LOD |
거리를 기준으로 LOD 단계를 조절한다. | 투영 면적을 기준으로 LOD 단계를 조절한다. |
LOD의 효율이 상대적으로 낮다. | LOD의 효율이 상대적으로 높다. |
CPU에 부하를 주는 정도가 상대적으로 적다. | CPU에 부하를 주는 정도가 상대적으로 높다. |
*LOD 단계 : 폴리곤의 수를 얼마나 줄일지 단계를 나누어 LOD를 적용한다.
*LOD 효율 : 렌더링 품질을 얼마나 보존할 수 있는가
Static LOD, Dynamic LOD
LOD란, 특정 기준에 따라 렌더링 되는 폴리곤의 수를 조절하는 것이라고 하였다.
폴리곤의 수를 조절하는 방법은 크게 두 가지로 분류된다.
static LOD는 디자이너가 매쉬를 만들 때, LOD단계에 따라 여러 개의 매쉬를 만들어 놓는 것이다.
하나의 파일(Fbx, Obj 등등)에 LOD단계에 따라 달라지는 버텍스의 정보가 미리 저장되어 있기 때문에 빠르게 런타임에 LOD단계를 조절할 수 있다. 다만, 미리 만들어 놓는다는 것은 그만큼 메모리 사용량이 많아진다는 뜻이다.
static LOD는 런타임 성능에 영향을 크게 미치지 않지만, 메모리를 많이 사용하게 되며 로딩 시간이 길어질 수 있다.
dynamic LOD는 버텍스의 수를 CPU연산을 통해 런타임에 조절하는 것이다. dynamic LOD는 LOD 단계에 따른 버텍스의 수를 미리 저장해놓지 않기 때문에, 메모리 사용량이 적지만 런타임 성능에 영향을 줄 수 있다는 단점이 있다.
dynamic LOD는 한 가지 장점이 더 있는데, static LOD는 LOD단계에 따른 폴리곤의 수가 미리 정해져 있기 때문에 LOD단계가 바뀔 때, 이전 단계와의 차이에 따라 유저가 급격한 변화를 느낄 수가 있다. 반면, dynamic LOD는 유동적으로 폴리곤의 수를 조절할 수 있기 때문에 상대적으로 변화를 느끼는 정도가 적다는 장점이 있다.
Popping
Popping란, LOD 단계가 변할 때 유저가 급격한 차이를 느끼는 현상이다. 만약, LOD가 변하는 특정 거리 근처에서 계속 왔다갔다 하게 되면 오브젝트가 계속 변하는 것을 확인할 수 있을 것이다.
위의 영상은 유튜브에서 발견한 LOD Popping 영상이다. 동영상을 보면, 오브젝트가 거리에 따라 변화하는 것을 볼 수 있는데, 이러한 문제를 Popping이라고 한다.
이를 해결하기 위해 LOD단계간의 폴리곤 개수나 위치 등을 보간하면서 자연스럽게 보이도록 하는 연산을 활용하기도 한다고 한다.