본문 바로가기
프로그래밍/공부

[DirectX] 절두체 컬링(Frustum Culling), 클리핑(Clipping)

by Sik.K 2023. 8. 23.

절두체 컬링(Frustum Culling)

 

모니터에 출력되는 화면은 가상의 카메라가 바라보는 3차원의 공간을 2차원으로 변환한 것이다.

 

이를 그림으로 그리면 다음과 같다. 

 

시야 공간

위 시야 공간처럼 사각뿔에서 머리가 잘린 모양을 절두체라고한다.

 

이 시야 공간 내부 좌표에 객체가 존재할 경우 화면에 렌더링이 되어 우리 눈에 보여지게 된다. 만약 월드 공간에 존재하는 객체가 이 시야 공간 밖에 존재할 경우 렌더링은 어떻게 이뤄질까?

 

답은 간단하다. 픽셀을 그릴 공간이 없기 때문에 그리지 않는다. 픽셀은 NDC 좌표계를 기준으로 -1에서부터 1 사이의 좌표값을 가진 픽셀을 화면에 그린다.

 

애초에 절두체 밖에 존재하는 경우 NDC 좌표가 이 값들을 벗어나기 때문에 픽셀 셰이더를 거치지 않는다. 하지만 드로우 콜을 계속 받고 있기 때문에 퍼포먼스에 영향을 미치고 있다.

 


 

그렇다면 만약 절두체 내부에 존재하는 객체들에 대해서만 드로우 콜을 호출하고 싶을 경우에는 어떻게 해야 할까?

 

이때 필요한 것이 바로 절두체 컬링이다.

 

절두체를 이루는 평면

절두체는 가상의 공간이지만 도형으로 표현이 가능한 공간이다. 6면체이기 때문에 6개의 면을 가지고 있고 이는 다음과 같이 나타낼 수 있다.

 

이름 위치
근평면(Near Plane) 카메라와 수직하며 제일 가까운 곳의 시야 범위를 나타내는 평면
원평면(Far Plane) 카메라와 수직하며 제일 먼 곳의 시야 범위를 나타내는 평면
좌평면(Left Plane) 카메라의 좌측 시야 범위를 나타내는 평면
우평면(Right Plane) 카메라의 우측 시야 범위를 나타내는 평면
상평면(Top Plane) 카메라의 상단 시야 범위를 나타내는 평면
하평면(Bottom Plane) 카메라의 하단 시야 범위를 나타내는 평면

 

각 평면은 말 그대로 평면이기 때문에 평면 방정식을 통해 점과 법선을 통해 해당 점이 평면과 어떤 관계를 가지는 지 알 수 있다.

 

ax + by + cz + d = 0

 

이것이 바로 기본적인 평면 방정식이다. a,b,c는 평면의 법선이며  x,y,z는 점의 좌표, d는 평면과의 거리를 의미한다.

 

값이 0보다 크면 점은 평면의 앞에 있고, 0과 같으면 점은 평면 위에 존재하며, 0보다 작으면 점은 평면의 뒷면에 존재한다.

 

이 공식을 이용하면 객체가 절두체 안에 있는지, 밖에 있는지 확인하여 별도로 드로우 콜을 호출할 수 있다.

 


 

클리핑(Clipping)

 

앞서 평면 방정식을 통한 절두체 컬링을 알아보았다. 이를 통해 우리는 시야 공간 절두체 내부에 객체가 존재하는 지 밖에 존재하는 지 확인이 가능하다.

 

하지만 절두체 경계에 객체가 걸쳐져 있는 경우는 어떻게 될까?

 

답은 사실 간단하다. 중점이 절두체 밖에 있다면 렌더가 되지 않을 것이고, 내부에 걸쳐져 있다면 렌더가 된다. 하지만 이렇게 되면 부자연스러운 렌더링이 나타나므로 좋지 않다.

 

이때 사용하는 기술이 바로 클리핑이다.

 

절두체 공간에서의 클리핑

 

 

시야 공간을 벗어난 정점에 대해서는 잘라내야 하며 어떤 정점(x, y, z, w)이 절두체 내부에 있다고 할 때 다음을 만족한다.

즉, 시야 절두체 안의 정점들은 다음과 같은 4차원 평면들로 이루어진 영역 안에 있다.

 

'프로그래밍 > 공부' 카테고리의 다른 글

[DirectX] LOD(Level of Detail)  (0) 2023.08.24
[DirectX] 오클루전 컬링(Occlusion Culling)  (0) 2023.08.24
[Graphics] 블러(Blur) 효과  (0) 2023.08.07
[Graphics] Post Effect  (0) 2023.08.07
[Graphics] RTT(Render to Texture)  (0) 2023.08.07

댓글