depth bias blend는 겹쳐진 오브젝트들의 경계면이 날카롭게 되는것을 픽셀 셰이더 단에서 뒷 오브젝트와의 거리가 근접할 수록 alpha 값을 빼주어 부드럽게 만드는 방법이다.
디퍼드 렌더링에서는 Depth Buffer에 깊이값을 기록해두고 있으므로 이 렌더타겟에 기록된 값을 가져와 지금 그릴 오브젝트와 이미 그려진 오브젝트의 거리를 얻을 수 있다.
소프트 파티클은 아니지만 이 방법을 이용해서 배리어와 겹쳐지는 부분의 alpha를 1로 주어 효과를 줄때, 경계면의 픽셀들은 원하는 색으로 칠할 수 있다.
문제는 반투명한 구체를 생성하여 Back face culling을 껐을 때 위의 이미지처럼 얼룩지는 경우가 생긴다.
Depth Read를 끄고 렌더링
깊이 버퍼 읽기를 끄고 렌더링했을 때는 "일단은" 의도한 대로 나왔다.
알파 오브젝트를 CULL NONE으로 렌더링할 때
Z값이 깊은 픽셀이 먼저 렌더링 파이프라인을 통과해 그려지면 정상적으로 앞에 있는 픽셀이 그려지지만
반대의 경우 같은 물체라도 Z값이 깊은 픽셀이 나중에 그려지면 뎁스 테스트에서 실패해서 픽셀 기각이 되는 것 같다.
그래서 Depth Read를 껐을 때 뒤에 있는 픽셀이 나중에 그려지게 되더라도 깊이버퍼에 있는 깊이 값을 무시해서 일단 그리므로 얼룩지지 않고 원하는 모양대로 나오는 것.
Two-Pass Rendering
하지만 완벽하게 원하는 모양은 일반 오브젝트에는 정상적으로 가려진 투명 구체이기 때문에 2pass로
CULL FRONT로 백 페이스를 먼저 그리고, CULL BACK으로 프론트페이스를 그려준다. 이 방법으로 그릴 경우 후면 구체가 그려지고 난 뒤, 전면 구체가 그려지므로 깊이 버퍼와는 상관없이 원하는 모양대로 그릴 수 있다.
셰이더
G-Buffer의 깊이 텍스처를 먼저 가져와야한다
뷰공간에서 깊이 값을 비교해서 거리가 가까운부분의 색은 무조건 흰색으로 칠해주고 있다.
'2020 이전 > DirectX' 카테고리의 다른 글
다이렉트X Stream Output을 이용한 파티클 (1) | 2019.09.19 |
---|---|
접선공간(tangent space) (0) | 2019.07.11 |
BMP맵 읽어 나무 심는 노인 (0) | 2019.07.10 |
비쥬얼 스튜디오 그래픽 디버깅 (0) | 2019.06.13 |
다이렉트X로 큐브맵 텍스처 만들때 (0) | 2019.06.12 |