본문 바로가기
programing/Graphics

Z 버퍼 & AlphaTesting & AlphaBlending

by RedWiz 2016. 8. 25.

깊아 값을 이미지로 만들어 놓아서 저장 한 것


Z Read(Z값을 읽는다) : Z값에 기록된 상태를 읽어서 자신이 그려지는지 확인


└ = Z Test(Z값을 테스트 한다)


Z Write(Z값을 쓴다) : 자신이 기존의 Z값보다 앞에 있다면 자신의 Z값을 덮어씌워 기록






AlphaTesting

└ 뒤에 있어도 보여져야 함. ( ex.유리창 뒤에 있는 공은 유리창에 반쯤 영향 받은 채 보임 )

└ 깊이테스트(뒤에 있으면 그리지 않음)를 무시해야 함.

└ 알파 채널 단계 중 일정 부분을 정해서 투명도를 0또느 1로 정해버림(반투명이 없음)

└ 해당 픽셀이 보이는가 안보이는가만 임의대로 결정

└ 퀄리티가 다소 떨어짐

└ 정렬은 생각하지 않아도 됨

└ 주로 나뭇잎, 풀 등의 표현에 사용 (양이 많고 크기가 작기 때문에)

└ AlphaBlending보다 비용이 적게 듦


AlphaBlending

└ 모든 픽셀이 언제나 보일 수 있음. ( ex.반투명의 유리가 수 십장 겹쳐져 있어도 전부 보임 )

└ Z버퍼에 의한 거리 판별은 무의미, 모든 픽셀은 이 픽셀이 보인다는 가정하에 얼마나 보이는 가 계산

└ 불투명한 오브젝트라도 일단 계산에 무조건 올라감

└ 중간에 불투명한 오브젝트가 끼어 있을 수 있기 때문에 깊이 테스트는 필요함

=> 제대로 sorting을 하지 않으면 가려진 투명한 오브젝트가 보일 수 있음

=> 가로지르는 경우 우선되지만 뒤에 있는 부분이 앞에 있는 부분을 가림

=> 머리의 경우 앞과 뒤가 동시에 보여질 수 있음

-> 방법 : 잘게 쪼갬, 알파 부분을 최소화, 알파 테스팅 사용

-> 프로그램팀 : 렌더링 레이어, 여러 Pass 사용

└ 이펙트에 사용, 투명한 유리 효과나 비치는 옷에 사용


>불투명한 것은 Z버퍼만으로 앞뒤 구별이 가능하니, 대충 찍어도 됨

>반투명한 것이 끼어 버리면 문제가 되므로, 불투명한 것 먼저 찍고 반투명한 것을 나중에 모아서 찍음

>반투명인 것은 먼저 찍히냐 나중에 찍히냐에 따라 문제가 생기기 때문에 반투명한 것은 순서를 판정해서 뒤에서부터 앞으로 찍어옴







Z Read = Off Z Write = On

└ Z Read = Off : 그려지는지 확인 안하고 무조건 그려짐

└ Z Write = On : 기존의 Z값보다 앞에 있다면 자신의 Z값을 덮어씌워 기록, Z값을 쓰기 때문에 나중에 생기는 오브젝트는 자신의 뒤로 가려짐

└ 알파 블렌딩을 사용할 때 짤림 현상이 일어나지 않음

└ 반투명한 것은 불투명보다 나중에 그림 -> 다른 오브젝트에 가려지지 않고 무조건 보이게 됨

└ Interface에 사용


Z Read = Off Z Write = Off

└ Z Read = Off : 그려지는지 확인 안하고 무조건 그려짐

└ Z Write = Off : 덮어 씌워지기만 함 => 뒤에있는 오브젝트를 나중에 그려도 오브젝트가 앞에 그려짐

└ Skybox에 사용


Z Read = On Z Write = Off

└ Z Read = On : 그려지는지 안그려지는지 확인

└ Z Write = Off : 덮어 씌워지기만 함

└ 알파 블렌드에 적절하게 됨 (앞에서부터 그려도 가려지는 일이 없음)

└ 순서에 따라 섞여지는 색이 달라짐



cf.

D3DRS_ZENABLE
- z버퍼를 유효하게 하라면, D3DZB_TRUE, w버퍼를 유효하게 하려면 D3DZB_USEW, 깊이 버퍼링을 무효하게 하려면 D3DZB_FALSE를 쓴다.


D3DRS_ZWRITEENABLE
- APP에 의한 깊이 버퍼에 쓰기를 유효하게 하려면 TRUE로 설정하여, 시스템이 새로운 깊이 값으로의 깊이 버퍼 갱신을 막을 수 있다.


cf. 참고

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

7부 바로가기