최종회 : Z 버퍼의 Read / Write 개념 (7부, Z Read On / Write Off) by 김윤정

1부 바로가기
2부 바로가기
3부 바로가기
4부 바로가기
5부 바로가기
6부 바로가기



우아. 오래 지났습니다 ㄷㄷㄷ
지난 번 쓴 6부가 3월 18일이었으니까, 벌써 보름이 다 되어 가네요 ㄷㄷㄷ

그 동안 몸도 좀 아팠고, 강연준비가 갑자기 들어오고, XX 에 XX위원으로 참가하는 일도 해야 했고, 삼성 3D TV 리뷰어 당첨에
회사에서도 지형 쉐이더 방식을 안해보던 방식으로 만져보느라 (= 스승을 괴롭혀 공부해 보느라) 이제야 7부를 쓰게 되었습니다

아니 정말이래도요

 

그러다가 갑자기 " 기다리고 있었는데 왜 7부 안쓰세요" 라는 말을 오늘 듣고 번쩍! 놀라서, 조금씩이라도 써 두지 않으면 잊어버리겠구나... 라고 생각이 들어 다시 쓰게 되었습니다. 글을 기다리고 있는 분이 한 분이라도 있다면 힘이 나는 법이지요.


으음? 무슨 얘기를 여태까지 했었죠 ?? (멍.... )
아, 그렇군요. Z 버퍼 얘기하다가  개악마 알파 블렌딩의 횡포에 대해 얘기했었고, 그걸 해결하기 위해 뒤에서 그리기, 테스팅하기, read(test)/ write 조작하기 등을 얘기했었죠. 
그러다가 결국 완벽히 해결하는 방법은 없다라는 것을 깨닫고, 마지막 남은 희망인 Z Read ON / Write Off 에 대해 얘기해 보는 것만 남았습니다. 

자아 기억이 안나시는 분은 저번 6강을 보시면 되겠고, 7강은 이제부터 시작합니다.

4. Z Read = ON     Z Write = OFF

자아 드디어 이게 나왔습니다. 그동안 숙제 잘 하셨는지요? 
한 번 같이 생각해 봅시다. 

역시나 plan이 하나 있습니다. 

 

늘 하던대로, 예 그렇습니다. 이녀석은 Z Read와 Z Write를 하는 녀석입니다. 그러므로 지금 Z 값은 화면에 모두 '4' 로 적혀져 있는 상황입니다.


역시 나중에 주전자가 그려졌습니다. 자아. Z read 는? on이니까 하겠지요! 아아 좋아요. read(test) 해 보니 자신이 그려질 구석이 없다는걸 깨닫고 안그립니다. 뒤에 있으니까요.
Z Write는? 안합니다만, 어차피 가려졌으니까 필요가 없습니다. 괜찮군요 흠흠. 이상태로도 OK

뭔가 상큼한 시작이군요.
좋아요 그럼 주전자가 먼저 그려지고 plan이 나중에 그려진다면?

이것도 ok 입니다. 어차피 주전자는 Z 값을 Write 하지 않기 때문에, Plan이 그려질때 어떠한 장애도 일어나지 않지요.
흠흠 완벽합니다.

이 방법의 문제점은 딱 하나입니다.
주전자가 먼저 그려지고, plan이 나중에 그려질 때, plan이 주전자를 덮어버린다는 것입니다. 주전자는 Z write를 하지 않으니까요.
 즉 아래와 같은 모양에서, plan이 먼저 그려진다면 뭐 별 상관 없겠는데 Plan이 나중에 그려진다면 주전자를 덮어버리게 됩니다.

흠 이것도 못쓰겠 .... 아니잖았!!!!!!!!!!!!!!!!!!!!!


어차피 우리는 지금 반투명일때의 문제 때문에 이걸 얘기해 왔던 거고,
만일 주전자가 반투명이고 plan이 불투명이면,
어차피 불투명인 오브젝트부터 먼저 그리고 반투명을 그려 버리니까 (2부 참조)
위와 같은 경우는 절대로 일어나지 않는다는 것 아닙니까!!!!

오오 정말로 희망이 보이기 시작합니다. 이것은 개악마 알파 블렌딩을 물리칠 수 있는 구세주인 것인가?!
예제를 바꿔서 심도깊게 다시 봐야겠군요.
개악마 알파 블렌딩 등장이십니다. 알파 테스팅 아닙니다.

우선 둘 다 Z read on에 Z write off 라고 봅시다. 자 .. 뭐부터 그려볼까요.
보통 뒷쪽부터 그리는 것은 어떠한 경우에도 별 문제가 되지 않습니다.
근데 아시다시피 앞쪽과 뒷쪽을 판가름하기 애매한 상태가 너무 많이 일어나니까요... 완벽하게 뒷쪽부터 그리는 것은 사실상 불가능하다는 것도 지난번에 말씀드렸습니다. 

그러니 문제가 일어나는 앞쪽부터 그려보죠. 이것만 성공하면 오케이일텐데 말이죠... 
 
앞쪽의 나뭇잎을 그렸습니다. Z read on 이라서 test를 해봤더니 아무 문제 없습니다. 혼자인데 문제 있을리가 -_-;;;
그런데 Z write는 off 라서 자신의 z 값은 쓰지 않습니다. 즉 Z 값만으로 봤을때는 화면에 지금 아무것도 없습니다.
뭔가 슬슬 느낌이...

그렇습니다. 분명 앞에서부터 그렸는데,

뒤에 그린 나뭇잎이 그려질 때 아무런 저항이 생기지 않습니다.

오오오오오오오오오오오오!!!!

이것이야말로 개악마 알파 블렌딩을 처치해주실

만능의 옵션!!!!!!!




앞이되건 뒤가되건, 불투명인 것들만 먼저 그려주는 것만 지켜준다면 어떤 경우건 짤리는 일이 생기지 않습니다!!!

경배하라!!! 할렐루야!!!!

개악마 알파 블렌딩이여 Z read ON  Z wite OFF 의 축복을 받고 천겁의 지옥으로 굴러떨어져랏!!!



아하하하 기쁩니다. 드디어 해답을 찾은 것 같습니다.

불투명인 것 부터 먼저 그리고, 알파 블렌딩인 것들은 Z read ON / Write OFF 처리를 해 준다면 어떠한 경우라도 제대로 그릴 수 있게 되는군요. 자 그럼 이렇게 긴 시간동안 강의를 읽어주셔서 대단히 감사합니다. 다음 기회에 뵙겠습니다.



끝.





































... 이라고 끝내고 싶지만. 정말 그럴까요?

개악마 알파 블렌딩이 그렇게 호락호락하게 넘어갈까요?
그게 그렇게 말처럼 쉽게 넘어가지 않습니다. 알파 블렌딩은 개악마 니까요.

분명 짤리는 일은 더이상 생기지 않습니다. 그리는 순서가 앞뒤가 바뀔 수는 있겠지만, 그렇다고 해도 뒷면이 안보이는건 아니잖아요? A+B 나 B+A 나 똑같지 않습니까?
라고 생각하기 쉽습니다만, 세상이 그게 또 그렇지 않습니다.


자아, 마음을 가라앉히고, 찬찬히 디벼보도록 합시다.

어머나 여기 갑자기 아주 돈을 많이 벌 수 있을 것 같은 게임 스크린샷이 있습니다. 무슨게임인지는 모르겠지만 말입니다 음하하.

자아 이게 배경이라고 치고요.
여기에 이펙트 두 개가 터집니다.
하나는 붉은 색 이펙트로, 80%의 투명도를 가져서 20%만 보이는 이펙트고요
또 하나는 푸른 색 이펙트로, 50% 만 보이는 이펙트입니다.


그럼 예상하기로는 뭐... 20+50 = 70이니, 뒷 배경은 30%이고 ... 나머지 푸른색과 붉은 색이 50대 20으로 잘 더해진 보라색이 나오리라고 예상할 수 있을 겁니다.
네 쉽지요.
뭐.. 여기서 붉은 색과 푸른 색이 뒤바뀐다고 별 차이 있겠습니까?
다 거기서 거기지요.

그래서 순서를 뒤집어서 섞어 보면, 이렇게 됩니다.
으엥? 위의 것은 붉은색을 먼저 그리고 푸른색을 나중에 그린 것이고,
아래 것은 푸른색을 먼저 그리고 붉은색을 나중에 그린 것입니다.
분명 둘이 다릅니다. 그것도 확연히 다릅니다. 이유가 무엇일까요?






자아 다시 한 번 보도록 하겠습니다.


여기 녹색이 있습니다. (0.0f,1.0f,0.0f)
이건 배경색입니다. 게임에 반투명이 그려지기 전, 불투명만으로 이루어진 칼라란 말입니다.

그리고 여기에 붉은 색 20%가 반투명으로 추가되었습니다. 이제 나온 칼라는 녹색 80%, 붉은 색 20% 로 이루어지게 되었습니다.

자아, 여기에 50%의 푸른색이 추가되었습니다.
이 부분에서 잘 보세요. 우리가 최종으로 푸른색을 50% 로 출력하고, 나머지 칼라(녹색80% 붉은색 20%가 더해진 칼라) 를 50% 출력하는 것입니다.
그러므로 최종 결과는? 푸른색 50% 녹색 40% 붉은 색 10% 가 되는 것입니다.
이게 최종 칼라죠.








근데 이번엔 아까와 같은 녹색에
푸른 색 50% 가 먼저 찍혔다고 칩시다.
그러면 결과물은 푸른색 50% 에 녹색 50%. 흐음. 네에. 좋습니다.

그리고 이제 다시 붉은 색 20% 를 더하는 거죠.
그럼 20% 는 붉은 색이고, 나머지 80% 가 이전색 (푸른색 50% 녹색 50%) 이니까...
최종 결과물은? 붉은색20% 푸른색40% 녹색 40% 가 되는 것입니다 !!!!








자아 두 결과물을 비교해 보시죠.


  R 10% G 40% B 50% 

R 20% G 40% B 40%


부부부 분명히 다릅니다!!!! 심지어 푸른색과 붉은색이 둘 다 50% 라고 해도 다릅니다!!! 즉 섞이는 순서에 따라 전혀 다른 색이 나오게 된다는 것입니다... !!!

즉 Read(Test) On Write Off 를 사용해서, 반투명인 것이 둘 다 짤리지 않고 보이는 것은 좋은데, 그래도 찍히는 순서에 따라서는 색이 차이가 날 수 밖에 없다는 겁니다!!! 역시 개악마 알파 블렌딩!!! 끝끝내 물고 늘어지는군요!!!!!



그렇습니다. 우리가 최종 보루로 여겨왔던 이 방법도, 완벽한 방법은 아니었습니다.
물론 좋은 방법이고 가장 성공할 확률이 큰 방법이긴 하지만, 이것만으로는 완벽하게 해결되지 않는다는 것입니다.
앞뒤 순서만 제대로 제어가 된다면 이 방법이 가장 좋은 방법이긴 합니다.


자아. 이제 진짜로 마지막 결론을 내릴 때가 되었군요.

그렇다면 어떻게 해결해야 할까요?








방법은 바로 '적절한 때에 적절한 방법을 섞어서 써야한다' 라는 것입니다.
지금은 단순히 알파 블렌딩에 대해서만 얘기했지, 블렌딩 옵션에 대해서는 또 전혀 얘기하지 않았습니다.
어떤 경우에 한해서는 합해지면 더 밝아지는 add 옵션이나 더 어두워지는 multi 옵션을 사용해야 하는데, 그럴 경우 또 여기서 한 단계 더 문제가 꼬여지게 됩니다. 이럴 경우에는 정말로 '그때에 맞춰서' 만드는 수 밖에 없는 거지요.

그래서 가장 많이 사용하는 방법은 '그룹핑' 입니다.
적당한 오브젝트끼리 그룹을 지어서, 어떤것을 먼저 찍을 것인지를 미리 정해놓는 것입니다.
기본적으로는 pivot 점을 기준으로 해서 결정하겠지만, 그 보다 큰 기준을 정해놓고 몇 개의 그리는 레이어를 나눠 놓는 방식을 사용하곤 합니다.

예를 들면, 물은 반드시 맨 아래 찍히는 녀석이니 맨 처음에 그립니다. (게임에 따라 다르지만...)
그래서 물 오브젝트를 만들고 그룹설정을 '물' 로 해 놓으면 다른 반투명 오브젝트보다 먼저 그립니다.
그 다음은 '데칼' 이겠지요. 바닥에 인터페이스 류의 데칼이 그려진다던가 하면 그 다음 레벨로 그룹핑합니다.
그 다음은 이펙트겠지요. 그 다음은 구름.. 등등
무식하게 나누면 위와 같이 레이어를 나눠서 Grouping 할 수 있겠지만, 실제로는 게임의 특성에 따라 다양한 방식으로 나눠서 해결하곤 합니다.

이런 식으로 그룹을 만들어 놓으면, pivot에 우선되어 그리는 순서를 결정하게 되고, 역시 완벽하지는 않지만 상당 부분 해결할 수 있게 됩니다.

그러므로 Z 버퍼와 알파 블렌딩은 ,

경우에 따라 가장 적합한 방법을 복합적으로 사용하는 것이 정답입니다.


다소 얼빵한 결론처럼 보입니다만, 실제로 요즘의 최신 게임도 이 문제로 종종 오류가 보이곤 합니다.
그러므로 그것이 개악마 알파 블렌딩과 싸울 수 있는 방법이며, 이렇기 때문에 현재까지 수많은 개발자들이 개악마 알파 블렌딩과 싸우려 노력하고 있는 것입니다.
자아 이제 진짜로 끝났습니다. 진짜예요. 다소 결말 부분이 오래 걸렸습니다만, 어쨌건 끝냈단 말입니다. 아아 힘들어요. 다시는 안해요 이런거. 블렌딩 옵션까지 끼었으면 엄청날 뻔 했지 뭐예요...

그럼 이렇게 예상치도 못하게 7강까지 끌었던 Z 버퍼의 Read/Write 개념을 끝내겠습니다.
그동안 봐주셔서 감사합니다. :)

덧글

  • 오즈라엘 2010/04/05 16:43 #

    오오~ 훌륭한 강좌입니다. 사실 읽지는 않고 그림만 봤습니다 -ㅉ-; 아티스트분이 이런 강좌도 쓰신다는게 정말 존경스럽습니다. 테크니컬 아트 디렉터는 부지런해야되나봐요
  • 김윤정 2010/04/05 17:17 #

    에잇! 오즈라엘님은 그림만 봐도 뭔지 다 아시잖아요 -_-; 미천한 제 수준엔 이정도가 한계...
    그래픽 디자이너들 보라고 만든거니까요 뭐. 박쥐 직업인 사람은 할 수 없이 중간에서 이쪽저쪽 붙어다녀야 먹고 살죠 ㄷㄷㄷ
  • 김윤정 2010/04/05 17:18 #

    아참 틀린것이나 더 좋은 내용 있으면 알려주세용 굽신굽신
  • 오즈라엘 2010/04/13 10:14 #

    사람은 여기 붙었다 저기 붙었다를 잘해야 먹고살죠 케케케 부럽심. 아저씨 블로그 오면 재미있는게 많아서 끊을 수가 없어요 +ㅈ+
  • 김윤정 2010/04/13 10:35 #

    우엥 아저씨 OTL (는 맞지만... ㅋㅋㅋ)
  • 캐런 2010/05/04 17:08 #

    좋은 강좌 잘 봤습니다! 대충 살아가는게 이정도라니!!!
  • 김윤정 2010/05/04 17:09 #

    감사합니다! 잔머리 안굴리고 대충 사는 개발자입니다!
  • 마들렌 2012/02/16 10:48 #

    벌써 2년전에 쓰신글인데 ... 이걸 이제 보다니 ... 감탄했습니다 ! 개인적으로 독학하는 중이라 알파 블렌딩때문에 돌아가시는줄 알았는데 개념 정리에 아주 그냥 ㅋㅋㅋㅋ 감사합니다 ^^^^^^^^
  • 김윤정 2012/02/16 14:15 #

    벌써 2년이 되었나요 ㄷㄷㄷㄷ
    지금보니 난잡하게 쓰인게 많이 보이네요. 한 번 정리하면 더 깔끔하게 쓸 수 있을 것 같습니다 :)
※ 로그인 사용자만 덧글을 남길 수 있습니다.


MyADD

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