Z 버퍼의 Read / Write 개념 (1부. Z 값과 Z 버퍼) by 김윤정

사내게시판에 올릴 내용인데 여기다 먼저 정리한 후 올립니당.

에또.. 이 부분에 대해 개념을 가지신 그래픽 디자이너분이나 기획자분이 많지 않은 관계로,
게다가 이것이 설명된 책은 일단 프로그래머 책이다 보니 보기가 힘들고 (!!!) 그림을 대충 그려서 (!!!) 알아먹기가 보통 힘든게 아닌 관계로
좀 더 쉽게 만들어서 그래픽 디자이너나 기획자가 볼 수 있게 만들어 올려봅니다.

일단 Z 값의 구조는 다음과 같습니다.
ps: 으악 X와 Y가 바뀌었다.

모니터는 평면이지만, 그 안에는 가상의 3차원 메트릭스가 펼쳐져 있지요.
그래서 카메라 방향이 위 그림처럼 있다 치면, 화면에서의 깊이값이 바로 Z 방향입니다. 깊이라고도 하죠.

이건 어떨때 사용하느냐... 하면 어느 놈이 앞에 있냐? 랄때 사용합니다. 

즉 아래 그림처럼 깊이값이 있다고 칩시다.
카메라와 가까운 곳은 0이고, 먼 곳은 9 겠지요. (진짜는 당연히 이정도가 아니겠지요.굉장히 큽니다. 물론 몇 비트로 지원해 주느냐에 대한 한계는 있지만.)
그런데 여기에 떡하고 평면이 나왔다 칩시다.

 4의 깊이에 평면이 있게 되는 거군요.
만약 이 뒤에 공이 있다면?



당연히 화면에서는 안보여야 정상입니다. 근데 어떻게 안보인다는걸 알 수 있습니까?
바로 '깊이값' 이 다르기 때문입니다.

plan 은 깊이 4에 있는데 공은 8 ~12  부근에 있습니다. 이걸로 뒤에 있다는걸 알 수 있다는 것입니다.
즉 모니터의 각 픽셀이  4의 위치에 있는 plan들로 채워져 있다는 것을 어디다가 적어 놔야 할 겁니다.  아래처럼 말입니다.  

그리고 이제부터 다른 걸 그릴때, 4보다 큰 숫자의 Z 값이 나오는 픽셀이면 안 찍어 버리면 되는 것입니다. 

다시 말해서,  찍을때 보니 Z 값이 2나 3처럼 4보다 작은 (앞에 있는) 위치의 픽셀이면,
 이번엔 그 픽셀 부분을 다시 갱신해 버리고 찍어버리는 겁니다.


즉 이렇게 되는 거지요.

(* 주: 사실은 위 그림에서 공이 절반만 걸친 부분의 깊이값은 뭐냐.. .라고 혼동하실분이 계시겠지만, 실제로는 저 칸 하나가 한 픽셀이기 때문에 걱정하신것 같은 일은 안일어 납니다 ;ㅅ; 알아보기 쉽게 격자를 확대하다보니...)

그러므로 이런 깊이값은 지속적으로 저장되고 업데이트 되어야 합니다.
이것을 이미지로 만들어 놓은 것이 Z 버퍼라 불리는 그것입니다.

 http://www.felixgers.de/teaching/jogl/depthbufferALgo.html
마치 fog와도 같게 생긴 Z 버퍼를 보시면, 검은 색은 카메라와 가까운 곳을 의미하고 
흰색은 먼 곳을 의미한다는 것을 알 수 있습니다. (그리고 진짜로 fog도 이걸 이용합니다! )
 
이  z 버퍼의 좋은 점은, 찍는 순서고 나발이고 하나도 필요가 없다는 것입니다.
앞의 놈이 먼저 찍히나, 뒤의 놈이 먼저 찍히나 생각할게 없습니다. 아니 오히려 앞의 놈이 먼저 찍혀주는게 고맙지요.
뒤가 먼저 찍히면 뒤의 것을 그리고 Z 버퍼를 업데이트 한 다음에 다시 앞의 것을 그리고  Z  버퍼를 업데이트해 줘야 하지만 앞의 것을 한 번 그려놓으면 뒤의 것은 하나도 안그리면 되니까요.

이것이 Z 버퍼의 개념입니다. 간단하고 명쾌합니다.
그렇지만 , 반투명이 되어서 알파 블렌딩 (Alpha blending) 이 되면 얘기는 좀 심각해지게 됩니다 ....


2부 개악마 알파블렌딩과 Z값. 개봉박두

핑백

덧글

  • The Nerd 2010/03/11 12:01 #

    3D에서 물체 위치 파악하는 것도 그냥 되는게 아니었구만유~
  • 김윤정 2010/03/11 12:12 #

    컴퓨터는 바보니까유~
  • 2010/03/11 12:40 # 비공개

    비공개 덧글입니다.
  • 김윤정 2010/03/11 15:12 #

    뭐 저도 아직 버벅이는데 말입니다~
    이런 책은 사실 내 보고 싶기도 한데, 팔릴 리가 없으니 문제지요 ㅎㅎㅎ
※ 로그인 사용자만 덧글을 남길 수 있습니다.


MyADD

<script> (adsbygoogle = window.adsbygoogle || []).push({}); </script>