참치김밥은 최고의 한식이다

[유니티] Force Field 쉐이더 만들면서 이해 안갔던 부분 정리 본문

Unity

[유니티] Force Field 쉐이더 만들면서 이해 안갔던 부분 정리

l__j__h 2024. 2. 20. 16:58

일단 내가 공부하기 위해 참고한 링크이다. 혹시 쉐이더 공부하려고 이 글을 방문했다면, 아래 블로그 추천함

https://m.blog.naver.com/rmavy0989/221945829681

 

Depth Buffer를 사용해서 보호막 이펙트 만들기

장면 깊이(Depth Buffer)를 가져와서 오브젝트가 닿는 면을 강조하는 예제를 만들어봅니다. 이 방법을 응...

blog.naver.com

 

이해 안 갔던 부분 ①

왜 Scene Depth - Screen Position.w 을 하는지?

  • Scene Depth (Sampling Mode = Eye)
    • 오브젝트가 카메라로부터 얼마나 떨어져 있는지를 [픽셀단위]로 기록해 놓은 수치입니다.
  • Screen Position.w (Mode = Raw)
    • The 'w' component of the "Screen Position" node in "Raw" mode represents the raw depth value of a pixel on the screen, indicating the depth in screen space.
    • 스크린 스페이스에서 픽셀의 Depth를 나타낸다.

이해한 과정

위 그림에서 파란 화살표는 장면 깊이(Scene Depth), 빨간 화살표는 오브젝트 거리(Screen Position.w)

Scene Depth(장면 깊이)도, 스크린 포지션의 w도 둘 다 오브젝트에 대한 Depth를 표현한다고 했는데, 왜 두 값이 가리키는 화살표 모양이 다른가?? 봤더니, 상단 포스팅의 댓글에 답이 있었다.

더보기

💡 개념 정리를 위해 구글링 하는중에 추가 설명해드립니다.

씬뎁스 값에서 픽셀 뎁스값을 빼는게 가능한 이유가

씬뎁스(장면 깊이)의 경우 반투명 컬러에 대한 연산을 하지 않습니다.

위에 구체 오프젝트의 서페이스 타입을 불투명으로 하셨을때 검은색으로 나오는 이유도 같은 이유라고 보시면 됩니다.

 

씬뎁스의 경우, 반투명 컬러, 즉 Transparent로 설정된 Sphere에 대한 연산을 하지 않으므로, 바닥면(Opaque)에 대해서만 연산을 해서 빨간 화살표보다 더 길게 계산되는 것이다.

이해 안 갔던 부분 ②

왜 Screen Position의 ‘w’ 값을 사용하는지??? z값이 아니라??

더보기

💡 screen.w은 해당 오브젝트의 장면 깊이값이다.

즉, 해당 픽셀이 얼마나 카메라에서 떨어져있는지를 정규화된 수치로 기록해놓는다고 할 수 있다.

모든 오브젝트는 사용자의 요구에 따라 장면깊이(scenedepth)에 미리 기록되어 사용될 수 있는데

그 과정에서 screen.z가 사용된다고 한다.

즉,

screen.z (정규화된 w깊이갚을 기록하기 위해 사용)

screen.w(이미 정규화된 w값)

 

우리는 이미 정규화된 scenedepth를 가져오므로

정규화되지 않은 오브젝트의 픽셀z로 계산하는것이 올바르지 않을 것이다.

그래서 w를 사용하는 것이다.

 

→ 값의 정규화 여부를 일치시키기 위해서!!

728x90