Z 버퍼의 Read / Write 개념 (2부. 개악마 알파 블렌딩1편) by 김윤정

이전 시간에 기초적인 Z 버퍼의 작동 개념에 대해 알아 보았습니다.
그런데 세상은 참 넓고도 깊은지라, 여러 가지 해결 안되는 문제가 있기 마련인거지요.

자 이전 시간으로 거슬러 가서 다시 생각해 봅시다.



위와 같은 환경에서 공이 안보이는 이유는?
네에 바로 plan의 Z 값이 공의 Z 값보다 앞에 있기 때문이지요.
그렇다면 다시 말해서, 공을 화면에 찍으려고 할 때
공보다 앞에 있는 물건이 있는지 없는지를 검사한다는 말이겠지요?

이것을 "Z 값이 씌여져 있는 상태를 읽어서, 자신이 그려져도 되는지를 확인해본다" 라고 합니다.
그 말을 줄여보면 "Z값을 읽는다" 라고 하고, 이 말을 다시 "Z Read" 라고 하는 것입니다.
혹은 "Z 값을 테스트한다" 라고도 하며, 이 말을 다시 " Z Test" 라고도 합니다. 즉 Read = Test 라는 거지용.

또한 아래 그림을 다시 한 번 생각해 봅시다.

이번엔 공이 튀어나와서 앞에 있게 되었습니다.
공이 Z Read(Test)를 해 보면, 절반은 plan보다 앞에 있다는 것이 판명나니 일단 보이겠지요?
그렇지만 그걸로 끝이 아닙니다.
이번에는 화면에서 자신이 제일 앞에 있다라고 써 줘야 하는 상황이 벌어진겁니다.
즉 이렇게 말이죠.

다시 말하자면, " 자신이 기존의 Z 값보다 앞에 있다는게 판명나면, 자신의 Z 값을 덮어씌워 기록한다" 라는 과정이 필요하게 되는 것입니다. 위에서 plan이 써 놨었던 4라는 깊이값을, 공이 들어오면서 2와3으로 갱신해서 기록한 것과 같이요.

그래서 이것을 " Z 값을 쓴다" 라고 하고 "Z Write" 라고 부르는 겁니다.
즉, 기본적으로 모든 오브젝트는 자신보다 앞에 있는 녀석이 있는가를 체크하기 위해 Z Read(Test)를 해야 하고, 자신이 제일 앞에 있을 때에는 자신이 제일 앞이라는걸 표시하기 위해 Z Write를 해야만 하는 겁니다. 이걸 이렇게 표시하지요 "Z Read:ON, ZWrite:ON" 그리고 이래야 모든 오브젝트의 위치가 제대로 판정이 되게 됩니다.





....자 여기까지가 일반적인 상황이었습니다.





그렇지만 개악마 알파 블렌딩이 들어가면 아주 사정이 달라지게 됩니다.

우선 알파 블렌딩(Alpha blending) 이란 무엇을 의미할까요?
별 거 아닙니다. "반투명이 되는거 전부 다" 를 의미합니다.

-그냥 셀로판지처럼 50% 반투명해도 알파 블렌딩입니다.
-섬세하게 그라디에이션 되는 머리카락 끝도 알파 블렌딩입니다.
-빵빵 터지는 이펙트나 파티클도 알파 블렌딩 들입니다.
-반투명 되는 물도 알파 블렌딩입니다.
-살짝 뒤가 비치는 UI도 알파 블렌딩입니다.


하여간 "조금이라도 반투명한 영역이 있어서 뒤의 배경과 색이 겹치는 영역만 있으면"
그건 모두 알파 블렌딩입니다. 머리카락 끝에만 살짝 알파가 들어가 있다 해도, 머리카락 전체가 알파 블렌딩인 겁니다.

이 알파 블렌딩은, 위의 Z 버퍼 개념을 완전히 부숴버리는 무서운 짓을 합니다.
자, 생각해 보겠습니다.

먼저 투명한 plan이 찍혔다고 칩시다. 이 녀석은 알파 블렌딩인게 확실합니다.
그리고 이전에 얘기한대로  Z Read(Test) 와 Z Write 를 모두 ON 한 상태입니다.
그 뒤에 불투명한 공이 나중에 찍혔습니다. 어떻게 되겠습니까?

상식적으로 당연히 보여야겠지만, Z 값을 비교해 볼까요?
이미 plan이 Z 값을 4로 모두 Write 한 상태인 겁니다.

즉 불투명일때랑 똑같은 상태의 Z 값이 들어간 거지요.

다시 말해서 뒤의 공은 Z read를 해 보니,

자신이 plan보다 뒤에 있다고 판명되었기 때문에 찍지 않게 됩니다!!!!

제기랄 뒤에 공이 있는데 전혀 보이지 않아!!!



이것을 "Z test를 통과하지 못했다" 라고 말합니다. 
 분명히 반투명인 plan이지만, 뒤에 있는 것은 전혀 보이지 않게 되는 기현상이 일어나게 되는 것입니다.
이것이 Alpha blending의 문제입니다.

보다 현실적인 예를 들어 보지요.

이런 알파 채널을 가진 나뭇잎이 있다고 칩시다.
알파 채널에 사알짝 반투명한 부분도 들어 있고 하니 이건 분명 알파 블렌딩이 맞습니다.

만약 게임에 찍히게 되면 이렇게 생겼겠지요.
조금 작게 만들어 봅시다. 1/4 크기로요. (외각 라인은 일부러 강조를 해 놨습니다.)
자 이렇게 알파 블렌딩된 나뭇잎이 찍혔습니다.
그 다음에 불투명한 커다란 공이 찍힌다고 생각해 봅시다.

자 여기서 생각을 해 봅시다. 저 나뭇잎이 먼저 찍혔기 때문에, 저 나뭇잎은 Z 값을 4로 이미 써 놨습니다.
그러므로 저 Plan에 속한 영역은 모두 공보다 앞에 있는 것입니다.

즉 최종 결과는 이렇게 나오게 되는 겁니다.
역시 알파 블렌딩의 악마짓이 시작되었습니다.

잘 알겠습니다. 그런데 지금 이건 나뭇잎이 먼저 그려진 경우이지요. 
그렇다면, 만약 공이 먼저 그려지고 그 다음에 나뭇잎이 그려졌다면?

...그렇게 순서가 바뀌게 된다면 아무 문제 없게 됩니다!
이 문제가 일어날 때 이유를 찾기 쉽지 않은 이유가 바로 저것이지요.
실제로 오브젝트가 찍힐때 어떤게 꼭 먼저 찍힌다고 보장할 수가 없습니다.
(그 이유는 추후 또 얘기하도록 하지요.)


그래서 일반적인 해결책은 어떻게 하는 걸까요?
그래서 일반적으로는 , 일단 불투명한걸 모두 모아서 그려 버리고
나중에 반투명한것들만 모아서 그려 버리는 방식으로 해결해 버립니다.

이렇게 하면 불투명한 것들끼리는 단순한 Z 버퍼 방식으로 처리하면 되는 거니 일단 다 그려지고,
반투명한 것들은 나중에 그리니까 먼저 빈 영역이 Z 값을 차지하고 있어서 뒤에 있는 불투명한 것들이 안그려지는 불행한 사태를 피할 수 있는 것입니다.


그리고 이런 증상은 실무에서 이렇게 나타나게 됩니다.
배에 붙어 있는 이펙트가 파란 바닥 오브젝트를 잘라버렸습니다.

(물론, 위의 예제는 여태까지 설명한것과 완전히 같은 증상은 아닙니다. 그건 또 추후에 설명을..)


자아. 이렇게 하면 모두 해결된 것으로 보이지요? 불투명한 것만 먼저 그리고 반투명한 것만 나중에 그리면 다 해결되니까...
별로 개악마도 아니네? 라고 생각하는 당신...!

하지만 진짜 문제는 이제부터 시작입니다!!!

게임 개발은 그렇게 녹록한게 아니라구!!!!


이어지는 3부 (개악마 알파블렌딩 2편) 을 기대해 주세요.

핑백

덧글

  • 2010/03/12 14:28 # 비공개

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

    헤에 이런거 쓰면 아는 분들 일부만 읽을테니... 누가 보기나 할까요
  • 미친고양이 2010/03/12 22:59 #

    ↑ 알아도 꼼꼼하게 다 봅니다.. 이상하게 쓰시면 토달겁니다. -_-;;
    사실 저희 게임도 개악마 알파블렌딩 때문에 문제가 많아서 포기하고 사는게 많아요 ㅠ
  • 김윤정 2010/03/13 02:36 #

    어머낭 ㅋㅋ 잘못된 부분 있으면 지적해 주세용
    ㅎㅎ
※ 로그인 사용자만 덧글을 남길 수 있습니다.


MyADD

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