Depth Buffer을 사용한 Shader 만들기

Depth Buffer가 무엇이냐? 너무 어렵습니다.. 

그러던 중 한 블로거의 글을 읽고 쉽게 이해가 돼서 저도 도움이 되고자 한번 후기를 작성해보겠습니다!

Depth Buffer란 장면 깊이라는 뜻입니다! 오브젝트가 닿는 면을 강조할 때 사용할 수 있다고 합니다. 렌더링 파이프라인에서 Depth Texture를 사용해야 합니다!

(참고 블로그 https://m.blog.naver.com/rmavy0989/221945829681)

일단 오브젝트 깊이를 위해 screen position 노드를 가져옵니다. split를 통해 알파값을 가져옵니다. Mode는 Raw로 설정하고 Screen Depth노드를 생성하고 Eye로 설정합니다. 

Transparent로 설정하고 씬을 보면 Plane에 닿아있는 부분이 조금 검정색으로 나타나는게 보일겁니다!

비교를 하기 위해 일반 스피어를 가져와봤습니다. 확실히 바닥과 닿은 부분이 까맣죠 왼쪽이? 넹~

(출처 -  https://m.blog.naver.com/rmavy0989/221945829681 )

렌더큐가 어떤 영향을 미치는지 알아봐야합니다! CPU는 다음 랜더링 큐의 번호에 따라 순서대로 오브젝트를 그리게 됩니다! 

바닥 오브젝트는 따로 설정한게 없으므로 Default값인 2000번호를 부여받게 됩니다.

바닥면이 먼저 그려지고 그다음 '구' 오브젝트가 그려지게 되면 구체는 바닥면에 대한 정보를 바탕으로 닿은 면적에 대한 연산을 수행할 수 있습니다! 즉 '구'오브젝트는 랜더링 큐 번호가 3000+@이므로 바닥보다 나중에 렌더링하게 되고 바닥의 정보를 얻어올 수 있다는 겁니다!

 

구체가 닿는 부분을 강조하기 위해서는 2가지 정보가 필요하다고 합니다

1. 장면 깊이

2. 오브젝트와 카메라와의 거리

 

이제야 Depth Buffer! 장면 깊이가 무엇인지 설명하는 내용이 나옵니다!

장면 깊이란 오브젝트가 카메라로부터 얼마나 거리가 떨어져 있는지에 대한 정보를 '픽셀단위'로 저장해논 수치입니다!

빨간선을 보면 카메라로부터 구 오브젝트까지의 거리가 같은 길이임을 뜻합니다! 파란색 선은 이제 빨간선의 연장선이죠!

즉 구 오브젝트의 위로 갈 수록 화살표의 길이는 차이가 나게 되는거죠! 파란색 선만큼!

화살표의 길이 차이가 0이면 검게 표시되고

화살표의 길이 차이가 1에 가까울수록 하얗(회색)게 표시되는 것이죠!

 

범위를 제한하는 Saturate노드를 이용해서 0~1로 제한합니다. 그다음 구체가 맞닿은 부분부터 보이게 하기 위해 One Minus 노드를 추가합니다!

마지막으로 Render Face를 Both로 해서 뒤에더 렌더링하게 만듭니다! 그럼 이렇게 원형 구가 투명하게 나오죠! 위로 갈수록 투명하고 바닥과 가까울수록 색이 진합니다! Depth Buffer를 활용한 예제였습니다!

 

최종 구현은

대충 이런느낌입니다 중앙으로부터의 offset값을 주어 투명도를 설정할 수 있습니다.

추가된 노드는 split노드에 offset Vector1값을 substract해준거뿐입니다.