Unity/Rendering&Shader

[RENDERING][TEST] Rendering layer

김성인 2023. 11. 12. 12:01

[RENDERING][TEST] Rendering layer

 

 


 특정 오브젝트에 원하는 라이트만 빛이 적용되도록 하기 위하여 보통 오브젝트 layer와 컬링 마스크를 이용하거나 Rendering layer을 사용하는 방법이 있다.

 

 복잡한 게임을 만들 때, 오브젝트 layer를 많이 만들어 내는데, 오브젝트 layer를 무한정 생성할 수 없다(32개가 최대)는 문제점이 있다. 동시에 오브젝트 layer의 경우 프로그래밍을 할 때, 많이 쓰이기 때문에, 프로그램 쪽에서 많이 이용된다.

 

 대표적으로 위의 이유로 Rendering layer를 사용하는 도중 Point light 등 Additional light가 이 Rendering layer에 맞춰서 작동하지 않는 것이었다.

 

 처음에는 버그인 줄 알았고, 유니티의 다른 버전에서도 확인해 보고, 버그 리포트가 올라와 있는지 포럼을 확인해 보았지만, 버그가 아니었다.


 자! 그럼 이제 무엇이 문제일까? 고민을 하는데, 떠오른 것은 바로 최적화를 위하여 Additional light를 Vertex Shader에서 계산 중이라는 것이다. 바로 Pixel Shader에서 계산하도록 하니, Rendering layer가 잘 작동하였다.

 

 그렇다면 이것은 왜 이럴까? 그것은 위에서 한번 언급했듯이 Vertex Shader, Pixel Shader 이 부분이다.


 렌더 파이프라인을 떠올려 보면, Vertex Shader와 Pixel Shader는 서로 다른 스테이지에서 작동한다. 동시에 URP의 경우 Directional light와 Additional light는 서로 다른 버퍼를 만들어 낸다. 마지막으로 Rendering layer는 Pixel Shader에서 작동한다는 생각을 하게 되었다.

 

 이제 위에서 생각한 부분을 확인하기 위하여 프레임 디버거에서 렌더링이 어떻게 진행되고 있는지 확인해 보았다.


1. Pixel Shader(정확히는 Fragment Shader)에서 작동하는 것을 확인하며, 동시에 Directional light와 Additional light는 서로 다른 버퍼를 이용한다는 것을 확인할 수 있었다. 

 

  - Directional light, Additional light 모두 Pixel Shader에서 계산하면 하단의 이미지와 같이 Main light shadow map 버퍼를 초기화 시킨 후 시작한다.

 

  - 추가로 그림자를 전부 그린 후, additional light shadow map 버퍼를 초기화한다.

 

  - Directional light는 Pixel Shader, Additional light는 Vertex Shader에서 계산하면 하단의 이미지와 같이 Additional light shadow map 버퍼를 초기화하지 않는다.


2. Randering Layers 가 최적화에 도움이 될까?

 

  - 위의 질문을 확인하기 위하여 Rendering Layer 기능을 Off 후, 렌더링 과정을 확인하였다.

 

  - Directional light, Additional light 모두 Pixel Shader에서 계산할 경우

 

  - 이 결과를 보면 두 경우 모두 Additional light shadow map 버퍼를 초기화한다.

 

  - 결과로 보아 Rendering layer 사용은 최적화적인 효과가 있다. 정확히는 상황에 따라서 다르다. 드로우 콜은 줄일 수 있지만, Additional light shadow 용 버퍼를 따로 만들기 때문에 메모리 부분에서는 손해가 난다.


 3. 그렇다면 최적화적인 요소를 위하여 어떻게 사용하나?

 

  - 답은 프로젝트마다 다르기 때문에 프로파일러를 열심히 돌려서 정확한 상황 파악 후 선택해야 할 것 같다.


 4. Culling Mask의 경우는 어떻게 돌아가고 있나?

 

  - Rendering layer과 같이 위와 같은 버퍼를 만드는 등의 행위를 하지 않는다.


결론

  - Rendering layer는 스테이지에 따라서 버퍼를 따로 생성한다.

  - 최적화를 위해서는 프로젝트의 상황을 정확하게 파악하기 위하여 프로파일링을 열심히 돌린 후, CPU, GPU, 메모리 등등 어느 부분을 다이어트 할지 정해야 한다.