👩🏻‍💻기초지식/DirectX

[DX] 컬링 (프러스텀 컬링, 경계구/경계상자, 쿼드트리, 클리핑)

공대 컴린이 2023. 8. 22. 11:44
728x90

프러스텀 컬링, 절두체 컬링 (Frustum Culling)

절두체 컬링은 3차원의 월드 상에서 실제로 카메라의 시야 범위에 포함되는 것들만 렌더링하고, 나머지 것들은 렌더링 하지 않는 기법을 말하며, 3D 렌더링 기법 중 속도 증가 기법으로 중요하게 사용됩니다.

카메라 시야의 상,하,좌,우 방향으로 시야에 수직하는 평면과 먼곳의 시야 범위를 나타내는 평면까지 총 6개의 평면(절두체)을 통해 오브젝트가 절두체에 포함되는지를 평면 방정식으로 계산하여 구할 수 있습니다.

 

평면의 방향을 나타내는 법선 벡터 a, b, c 가 있을 때 평면과 원점의 거리를 나타내는 값 d가 존재하면
평면 방정식: ax + by + cz + d = 0

 

이러한 평면의 방정식을 만족하는 (x, y, z) 좌표값은 모두 평면 위에 있으므로 렌더링하고, 만족하지 않는 점은 렌더링 하지 않습니다.

평면의 방정식을 만족하는지 확인하기 위해선 평면을 구성하는 점 3개를 뽑아서 두 개의 벡터를 구성한 뒤, 외적 연산하여 직교하는 벡터를 구해야 합니다.

구해진 벡터가 바로 평면 방정식의 법선 벡터가 되어, 원점의 거리를 나타내는 d 값을 통해 방정식에 값을 대입할 수 있습니다.

 

절두체 컬링을 위해선 6개의 평면 방정식에 점의 좌표를 대입해, 모든 결과값이 양수이면 절두체 내부에 포함되어 있다고 볼 수 있습니다. 

 

작은 문제점

자유 시점 카메라에선 카메라의 위치에 따라 렌더링 되는 오브젝트의 갯수가 크게 차이날 수 있는데, 이런 경우엔 카메라로 부터 가장 멀리보이는 수직 평면인 Far Clipping Plane을 더욱 가깝게 잡아주어 문제점을 보완할 수 있습니다.

 

(유니티에선 엔진이 자동적으로 절두체 컬링을 수행해준다)

 

경계구/경계상자 컬링 (Bounding Shpere, Bounding Box)

일반적으로 3D 환경에는 상당히 많은 정점이 있기 때문에, 모든 정점에 대체 절두체 컬링을 적용하려면 큰 부하가 걸립니다. 따라서, 컬링을 적용할 때 오브젝트 단위로 먼저 간단히 컬링을 적용해준 뒤, 정점 단위로 컬링을 수행하는 최적화 과정이 필요합니다.

 

쿼드 트리 컬링

주로 지형에 많이 사용되는 컬링 방식으로, 지형을 4등분하는 형태로 나누고, 나뉜 지형을 또다시 4등분 하는 것을 반복하는 형태로 노드를 만들어둡니다. 이후, 개별 단계에서 사분면 자체가 절두체에 포함되지 않으면 해당 사분면 전체를 제외해버리는 방식입니다.

 

클리핑(Clipping)

일반적으로 컬링은 정적은 오브젝트에, 클리핑은 동적인 오브젝트에 적용됩니다.

클리핑은 오브젝트의 폴리곤을 카메라에 맞게 잘라내는 연산이 추가됩니다.

 

주요 로직으로는, 카메라의 절두체에 걸치는 폴리곤을 구하고, 폴리곤을 구성하는 벡터 중 일부가 절두체에 걸쳐지는 경우를 판단합니다. 이후, 폴리곤의 정점을 폴리곤에 걸쳐지는 점으로 재구성하여, 절두체 밖으로 빠져나간 부분을 잘라내는 방식입니다.


참조자료

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sipack7297&logNo=220438495355 

 

[D3D] 7장 : 절두체 컬링(Frustum Culling)

절두체 컬링(Frustum Culling) - 3차원 월드에는 대단히 많은 폴리곤과 오브젝트가 있지만, 이들 중에서 ...

blog.naver.com

https://m.blog.naver.com/canny708/221547085908

 

절두체 컬링 (Frustum Culling)과 클리핑 (Clipping)

3D 공간에는 다양한 오브젝트가 들어갈 수 있습니다. 360도로 오브젝트가 배치된 일반적인 상황이라 생각...

blog.naver.com

728x90