2020 이전/DirectX

Depth bias Blend, Two pass Render 이용한 배리어 만들기

이상해C++ 2019. 8. 30. 20:45

depth bias blend는 겹쳐진 오브젝트들의 경계면이 날카롭게 되는것을 픽셀 셰이더 단에서 뒷 오브젝트와의 거리가 근접할 수록 alpha 값을 빼주어 부드럽게 만드는 방법이다.

 

디퍼드 렌더링에서는 Depth Buffer에 깊이값을 기록해두고 있으므로 이 렌더타겟에 기록된 값을 가져와 지금 그릴 오브젝트와 이미 그려진 오브젝트의 거리를 얻을 수 있다.

 

소프트 파티클은 아니지만 이 방법을 이용해서 배리어와 겹쳐지는 부분의 alpha를 1로 주어 효과를 줄때, 경계면의 픽셀들은 원하는 색으로 칠할 수 있다.

 

문제는 반투명한 구체를 생성하여 Back face culling을 껐을 때 위의 이미지처럼 얼룩지는 경우가 생긴다. 

 

Depth Read를 끄고 렌더링

깊이 버퍼 읽기를 끄고 렌더링했을 때는 "일단은" 의도한 대로 나왔다.

 

알파 오브젝트를 CULL NONE으로 렌더링할 때 

Z값이 깊은 픽셀이 먼저 렌더링 파이프라인을 통과해 그려지면 정상적으로 앞에 있는 픽셀이 그려지지만

반대의 경우 같은 물체라도 Z값이 깊은 픽셀이 나중에 그려지면 뎁스 테스트에서 실패해서 픽셀 기각이 되는 것 같다. 

 

그래서 Depth Read를 껐을 때 뒤에 있는 픽셀이 나중에 그려지게 되더라도 깊이버퍼에 있는 깊이 값을 무시해서 일단 그리므로 얼룩지지 않고 원하는 모양대로 나오는 것. 

 

Two-Pass Rendering

 

CULL FRONT만 적용하여 그린 구체

하지만 완벽하게 원하는 모양은 일반 오브젝트에는 정상적으로 가려진 투명 구체이기 때문에 2pass로 

CULL FRONT로 백 페이스를 먼저 그리고, CULL BACK으로 프론트페이스를 그려준다. 이 방법으로 그릴 경우 후면 구체가 그려지고 난 뒤, 전면 구체가 그려지므로 깊이 버퍼와는 상관없이 원하는 모양대로 그릴 수 있다. 

 

 

셰이더

G-Buffer의 깊이 텍스처를 먼저 가져와야한다

뷰공간에서 깊이 값을 비교해서 거리가 가까운부분의 색은 무조건 흰색으로 칠해주고 있다.