알파 객체 그릴때 나타날 수 있는 문제.


원문  http://blog.naver.com/sharbong/100021772281

역시 불펌.

오늘은 심심해서, 파티클을 (뭐 이야기 하자면, 알파객체들이라고 할 수 있겠지.) 사용하면서 나타나는 문제에 관해서  이야기 해볼까 한다.


이걸 보고 도움이 되는 사람이 있을지 좀 의문이기는 하지만, 초보자들에게는 도움이 될거라고 생각한다. 내가 쓰는게 좀 하는 사람들은 다 아는 내용만 쓰는 거니 새삼스럽게 뭐라하지 마시고 아시는 분은 패스~!

 

뭐 하여간 이야기를 시작해보자.



<@NHN@LINEBREAKER@NHN@>

일반적으로 파티클들은 쿼드(사각형)로 만들어서 안에 텍스쳐등을 사용해서 효과를 만든다.

그리고 그 파티클들은 아티스트들이 툴에서 자기 마음대로 알파블렌딩함수를 설정해서 멋지게 만들어 게임에 사용하게 된다.


문제는 이때 툴상에서 보이는 문제와, 실제 게임상에 올렸을때 (뭐 월드툴 정도라도 나타날 수 있다고 생각 되지만..)나타 날수 있는 문제들이 있다.


일단 툴 (여기서는 이펙트 툴을 말한다.)에서 나타날 수 있는 것은 객체 가림현상이다.

우선 우리가 일반적으로 렌더링 할때, Z버퍼를 사용한다.

Z버퍼를 사용한다는 것은 두가지로 나눌수 있다. Z버퍼를 참고하는 것과 Z버퍼를 갱신하는것.

그리고 일반적인 객체를 그릴때는 두가지를 다 사용한다.


 하지만 알파객체들은 그렇지 않다. Z버퍼를 참고하기는 하지만, Z버퍼를 쓰지 않는 것이다.

(이후부터는 갱신이라고 하겠다.)

이것은 객체의 알파부분이 Z버퍼를 갱신해버리면, 실제 구멍이 난 부분까지도, Z버퍼는 모두 갱신해버리기 때문이다. (일반적인 구멍일때는 알파테스트를 사용하는데, 이것은 알파검사해서 미달되는 부분을 아에 그리지 않는 것이라 Z버퍼도 역시 갱신하지 않는다.). 이것은 잘못하면, 그객체 뒤에있는 것이 안보이고, 가려지는 것을 보이게 된다는 것이다.

이것을 해결하기 위해서, 알파객체는 Z버퍼에 값을 갱신하지 않는 것이다.

지금 설마 아에 [Z버퍼를 안쓰면 되지 않는가?] 하는 생각을 가진사람이 있는가?


도전정신은 좋다. 하지만 틀렸다고 이야기 해주고 싶다.


알파객체는 우선 불투명객체 이후에 렌더링을 한다.

그래야만 알파블렌딩이 똑바로 되기 때문이다. 그런 상황에서 Z버퍼를 쓰지도 않는다면, 어떻게 될것인가? 불투명 객체 뒤에 있는 알파객체들이 다 덮고 나타나는 사태가 발생해 버릴것이다.


자 그럼 이제 알파객체는 모두 Z버퍼를 쓰면 우리가 원하는 (정확하게 아티스트들이나, 디자이너들) 알파객체가 되었는가? 그것 또한 아니다.


알파블렌딩은 이전색과 어떻게 합성하는가를 결정하여 결과물을 나타내는 것이다.

이것은 결국 이전색이 무엇인가에 따라서 결과물이 달라질 수 있다는 것이다.

즉, 그리는 순서가 중요하다는 것이다.


이점에 대해서 의문을 품고, 어째서냐는 생각을 가질 수 있을 것이다.

나도 그랬으니, 그 마음 이해 한다.

그리는 순서가 중요하지 않는 알파블렌딩 함수는 Src나 Dest가 one 이 되는

ADD 형태의 알파블렌딩만이 가능한 것이다. 수학적으로도 생각해보면 간단하다.


덧셈과 뺄셈은 앞뒤 순서 아무리 바꿔도 결과는 같다. 하지만, 곱하기가 끼면 어떻게 되겠는가?

결과는 순서에 따라서, 완전히 달라지는 것이다. 이것은 즉 알파블렌딩도 마찬가지라는 것이다.

결국 카메라 기준으로 멀리있는 것부터 그려야 올바른 결과가 나올 것이다.

자 여기서 또 의문.


그럼 소트만 하면 되는 것 아닌가? 또한 알파객체라도 Z버퍼를 갱신해야 하는 상황이 있지 않은가?

틀린 말은 아니다. 여기서 부터는 선택에 문제이다.

일단 소트만 하면 되는 것 아닌가에 대한 문제부터 이야기 해보자.

소트를 하면 [망고 끝. 다리 쭉펴고 자자!] 라고 생각하기 쉽지만, 세상사는게 그리 쉽지 않은 것을 보여주기라도 하듯이, 알파객체가 그냥 쿼드만 있는게 아니고, 다양한 모양을 가지고 있고, 부피를 가진 형태로 있을때, 소트를 뭘로 기준으로 하는가 하는 문제가 발생한다.

대체로 소트는 그객체의 중심점을 기준으로 해서 하는데, 결국 부피를 가진 녀석은 먼저그려지고 나중에 그려질 알파객체가 못그려지도록 Z값이 갱신시켜버리는 사태가 발생 할수 있다는 것이다.

(사실 이것은 Z버퍼가 필요로 한 이유와도 유사하다.)

그래서 Z버퍼 갱신은 하지 말야 한다.

하지만 Z버퍼를 갱신을 해야하는 알파객체가 존재할 수 도 있다.

예를 들면, 큰 바위가 있는데, 천천히 투명해지면서 사라질때, 그 바위뒤에 있는 알파 객체들이

갑자기 앞으로 나와버리는 사태가 (중심점은 앞에 있지만, 객체부피로 봤을때는 뒤에 있는 알파객체) 발생할 수 있다는 것이다. 더 간단한 예는, 객체의 반은 불투명이고, 반은 알파인 객체.

뭐 그게 아니고, 일부분이라도 알파로 그려야 하는 객체들. 그런것이 있을때 분명 Z버퍼를 갱신해야 한다. 그래서 이것은 선택의 문제라 할 수 있다.


그런 상황을 아에 만들지 않게 만들던가. 아니면 빠르게 해서, 해결하던가, 그냥 Z값을 쓰던가.

선택에 남은 것이다.


다음은 게임상에서 발생할 수 있는 문제인데....피곤하니 다음에 하도록하겠다.

글만 잔뜩쓰고, 그림한점 없어서 매우 미안하게 생각하지만, 알아두면 실제 알파문제를 보면 바로

[아~! 이걸 말하는거였군!] 할 것이다.


그럼.



추가글 : 결론은 알파객체는 Z버퍼를 사용하지만 갱신은 하지말고, 소트는 필수다.

Posted by kaoru

2008/01/31 13:57 2008/01/31 13:57
Response
0 Trackbacks , 0 Comments
RSS :
http://kaoru.teamnop.com/blog/rss/response/351

Trackback URL : http://kaoru.teamnop.com/blog/trackback/351

Leave a comment
« Previous : 1 : 2 : 3 : 4 : 5 : 6 : 7 : Next »

블로그 이미지

kaoru 의 일기장 입니다.

- kaoru

Tag Cloud

Archives

Authors

  1. kaoru

Calendar

«   2010/09   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

Site Stats

Total hits:
139313
Today:
6
Yesterday:
38