카테고리 없음

FRUSTUM CULLING

춤추는수달 2022. 1. 4. 21:47

절두체 컬링.

FRUSTUM, 절두체란 피라미드 모양에서 머리가 잘린 모양. 카메라가 보는 영역이 절두체의 모양이다. 절두체 밖에 있는 물체는 그릴 필요가 없으므로 CPU에서 그리지 않을 물체를 미리 걸러서 GPU에 넘겨주는 것이 FRUSTUM CULLING이다.

그렇다면 어떻게 물체가 절두체 안에 있는지 판별할 수 있을까? 

절두체는 여섯 개의 면으로 둘러 싸인 공간이다. 어떤 점이 어떤 평면보다 앞에 있는지, 뒤에 있는지 판별할 수 있다면 절두체의 모든 면에 대해 안에 있는지 확인해서 최종적으로 어떤 점이 절두체 안에 존재하는지 판별할 수 있을 것이다.

그럼 어떻게 어떤 점이 어떤 평면의 앞에 있는지, 뒤에 있는지 판별할 수 있을까?

 

ax+ by +cz +d = 0 는 3D공간에서 평면의 식이다. 즉 이 식을 만족하는 x,y,z 좌표는 같은 평면에 있는 점이다.

이때 벡터 n(a, b, c)는 이 평면의 노말 벡터이다.

그리고 d는 원점으로부터 평면의 거리와 관계있다. 예를 들어 어떤 점 M(q,w,e)이  평면 ax+ by +cz +d = 0 위에 있다고 해보자. 원점 O와 M 의 벡터 OM(q,w,e)과 평면의 노말벡터 n(a,b,c)의 내적을 구하면 qx + wy + ez가 될 것이고 평면의 식에 의해 이 값은 -d가 된다. 그리고 이 내적의 값은 원점의 평면으로부터의 거리이다.  즉 평면은 원점으로부터 -d만큼 떨어져 있다.

구글에서 관련 이미지 긁어옴, 이 글이랑 일치하는 글자는 아니니까 글자들은 적당히 보셈. 

이를 이용해 어떤 점이 어떤 평면보다 원점과 가까운지 아닌지 판별할 수 있다. 평면위에 있지 않은 다른 점 Q을 위와 마찬가지로 평면의 노말 벡터와의 내적을 구하면, 이 평면과 같은 기울기를 가지고 Q가 속하는 다른 평면과 원점의 거리를 구할 수 있다. 이 거리가 -d보다 작으면 Q가 평면보다 안쪽에 있는 것이고 더 크면 밖에 있다고 판별할 수 있는 것이다.

더 보기 쉽게 정리하면 어떤 점M(q,w,e)가 평면 P(ax+ by +cz +d = 0 ) 보다 안에 있다면 aq + bw + ce +d < 0 이라는 것이다.  aq + bw + ce +d = 0 이면 M은 P 위에 있는 것이고,  aq + bw + ce +d > 0 면 M은 P 보다 밖에 있는 것이다.  

그런데 이것은 한 점에 대해 판별할 뿐이다. 실제로는 입체적인 물체를 판별해야 하므로 aq + bw + ce +d > r 과 같이 0이 아닌 다른 숫자와 비교하게 된다. 이는 점이 아닌 어떤 물체를 대강 커버하는 크기의(반지름이 r인) 구체를 판별하는 것과 같다. 

그리고 점 뿐만 아니라 평면의 식을 구하기 위해선 절두체의 평면 위에 있는 3개의 점의 월드 좌표를 알아야 한다. 이를 위해서는 절두체가 존재하는 Projection 좌표계에서 거꾸로 View-> world 좌표계로 바꾸어주어야 한다.