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

우왕. 이 부분이 아무래도 Z 버퍼와 알파블렌딩, 소팅의 개념까지 짬뽕되어 들어가는 곳이라
"우왕 이거 아무래도 간단하게 설명하기 힘들겠는걸..." 이라고 생각했는데 과연. 2부까지 써 보니 제대로 하려면 6부는 되어야 하는거 아닌가 - 라는 생각이 드는군요.

어쨌건 벌여 놓은 일은 마무리를 해야 하니.. 콜록.

==================================================================================

자 지난 시간까지 알아본것을 한 마디로 요약하면 '알파 블렌딩을 쓰면 Z 버퍼가 엉망이 되니 불투명 오브젝트부터 먼저 그리고 나중에 반투명 오브젝트를 몰아서 그리면 된다. ' 라는 것이었습니다.

네 그럼 될 것만 같습니다.

아이 신나라.




 


즉 불투명 오브젝트부터 먼저 그립니다. 랄라.
이 녀석들은 이전에 말씀드렸다시피, 어느게 먼저 찍혀도 상관이 없습니다. Z read(Test)와 Write 만 하면 완벽히 그려지니까요.


그다음 반투명을 그립니다. 역시 그리는 순서는 뒤죽박죽입니다. 왜 뒤죽박죽이냐고요? 길게 설명하진 않겠습니다만, 당연합니다. -_- ;;; 들어오는 순서대로 그리다보니, 앞에 있는지 뒤에 있는지 판단하지 않고 그냥 오는대로 그려서 그렇습니다.

자 이놈들도 Z Read(Test) / Write를 물론 합니다.
문제가 해결 될 것만 같습니다. 아이 기뻐라.


근데, 역시 문제가 생깁니다. 알파 블렌딩은 말씀드렸다시피 개악마 니까요 . 


그렇습니다. 반투명끼리의 앞뒤판정!!!

즉 아래와 같이 반투명 이미지가 있다고 칩시다.
알파는 이렇구요


뭐 이러면 게임에서는 이렇게 나오는걸 기대할 수 있겠죠.

그치만, 가끔 이렇게 나옵니다..!! 뭥미 이건!!!!
그림을 보고 이해가 가십니까? 위의 것은 뒤의 나뭇잎이 먼저 그려지고 앞의 나뭇잎이 그려져서 문제가 없었지만,
아래의 것은 앞의 나뭇잎이 먼저 그려지면서, 투명한 부분에도 그림은 그리지 않았지만 Z 값은 Write 해 버렸기 때문에 뒤의 나뭇잎이 그려질때 Z 값을 Read(Test) 하다가 보니 이미 자기 앞의 Z 값이 있으니 그리는데 실패해서 이렇게 나오게 되는 것입니다.

여기까지 설명하면 보통 그래픽 디자이너분들은 이렇게 얘기하죠. (실제상황)

아니 그러니까 프로그래머들이 다 해결 가능하면 내가 이걸 왜 쓰고 있겠냐고.





자아 . 기존에 반투명과 불투명인 것들끼리도 저런 문제가 생겨서, 불투명한걸 먼저 그려서 해결했었습니다.
그런데 이번엔 반투명한 것들끼리 동일한 문제가 생기는군요. 그래서 알파 블렌딩은 개악마입니다

이걸 해결하는 법은 무엇일까요?
그래서 이것을 해결하기 위해 많이 사용되는 방법은 "줄세우기" 입니다.
"그렇다면 반투명인 것들은 뒤에서부터 그리면 되잖아!!!" 라는 것입니다.
오호라. 과연 명안이십니다.

 
그렇습니다. 반투명인것들만 따로 모아서, 줄세우기를 하는 것입니다.



불투명한 것들은 기존에 그리듯이 그냥 막 그리고 (그래도 불투명한 것들도 앞에서부터 그리면 퍼포먼스가 좋아지긴 하지만요)
반투명한 것들을 그릴 때, 줄세워서 뒤에 있는 녀석들을 먼저 그려버리는 것입니다.

오늘은 휴일이다보니 좀 더 길고 자세하게 짤방도 넣으면서 쓸 수 있다능.


그림으로 앞뒤판정하기 좀 힘들지만, 대충 써 보면 저런 순서대로 정렬이 되겠군요.
아이 좋아라. 이제 반투명한 것들 끼리도 Z 값 걱정없이 그릴 수 있게 되었습니다.
물론 이게 부하가 장난이 아닙니다... 당장 화면에 나뭇잎이 수천장이 있는데 그게 모두 알파 블렌딩이라면... ㄷㄷㄷ
다 모아서 매 프레임마다 ( 초당 30번씩) 어떤게 앞에 있는지 판정하는 것도 보통 일이 아닌 겁니다.
그래서 일단 알파 블렌딩은 부하를 엄청나게 먹고 갑니다.

어떤게 앞에 있는지 정렬하는 부하도 물론 있는데, 거기에다가 또 뒤에 있다고 안그릴 수도 없습니다. 맨 뒤부터 그리다 보니 화면에 존재하는 모든 알파 블렌딩은 일단 다 그려 버린다는 거지요. 불투명한 것은 뒤에 있으면 안그리면 되지만 알파 블렌딩은 뒤에 있어도 보일수 있다는 전제로 그려지는 방식이거든요. 그러니 절약할 수 있는 구멍이 하나도 없습니다.

...알파 블렌딩을 남발하면 당신의 게임 퍼포먼스를 최악으로 만들기는 매우 쉽습니다.



자 뭐 퍼포먼스는 프로그래머들이 어떻게 해 주겠지 라는 무책임한 생각을 가지고, 어쨌건 이렇게 하면 일단 문제는 다 해결된 것 같습니다만, 아직도 문제는 또 남아 있습니다. 알파 블렌딩은 개악마 니까요.


4부 개악마 알파 블렌딩 3편에서 계속...

핑백

덧글

  • The Nerd 2010/03/13 14:00 #

    혼자서 알파 블렌딩을 구현하다가 머리를 쥐어뜯던 후로그래머 친구 생각에 저도 모르게 눈물이..
  • 김윤정 2010/03/13 20:32 #

    이론대로 안되는 경우가 꽤 되거든요. 프로그래밍 이론은 일종의 실험실 이론이기 때문에, 실제로 사용하다가 발생하는 오차가 꽤 있으니 괴롭지요 :)
  • makio 2010/03/13 14:17 #

    아아.. 이래서 저렇게 그려지지 않는 부분이 생기는군요- -;;
    4부가 기대됩니다 ㅎㅎ^^
  • 김윤정 2010/03/13 20:33 #

    감사합니다. 앞으로 설명할 길이 막막..
  • 원심무형류 2010/03/13 20:39 #

    그냥 포기하고 알파테스트로...
  • 김윤정 2010/03/13 20:45 #

    앗 스포일러다
  • 원심무형류 2010/03/13 21:12 #

    헉!
  • 왕풍뎅이 2010/03/13 21:20 #

    어머 이런 머리아픈글을 적다니 악마
  • 김윤정 2010/03/13 21:21 #

    응? 네 레벨엔 쉬운글 아니었냐
  • ohyecloudy 2010/03/14 19:59 #

    크하하. 개악마. 아주 적절한 표현입니다.

    "이제까지 힘들었지? 내가 반투명 오브젝트를 알아서 처리할께. 소팅하지 말고 넘겨"라는 A-buffer가 DirectX 11에 들어간다는 얘기가 있어서 무척 기대했는데, DirectX 11 RTM을 보니 그런 얘기가 하나도 없네요. 흑~ 기대했었는데...
  • 김윤정 2010/03/15 02:32 #

    으아악 그럼 DX11을 쓰는 시대에도 저걸가지고 고민하고 있어야 하는 겁니까
※ 로그인 사용자만 덧글을 남길 수 있습니다.


MyADD

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