본문 바로가기
게임/Unity

3D에서 2D Sprite Depth 처리

by 신인용 2021. 3. 1.
반응형

 

 

 

1. 문제점

이 게임은 3D World에서 2D처럼 보이는 View를 가진다.

그런데 위와 같이 캐릭터가 움직이면 카메라가 갑자기 못 그려주게 되었다.

모든 2D Sprite가 마찬가지였다.

 

 

 

2. 원인

Unity는 기본적으로 렌더링할 때, Sprite 단위로 렌더링을 한다.

 

즉, Camera와 Sprite의 거리를 측정해서, 가까운 Sprite를 앞에 그려준다는 것이다.

 

나한테 생긴 문제에 적용시켜보면

Camera와 Ground의 거리Camera와 Player의 거리비교하여, 거리가 짧은 Sprite를 그려주는 것이다.

그래서 정확히는 Camera와 Ground가 Camera와 Player의 거리보다 가까워질 때, Player가 Ground의 뒤에 보여지는 것이다. (결국 Ground가 커서 Player가 안보이게 되는 것이었음)

 

 

 

3. 해결

Sprite 단위로 렌더링을 하지 않으면 된다.

Pixel 단위로 Depth를 렌더링을 해보자.

아직 쉐이더를 다루지 못했기에 검색을 해서 알아내야 했다.

 

www.youtube.com/watch?v=e1j82BEnHhg&list=PLqqkaa8OrxkHayfk1DW1ayaVcajNBCpkf&index=2

원했던 것을 이 영상이 말해주고 있었다.

 

github에서 가져온 shader와 hlsl, 그리고 Unlit Material을 사용해서 Depth를 계산하는 원리였다. 

영상을 따라 코드를 수정하고 shader로 뽑아낸 Material을 Player Sprite에 적용시켜보니 depth관련 문제는 해결된 듯 했다. (다른 사람의 코드를 가져와서 붙힌 느낌이라서 정확하게 해결됐다고 말하기 꺼려진다.)

 

 

Camera에서 Player가 멀어져서 Ground가 Camera에 더 가까워져도 Player를 잘 보여주는 모습이다.

벽에도 예쁘게 잘려서 보였다.

 

 

 

다른 이슈

1. Unlit는 Lighting을 받지 못함.

  -> Lighting을 받는 일이 생긴다면 다른 방법을 고려하거나, Lighting을 주는 다른 방법을 찾거나.

2. 그림자를 Alpha값을 0.5로 그렸었음. 그런데 Alpha값이 제대로 그려지지 않음.

  -> 그림자를 따로 그려주거나, Alpha값을 사용할 수 있는 방법을 찾거나.

 

 

 

반응형

댓글