Voxel OcclusionCulling

LJM·2024년 4월 7일
0

GameDev

목록 보기
2/5

https://procworld.blogspot.com/2013/05/covering-sun-with-finger.html
번역

실시간 그래픽에서 가장 오래된 최적화는 보이지 않는 것을 렌더링하지 않는 것입니다. 현업에 종사하지 않는 사람들에게 이 점을 설명하면 보통 어깨를 으쓱하며 "어, 셜록"이라는 식으로 말합니다.

말처럼 쉽지는 않죠. 사실 대부분은 아주 쉽습니다. 모든 그래픽 책에서 볼 수 있는 첫 번째 비결은 시야 안에 있는 것만 렌더링하는 것입니다. 장면이 카메라를 완전히 둘러싸고 있지만 카메라는 그 중 좁은 부분만 캡처합니다. 일반적으로 수평을 따라 90도인 이 슬라이스 밖의 모든 것은 렌더링할 필요가 없습니다. 대부분 수평인 씬의 경우 360도 중 90도만 렌더링하면 됩니다. 이 간단한 최적화를 통해 씬의 복잡성이 4배나 줄어듭니다. 다시 말해, 이제 성능 저하 없이 4배 더 많은 디테일을 구현할 수 있습니다. 이 기술을 프러스텀 컬링이라고 합니다.

프러스텀 컬링은 씬에 흩어져 있는 작은 오브젝트에는 쉽게 사용할 수 있습니다. 씬의 복잡성이 증가하면 가능한 한 많은 오브젝트를 일괄 처리해야 합니다. 최근에는 공격적인 일괄 처리의 필요성이 다소 완화되었지만 여전히 일괄 처리가 필요하다는 것은 의심의 여지가 없습니다. 이는 프러스텀 컬링과 상반됩니다. 시야에 일부만 있는 전체 배치가 있다면 어떨까요? 여전히 모든 것을 렌더링해야 합니다. 따라서 배치가 렌더링해야 하는 씬 슬라이스와 어떻게든 호환되지 않는 한 배치가 많을수록 프러스텀 컬링 최적화에서 더 많이 벗어날 수 있습니다. 자세한 내용은 나중에 설명하겠습니다.

시야 밖의 모든 정보를 완벽하게 컬링할 수 있었다고 해도 일반적으로 씬에서 렌더링되는 폴리곤 중에는 화면에 픽셀로 표시되지 않는 것이 많습니다. 이는 나중에 더 가까운 폴리곤에 의해 가려지기 때문입니다.

뒤에 계곡이 있는 거대한 산이 있다고 상상해 보세요. 산이 없다면 계곡이 보일 것입니다. 산이 앞에 있으면 계곡을 표현하기 위한 모든 노력이 물거품이 됩니다. 어떻게든 이 계곡을 건너뛸 수 있다면 렌더링 작업을 많이 줄일 수 있을 것입니다. 훨씬 더 멋진 산을 만들 수 있겠죠.

이 기술을 오클루전 컬링이라고 합니다. 최종 렌더링은 실제로 보이는 것과 보이지 않는 것을 궁극적으로 테스트하는 것이기 때문에 원칙적으로 어려운 문제입니다. 당연히 일종의 근사치나 모델을 사용해야 합니다. 장면의 더 간단한 모델을 사용하면 최종 렌더링에서 어떤 부분이 숨겨질지 예측할 수 있으므로 건너뛰는 것이 안전합니다.

오클루전 문제를 완벽하게 해결했다 하더라도 일괄 처리 문제는 여전히 남아 있습니다. 프러스텀 컬링과 크게 다르지 않습니다. 큰 배치의 작은 클립만 표시될 수도 있지만, 배치가 어떻게든 오클루전되는 씬 볼륨과 호환되지 않는 한 전체 배치를 렌더링해야 합니다.

이 모든 문제를 한 번에 해결할 수 있는 단일 접근 방식이 있지 않을까 궁금했습니다. 네, 일종의 만병통치약 같은 것이요. 그래서 찾아보기 시작했고 무언가를 찾았습니다. 은색 총알은 아니지만 꽤 반짝입니다.

지오메트리 클립맵에 관한 것입니다. 저는 과거에 여러 번 다루었습니다. 세상을 옥트리로 표현할 수 있다면 이 세상의 모든 장면을 일련의 동심원 정사각형 고리로 계산할 수 있다는 다소 간단한 아이디어입니다. 각 고리는 큐빅 셀로 구성됩니다. 이러한 셀의 크기는 고리가 시청자로부터 멀어질수록 기하급수적으로 커집니다.

위 이미지는 클립맵을 2D로 투영한 것입니다.

이것이 배치 및 프러스텀 컬링에 어떻게 도움이 되는지 바로 확인할 수 있습니다. 각 셀은 수천 개의 폴리곤을 포함할 수 있는 개별 배치입니다. 셀이 시야 내에 있는지 여부를 확인하는 것은 매우 간단합니다. 또한 셀은 그 정의에 따라 크기가 제한되기 때문에 시야에서 매우 효율적으로 벗어날 수 있습니다.

클립맵은 오클루전 테스트에도 매우 친화적인 것으로 나타났습니다. 클립맵의 특정 방향에서 일부 셀을 오클루더로 식별할 수 있다고 상상해 보세요. 더 멀리 있는 셀이 가려졌는지 여부를 테스트하는 것이 매우 간단해집니다.

다음 이미지는 이 원리가 어떻게 작동하는지 보여줍니다:

여기서는 4개의 셀이 오클루더로 식별되었습니다. 세로 빨간색 선으로 표시됩니다. 덕분에 진한 빨간색으로 칠해진 셀은 모두 버릴 수 있다고 안전하게 가정할 수 있습니다. 이러한 배치는 그래픽 카드로 전송되지 않습니다.

제 경우에는 소프트웨어 래스터화를 통해 테스트를 수행하고 있습니다. 실제 셀 지오메트리는 렌더링되지 않고 셀 정렬된 평면만 렌더링되기 때문에 매우 빠릅니다. 지금까지는 64x64의 깊이 버퍼로 충분한 해상도를 제공합니다.

나쁘지 않네요!

profile
게임개발자 백엔드개발자

0개의 댓글