본문 바로가기
Programming/Game

Culling vs. Clipping

by 작은별하나 2011. 9. 21.
반응형

실시간 3D 그래픽을 하는데 있어서 가장 중요한 것 중에 하나가 바로 어떻게 하면 그래픽 속도를 높이는가가 아닐까 합니다.

그래픽 속도를 높이는데 있어서, 두가지 부분은 상당히 중요하다고 볼 수 있습니다.

대부분의 게임을 작성할 때, 하나의 모델은 여러개의 오브젝트로 나누어지게 됩니다.

오브젝트 안에는 vertex 정보, texture coordinate 정보, normal 정보 (이 정보는 없는 경우도 있습니다.) 가 기본적으로 있고요.  거기에 추가되는 정보가 material, texture 정보가 있습니다.

culling을 위해서는 오브젝트 안에 기본적인 정보 이외에 bound 정보를 추가하게 됩니다.  bound는 어떻게 구성하느냐에 따라서 성능의 차이가 생깁니다.  예를 들어서 box 형태라고 한다면, rotation 등에 의해서 x, y, z 축에 평행한 box를 얻기 힘들고, bound merge시에 어려운 점이 있겠죠.  그렇다고 multi-box 형태도 그리 바람직하지 않을 것이라 생각됩니다.  가장 편한 방법은 아무래도 sphere 형태라고 보여집니다.  여하튼 이것을 논하자고 하는 것은 아니니까요.  culling을 위해서는 bound 정보가 기본적으로 추가되게 됩니다.

모델이 추가되거나 위치가 이동하게 되면 bound 정보를 새로 고치게 됩니다.  이 과정은 모델의 숫자가 많을 경우 다분히 많은 시간을 소요하게 됩니다.  예를 들어서 MMORPG의 경우에는 스폰(spawn)들의 숫자에 비례해서 bound 정보가 과도하게 고쳐지게 됩니다.

culling을 위해서는 위와 같은 추가적인 프로세스가 필요하며, 이 부분은 그래픽 카드의 성능이 아니라 CPU의 성능에 영향을 많이 받게 됩니다.

이제 culling에 대한 추가 작업에 대한 것은 이정도로 이야기하고요.

자.. 본론으로 넘어가면요.

culling과 clipping의 관계입니다.

culling은 불필요한 오브젝트들을 그리지 않도록 하는 작업입니다.  이 작업은 크게 back face culling과 camera frustum culling으로 나눌 수 있으며, 제가 말하는 culling은 바로 camera frustum culling입니다.

camera frustum culling은 일반적으로 오브젝트 단위로 작업되게 됩니다.  culling은 오브젝트의 분할이 많을 수록 훨씬 많은 오브젝트들이 그려지지 않게 됩니다.

그에 비해서 clipping은 그래픽 카드가 그림을 그릴때 화면밖으로 나가는 트라이앵글들을 그리지 않는 작업을 말합니다.  clipping을 결정하기 위해서는 트라이앵글의 vertex 좌표들을 화면 좌표계로 변환해야합니다.  그러므로 그림 그리는 작업을 거의 다 하게 됩니다.

culling을 많이 해주기 위해서는 오브젝트의 숫자가 많아져야 하겠죠.  똑같은 폴리곤이라고 해도 오브젝트를 1개로 하는것과 공간상 분할을 하는 것을 따졌을때 후자의 경우가 culling될 확률이 훨씬 높아지겠죠.

그러나 오브젝트의 숫자가 많아지면, culling 작업 자체도 많은 성능을 주게 됩니다.  그러나 효과적으로 만들어졌을 때에는 그래픽 카드에서 폴리곤 연산을 상당히 적게 해도 됩니다.

culling 과 clipping은 그래서 서로 연관되어 있으면서도 상반된 속성을 가지고 있습니다.

culling은 CPU 성능을 잡아먹는데 비해서 clipping은 그래픽 카드 성능을 잡아먹습니다.

culling은 오브젝트의 숫자가 많을 수록 그리는 숫자를 적게 하여 clipping에서 잡아먹는 작업양을 개선시키지만 오브젝트를 관리하는데 있어서 많은 성능을 잡아먹게 됩니다.

이런 이유로 오브젝트의 숫자를 적당하게 유지시키고, 오브젝트의 공간 배분을 적당하게 배분할 수 있어야합니다.

이 부분은 성능적인 고려가 필요합니다.  권장 하드웨어가 결정되면, 그것에 맞추어서 최적화하는 것이 가장 좋을 것입니다.  그려져야할 폴리곤 수가 많고 CPU 성능은 남는다면, 오브젝트 분할을 조금 더 하여 그려져야할 트라이앵글 수를 줄여주는 것이 좋겠죠.

그에 비해서 그려져야할 폴리곤 수가 그리 많지 않고, CPU 성능이 모자란다면, 오브젝트 분할을 조금 덜 하여서 오브젝트에 의한 작업량을 줄여주는 것이 좋겠죠.

그러나 무엇보다 배치가 상당히 중요합니다.  오브젝트들을 적당하게 분산시키고, culling될 bound를 생각해서 오브젝트들을 분할한다면.. 앞서 말씀드린 것보다 훨씬 좋은 효과를 얻을 수 있겠죠.

이런 개념은 프로그래머보다는 기획팀, 월드팀, 그리고 디자인 팀이 훨씬 더 잘 숙지를 하고 있어야할 것입니다.

728x90

'Programming > Game' 카테고리의 다른 글

Z Buffer vs. W Buffer  (0) 2011.09.22
알파 오브젝트 정렬  (0) 2011.09.19
이벤트 핸들링에서의 case 문장  (0) 2011.09.16
조건문의 최적화 방법  (0) 2011.09.16

댓글