Z 버퍼의 Read / Write 개념 (5부, 알파 테스팅) by 김윤정

5부가 밝았습니다. 자잔~ 이번 시간에 과연 끝낼 수 있을까요?
크흑 이거말고 지금 강연준비도 두어 개 할 게 있어서 이럴 시간이 아닌데 성격상 벌여 놓은 일이 있음 안절부절하는 성격이라...

자아 각설하고, 시작해 보도록 하지요.

지난 4강의 내용에 따르면, 정말로 알파 블렌딩은 해결방법이 없는 개악마 였습니다.
알파 블렌딩을 사용하기만 하면 그냥 찍지도 못하고,
따로 알파 블렌딩인 것들만 모으는 작업을 해야지 않나, 그리고 그걸 나중에 뒤에서부터 찍어주는 작업을 해야하고,
그러다보니 가려지면 안그려도 된다라는 그런 좋은 최적화를 하나도 사용 못하게 됩니다. (물론 불투명한 물체에 가려지는건 안그리긴 합니다)



솔직히 시간과 자원이 엄청 낭비되는 작업이지요. 그런데 그것도 모자라서 그나마 완벽하게 나오지도 않아서, 물체를 조각내줘야 한다니!!! 그래도 완벽히 해결은 불가!!! 미칠 지경이지요. 별 방법을 다 쓰고 시스템 자원을 낭비하고 있는데도 완벽히 해결 방법이 없다는 건 정말 짜증나는 일입니다.





그래서 사용하는 방법은 '해결' 쪽이 아닌 '완화' 쪽이라는 것이 지난번까지의 얘기였고,
그 '완화' 를 눈속임 잘 하기 위해 그래픽 디자이너의 잔기술 - 그래픽 디자이너들이 또 그런 눈속임 기술은 천재적으로 뛰어나지요 - 을 적극적으로 이용해야 한다는 것이었습니다.

오늘 얘기할 내용은 그 '완화' 의 기법에 대해서입니다.
잘 그려서 눈속임하는거야 이미 이전에 다 말했고... 그 부분은 정말로 그래픽 디자이너의 노하우에 달린것도 없지 않지요.

그치만 어쨌건 이런 알파 블렌딩의 문제점을 '완화' 시킬 수 있는 방법도 하나는 아닙니다.
몇 가지의 선택지가 있다는 것은 고마운 일이지요.
그리고 그 중 상당히 많이 쓰이는 선택지, '알파 테스팅(Alpha Testing)' 이 있습니다.

알파 테스팅과 알파 블렌딩은 사실 형제사이와 같습니다.
둘다 알파채널을 이용해서 투명한 부분을 뚫어 보여주는 기법이란 말이죠.

그치만 그 방법에는 근본적인 차이가 있습니다.



위 그림은 겜브리오 헬프에서 가지고 온 그림인데, 둘 다 같은 이미지입니다. 왼쪽 것은 알파 테스팅이고, 오른쪽것이 여태까지 얘기해 왔던 알파 블렌딩입니다.
그리고 저 나뭇잎 들의 피봇점은 중심에 있기 때문에, 알파 블렌딩을 사용했을 경우에는 오른쪽처럼 우선순위의 문제가 일어납니다.

왼쪽 것은 어떻게 보이시지요? 왼쪽 것은 뭔가 거칠게, 음... 그러니까 '안티알리아싱이 없는' 이미지처럼 보입니다. '도트가 튀어 보인다' 라고도 말씀하시지요.

자 이 이미지를 가지고 설명해 보겠습니다.
위 이미지의 알파 채널은 다음과 같습니다.
네에 부드러운 가장자리를 가지고 있군요. 이걸 알파 블렌딩 옵션으로 찍으면 어떻게 될까요? 가장자리의 부드러운 부분 말입니다.

이 부드러운 부분은, 나무가 찍힐 때, 뒤에 있는 이미지와 합쳐지게 될 겁니다.
알파 채널의 원리를 다들 아시니까 쉽게 이해하시겠지요. 그림으로 표현하면 다음과 같은 느낌.

뒤의 이미지와 알파 채널의 비율에 따라 부드럽게 섞인다. 네에. 이게 알파 블렌딩입니다.
즉 알파 블렌딩은, 사실 자신의 이미지 픽셀이 알파채널에 의해 안 보이더라도 다 찍기는 찍는겁니다. 자신이 0%로  찍을 뿐이죠.
그래서 자신이 보이지 않는 부분이라도 충실하게 Z 값은 Write 하고 있는 거지요.

그런데 이 옵션을 알파 테스팅으로 바꾸면, 이 이미지를 다르게 인식합니다. (이미지가 변하는건 아닌 겁니다)
만약 아래 이미지를 가진 나무를 알파 테스팅으로 바꾸고, 0~256 의 중간인 128로 그 수치를 맞췄다고 치면,  
이렇게 인식하게 됩니다. (이미지가 바뀌는게 아닙니다. 위 이미지를 아래처럼 인식한다는 뜻입니다)

원리를 설명하면, 알파 테스팅 (Alpha testing) 128이라 하면,
128 즉 50% 의 알파 채널 이하는 전부 알파가 없는 것으로 인식하고, 50% 이상의 알파 채널을 가진 것은 전부 알파가 있는 것으로 인식하겠다 - 라는 말입니다. 즉 흑백논리로 인식하겠다라는 것이지요. - 즉 128이라는 수치의 테스트에 통과한 것만 알파로 인정하겠다 라는 말에서 나온 말입니다.


이렇게 하면 뭐가 좋아지나요?

기존의 알파 블렌딩은 그 픽셀에 알파가 미세하게 들어 있어도 전부 계산하기 위해서, 전 픽셀을 모두 계산하고 앉아 있습니다. 아아~ 섬세하긴 하지만, Z 값은 제발 좀 안썼으면 좋겠는 부분도 전부 계산하고 있는거라고용.

그런데 이렇게 흑백논리로 인식해 버리면, 갑자기 뭔가 계산이 편해집니다. 알파가 있고 없고가 확실해 지니까요.
자아 이렇게 되면 기존의 불투명 오브젝트 처리하듯, 알파가 없는 부분은 Z도 안쓸 수 있게 됩니다.
그래서! 기존에 골머리 썩히던 알파 블렌딩의 앞뒤 판정이 모두 해결됩니다!!! 페르난도!!!!



....
하지만 좋아만 할 것은 아닙니다.
덕분에 알파 채널이 요따위로 들어가게 되거든요.

다소 암울해지는건 사실






이것은 선택입니다. 충분히 큰 해상도의 텍스쳐를 사용한다면, 알파 테스팅에 의해 텍스쳐의 이미지가 좀 손상되더라도 버틸 수 있을만큼의 이미지가 됩니다. 도트도 왜 고해상도로 보면 볼 만 하잖아요.
그래서 많은 게임에서 이 방법을 사용하고 있지요. 알파를 사용하면서도 알파 블렌딩처럼 소팅(sorting:앞뒤판정) 을 걱정하지 않아도 되는 방법이기 때문입니다. 물론 이미지의 저하는 피할 수 없지만 오브젝트를 작게 하거나 텍스쳐를 크게하면 그런대로 볼만하게 처리할 수 있습니다.

프리우스의 머리카락도 알파 테스팅을 사용하고 있는 것을 알고 있지요. 블렌딩을 쓰면 훨씬 자연스럽겠지만 테스팅을 써도 괜찮다면 써 주는게 낫습니다.

아이온도 잘 보시면 알파 테스팅을 적극적으로 사용하고 있습니다.
특히 많이 사용하는 곳은 나뭇잎이나 풀 등의 표현입니다. 이것들은 양이 많고 크기가 작기 때문에, 알파 테스팅으로 처리하는 경우가 일반적입니다. 이렇게 알파 테스팅은 잘만 쓰면 괜찮은 표현을 할 수 있습니다만,



속눈썹이나 머리카락 클로즈업 신이 자주 나온다면 고민해보는게 좋을 부분입니다. 속눈썹은 아무리 해도 알파 테스트로는 좀... 
아예 모델링을 해버리고 말지... 

 

그리고 또한 알파 테스팅을 사용 못하는 부분이 있습니다. 바로 이펙트 부분이지요.
이펙트는 알파 블렌딩만을 사용해야 합니다 OTL
또한 적절히 투명한 유리 효과나 비치는 옷을 표현할때에도 알파 테스팅은 사용할 수 없습니다.











자 여기까지 읽으셨으면 쉬어가는 문제하나. 만약 다음 그림처럼 알파 채널을 만들고

알파 '블렌딩' 옵션을 켠 직원이 있다면 어떻게 하시겠습니까?
















.............
죽여야 합니다. 당신의 프로젝트를 망하게 하려고 낙하산타고 내려온 경쟁사의 첩자입니다
알파 채널 자체가 저 모양이면 품질은 알파 테스트 상태에 Z 버퍼 문제는 알파 블렌딩을 가진 괴물이 탄생하고 맙니다. ㄷㄷㄷ











어쨌건,
알파 테스팅은 알파 블렌딩의 단점을 극복하게 해줄 좋은 방법중 하나입니다.

보너스로 또 하나의 응용을 보여 드리지요.

바로 알파 블렌딩과 테스팅의 동시 응용과 고급 응용!!!


자아. 알파 채널이 있는 나무 이미지를 이렇게 배치하고,

알파 블렌딩은 사용하지 않고 알파 테스팅만 사용해 봅니다.
숫자는 0. 그야말로 외각을 최대한 살려서 (알파를 관대하게 test통과 시켜서) 출력해 내 주는거라, 외각이 지글지글 ... 원래 원한 면보다 크게 나옵니다.

그래서 50~150 정도 되는 영역을 쓰곤 하죠. 그렇다고 너무 줄여서 250까지 test를 빡세게 하면
역시나 원래 이미지와는 차이가 큰 앙상한 녀석이 나오게 되겠죠.

그래서 뭐 일반적인 방법은... 첫째로 나무 base을 만들 때 외각에 검은색을 채우지 말고 나무색과 비슷한 녹색을 채우는건 기본.
행여나 생기게될 '찌꺼기' 를 최대한 가리기 위해서지요. 뭐 이런건 그래픽 디자이너로써 기본이고..

어쨌건 평이하게 50 정도로 끊어보지요. 검은 찌꺼기가 좀 나왔지만 형태는 원한 정도대로랄까나.
그런데 여기서 다시 알파 블렌딩을 쓰는겁니다. 알파 테스팅과 동시에 말이죠.

그럼 이렇게 됩니다.

오오 뭔가 거친 듯 하면서 부드러운 외각을 가지게 되었습니다.

그리고 알파 블렌딩만 사용했을때 나오는 커다란 사각형의 짤림 현상이, 외각에 연하게 줄 이미지 정도로 줄었습니다.
그 이유는 일단 알파 테스팅을 거치면서 외각의 대부분이 알파를 통과하지 못하고 처리가 안 되었고,
이제 남은 영역에 한해서만 알파 블렌딩을 하기 때문에 그 영역이 대폭 줄게 된 것입니다. +_+

비교해 볼까요

좌측이 그냥 알파 블렌딩만 사용한 것이고, 우측이 알파 테스팅을 먼저 거친 다음 남은 부분으로 알파 블렌딩을 한 방법입니다.
만약 굳이 알파 블렌딩을 사용하겠다면, 우측 방법을 응용해 보는 것도 좋은 방법이겠지요?
이펙트도 이미지의 손상을 최소로 하기 위해 알파 테스팅을 5나 10 정도로 약하게 주고, 다시 알파 블렌딩을 처리하는 방법을 사용하면 앞뒤문제를 어느 정도 해결할 수도 있겠지요 +_+



이런 내용을 테스트 한 것이 겜브리오 메뉴얼에 잘 나와 있습니다.
저는 사실 오늘은 아래 사진 한 장을 설명한 것 뿐이네요.

아니 저기 이제 그러시면 초큼 곤란 (...)

자아. 이렇게 5강은 끝입니다. 알파 테스팅이라고 하는 멋진 녀석을 소개시켜 드려서 기쁘군요.
다음 시간에는 Z Read/Write 응용을 함 해볼까요?
... 문제는 그것도 한 강의 안에 끝날 수 있느냐는 건데 ... ㄷㄷㄷ 이쪽은 너무 큰 것들이 얽혀 있어서 설명하기가 쉽지 않네요. ㄷㄷㄷ

어쨌건 다음은 마지막시간 (이 되기를 기대하면서)
Z 버퍼의 Read / Write 개념 (6부, Z Read/Write) 편이 되겠습니다.

핑백

덧글

  • 캐런 2010/03/18 09:42 #

    오랫동안 개발해왔어도 알파와는 여전히 껄끄러운데
    이렇게 정리한걸 보니 정말 좋네요ㅎㅎ
    다음편도 기대됩니다~
  • 김윤정 2010/03/18 10:07 #

    감사합니다 :)
  • 왕풍뎅이 2010/03/18 22:07 #

    어머 언늬 이걸로 논문써도 되겠다..
  • 김윤정 2010/03/18 22:19 #

    논문은 새로운 걸 발표하는거고.. 이건 닳고 닳은 옛날거 아니냐
  • 영악한 얼음정령 2012/10/09 00:51 #

    좋은 글 잘 보았습니다.
    한가지 궁금한 것이 있는데요, [No Sorter] 옵션은 Alpha sorting을 하지 않겠다는,
    그러니까 불투명 오브젝트를 정렬할때 같이 정렬하겠다는 옵션이라고 이해하였는데 맞는 것인지요?
  • 김윤정 2012/10/09 02:56 #

    겜브리오를 안쓴지 2년이 되었더니 내용이 기억나지 않습니다 (...) 이놈의 건망증 ㅎㅎ
    굉장히 기억하기 싫은 엔진이었나 봐요. ㅎㅎㅎ
    이런 상황(?)에서는 일단 제가 보기에도 그런 옵션인 듯 싶습니다
  • 김윤정 2012/10/09 02:57 #

    게다가 알파 테스팅이면 소팅을 하지 않아도 뭐 괜찮을 테니까요.
  • 영악한 얼음정령 2012/10/09 10:59 #

    소중한 답변 감사합니다, 많은 참고가 되었어요~
    감사합니다~ ( ' ' ) ( . . ) ( ' ' )
※ 로그인 사용자만 덧글을 남길 수 있습니다.


MyADD

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