본문 바로가기
유니티/Shader Study

Orthographic Depth (Soft Partcle Factor를 오쏘그래픽에서 사용되게 만들자!)

by witn331ss 2024. 1. 28.

https://cyangamedev.wordpress.com/2020/03/05/orthographic-depth/ << 이 사이트를 참조함 걍 천재같음 이녀석

 

목표는 Soft Particle Factor, 즉 게임 내의 입자가 다른 물체 뒤로 사라질 때 자연스럽게 보이도록 만드는 것이다.

 

 

Clip space Z 를 먼저 처리한다.

 

스크린 포지션은 지금 렌더링되고있는 픽셀의 공간좌표를 제공하는데

Raw는 보정되지 않은 공간좌표를 그대로 출력한다. 즉 픽셀의 xyz 값을 제공하는 것

 

거기서 우린 xy는 필요 없으니까 z만 가져다가 쓸 것이다.

 

 

다음으로 Surface Depth 를 처리한다.

 

커스텀 펑션에 쓰인 것은 다음과 같다.

아웃풋 : vector2


Out = float2(
UNITY_NEAR_CLIP_VALUE,
UNITY_RAW_FAR_CLIP_VALUE
);

 

무슨말이냐면

"UNITY_NEAR_CLIP_VALUE"와

"UNITY_RAW_FAR_CLIP_VALUE"라는 두 개의 내장된 Unity 값으로 벡터2를 생성하여 반환한다.

 

이것은 셰이더가 렌더링 할 때 카메라의 근접 및 원거리 클리핑 값에 접근해서 이 것을 기반으로 계산한다는 뜻이다.

 

그 다음 그 값을 Remap으로 매핑해서 0과 1사이의 값을 가지게끔 만들어준다.

 

 

그 다음 계산된 값을 뷰공간 단위로 변환해주는 것이다.

이것으로 살짝 그 뭐시냐 행렬처럼 오쏘에서 계산한걸 뷰 프리스텀으로 옮긴 것 처럼 거짓말을 쳐준다고 해야하나

암튼 그렇다

 

다음

 

 

이 과정에서는 Z 버퍼의 방향이 역전되었는지 여부를 처리한다.

그래픽스 시스템에서는 Z버퍼의 값이 더 높은 것이 카메라에 더 가까운지 여부를 처리하는데

그걸 살펴봐주는 노드라고 생각하면 된다.

 

Comparison 노드를 사용해 카메라의 Z 버퍼와 0 중에서 뭐가 더 큰지 계산한다.

 

만약 0보다 크면 보정안된 scene depth xyz 값이 들어가고

0보다 작으면  scene depth xyz 를 역전한 값을 집어넣는다.

 

 

이것도 동일하게 단위를 뷰공간으로 변환해주자.

 

 

그 다음 준비된 두 값의 깊이차이를 계산한다. 

여기서 뭐 추가할거 추가하고 saturate으로 클램프 걸면 순수하게 구하고 싶은 뎁스가 보인다.

 

 

이제 이걸 알파에 넣어서 요리하면 되는것 ㅋ