본문 바로가기
Programming/Game

Z Buffer vs. W Buffer

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

게임을 제작하다보면, 폴리곤 겹침에 의해서 겹쳐진 폴리곤이 카메라 이동에 따라서 심하게 떨리는 것을 경험해본 경험들이 있을겁니다.

   

이런 현상을 깊이싸움(Depth fighting)이라고 하는데, 이것은 카메라로부터 거리를 측정해서 기록하는 Z-Buffer가 표현할 수 있는 해상도 때문입니다.  폴리곤 사이를 충분하게 띄어주었고, Z-Buffer의 해상도를 24비트 정도를 썼다면 이런 현상은 대부분 벌어지지 않습니다.

   

최신 그래픽 카드는 W-Buffer를 지원하고 있는데, Z-Buffer와 비교해서 어떤 좋은 점이 있을까요?

   

이것을 이해하기 위해서는 카메라 투영변환(Projection transform)에 대해서 이해할 필요가 있습니다.

   

3D 그래픽에서 사용하는 카메라는 바늘구멍사진기(pin hole camera)를 사용합니다. 

   

바늘구멍 사진기는 바늘구멍을 기준으로 해서 가까운 곳과 먼 곳의 원근이 표현됩니다.  가까운 것은 크게 보이고, 먼 것은 작게 보이죠.

   

결국 크기는 거리에 반비례하게 됩니다.

   

90도의 시야각(Field of View)을 가지고 있다면, 투영변환후의 x', y' 은 다음과 같이 표시할 수 있습니다.  (편의상 카메라 위치는 원점으로 할께요.)

 

\[ x' = x/z \]

\[ y' = y/z \] 

   

사실 x', y' 만 있으면 화면에 표시할 수 있지만, 화가알고리즘(Painter's algorithm)을 사용하지 않고 깊이버퍼소거법(Z-Buffer elimination)을 사용한다면, 거리를 계산하는 로직이 필요합니다.  거리는 기본적으로 [0-1]의 범위를 가지도록 합니다.  \(z_n\)의 점은 0으로 \(z_f\)의 점은 1로 변환하고자 합니다.

 

\[ z' = ( z – z_n ) / ( z_f – z_n ) \]

 

이렇게 하는 것이 가장 이상적이겠죠?  즉 z 거리에 따라서 균일하게 z' 의 해상도를 가지는 것입니다.

   

그러나 현실은 이렇지 못합니다.  4차원 행렬을 사용해서 계산하기 위해서는 모든 항목에 z로 나누어주는 것이 들어가야 합니다.  그렇지 않다면 x', y' 만 계산할 때 z로 나누어주는 것이 필요하겠죠.

   

\[ z' = { ( 1 / z_n – 1 / z ) \over ( 1 / z_n – 1 / z_f ) } = z_f / ( z_f – z_n ) – z_n z_f / z ( z_f – z_n ) \]

   

형태와 같이 다소 복잡하게 나옵니다.  우리는 이 값을 사용합니다.  항목을 보면 알겠지만 z와 관련된 항목이 분모에 있습니다.  즉 쌍곡선을 이루게 됩니다.  이것 때문에 카메라와 가까운 곳은 깊이의 해상도가 높고, 먼 곳은 낮게 되겠죠.

   

W-Buffer는 이상적인 계산 방법인 \( z' = ( z - z_n )/( z_f - z_n ) \) 을 사용하도록 하는 것입니다.  W 값에는 원래 z가 들어가있지만요.

여하튼 W-Buffer는 카메라 거리에 상관없이 일정한 해상도를 유지합니다.

   

그럼 이상적인 W-Buffer가 좋은가?  그렇지 않다고 생각합니다.

   

"먼곳의 오브젝트는 LOD를 사용한다."

   

이 주제를 가지고 이야기한다면, 먼곳의 오브젝트는 폴리곤 겹침을 줄일 수 있습니다.  그 외에도 여러가지 장점이 있습니다.

   

최근의 그래픽 카드는 VS와 PS를 사용합니다.  VS에 비해서 PS의 작업량이 일반적으로 많다고 할 수 있죠.  하지만 카메라 가까운데에는 PS의 작업량이 많겠지만, 카메라로부터 거리가 2배 떨어지면, PS의 작업량은 25%로 줄어들게 됩니다.  VS의 작업량은 똑같은데 비해서요.  더구나 장애물추려내기(Occulusion culling)를 사용한 그래픽 카드라면 PS의 작업량은 더더욱 줄어듭니다.

   

LOD는 바로 VS의 작업량을 줄여줄 수 있는 방법입니다.  즉 VS와 PS의 밸런스를 맞추어줄 수 있다는 것이죠.

   

즉, 좋은 성능을 얻고자 한다면 LOD 사용은 필수입니다.  LOD가 그래픽 품질을 저하시키지 않고 PS 부담률대 VS부담률을 개선하는 효과와...

주요 관점은 아니지만 Z-Buffer 사용상에서 나타날 수 있는 폴리곤 겹침을 방지할 수 있습니다.

   

728x90

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

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

댓글