게임에서 사용하는 셰이더들을 보면 거의 렌더큐(RenderQueue)라고 적힌 게 있다.
이 기능은 물체를 그릴 순서를 결정하는 것으로 이 값을 통해
어떤 물체가 먼저 보이고 어떤 게 가려질지 판단할 수 있게 된다.
대표적인 예시로, 현실에서는 책상에 노란 종이를 올리고 그 위에 빨간 종이를 올리면 당연히 빨간 종이가 보이겠지만
유니티에서는 물체를 보여줄 순서가 미리 정해져 있지 않아서
나중에 가르칠 Z 버퍼(Z-Buffer)라는 것과 렌더큐를 통해
‘같은 크기의 노란 종이와 빨간 종이가 똑같은 위치에 있어서 무엇을 먼저 보여줘야 할지 모르겠는데,
Z 버퍼와 렌더큐를 참고해봤더니 노란 종이가 뒤에 있고 빨간 종이가 앞에 나오는 모습을 보여줘야겠다’
라는 결과를 내보내는 것이다.
사진을 다시 보자. 렌더큐가 From Shader라고 되어 있는데 이는 이 셰이더의 기본 렌더큐 값을 사용하겠다는 의미다.
저 From Shader 부분을 클릭하여 펼쳐보면
흔히 본 것은 Opaque(불투명)라는 이름이 붙은 셰이더에서 쓰는 지오메트리(Geometry)와 트랜스패런트(Transparent)일 것이다.
지오메트리는 렌더큐가 2000인 값이고 트랜스패런트는 3000이라는 값을 가졌다.
둘을 비교해보라고 하면 ‘트랜스패런트가 1000만큼 더 크니 힘이 셀 것이고 먼저 보일 거야’ 라고 생각할 수 있겠다.
물론 정답이다(Z 버퍼를 참고하지 않는 가정하에). 같은 위치에 같은 크기의 물체가 있다면 트랜스패런트 물체가 먼저 보이게 된다.
유니티에서 확인해보자.
같은 위치에 똑같은 크기의 물체를 놓고 셰이더의 렌더큐 값만 다르게 해 보았다.
확인해 본 결과 Geometry<Transparent 이므로
트랜스패런트로 변경한 파란색 물체가 먼저 보이게 되었다.
만약 반투명한 물체에 지오메트리(Opaque) 셰이더를 쓰면 어떻게 될지 보자.
*Opaque: '불투명'. 대다수의 RenderQueue값이 2000인 VRChat Shader의 이름에는 Opaque가 붙어 있다.
물체의 투명했어야 하는 부분이 뒤에 있는 물체를 검은색으로 가리거나 잘라버려서 이상한 결과가 나올 것이다.
이로써 우리는 반투명한 물체는 지오메트리(Opaque)를 쓰고
투명한 물체는 트랜스패런트(Transparent)를 쓴다는 결론을 얻을 수 있겠다.
하지만 셰이더가 사진으로부터 투명한 부분을 구별할 수 없다면?
렌더큐를 트랜스패런트로 바꿔도 투명해지지 않는다.
따라서 셰이더 제작자가 "내 셰이더는 렌더큐값을 이리저리 바꿔도 투명한걸 가려낼 수 있어요!"라고 말하지 않는 이상
인스펙터에서 렌더큐 값을 조절하는 행위는 자제하는 것이 좋다.
렌더큐 값을 변경하고 투명과 반투명 모두 표현할 수 있는 한 개의 만능 셰이더를 만드는 것은 매우 어렵고 최적화에도 좋지 않아서
많은 제작자들은 셰이더를 각각 용도에 맞게 Opaque(렌더큐가 Geomerty인), Transparent로 구분해둘 것이다.
우리는 렌더큐를 함부로 건드리기보다는 상황에 맞는 이름이 적힌 셰이더를 찾아 적용하면 되는게 좋은 선택이다.
근데 이딴걸 왜 설명하는거고 우리가 어디에다가 써먹을 수 있냐고?
바로 대표적인 예가 아바타의 홍조다.
아바타의 불투명한 얼굴과 투명한 홍조는 서로 겹쳐있는데
기본적인 Standard 셰이더로 보면 이런 결과가 나온다.
대개 VRCMods나 데비앙아트, 블렌더를 통해 유니티에 모델을 집어넣었을 때 볼 수 있겠다.
원래 투명했어야 할 홍조 외곽 부분이 검은색으로 되어버려 흉측한 모습이다.
Unlit/Transparent로 셰이더를 바꿔보았다. (Standard 셰이더의 Transparent는 투명이 완벽하지 않다)
홍조가 잘 드러나는 모습으로 이로써 이 강좌를 세 줄 요약할 수 있겠다.
1. 물체가 겹쳐있을 때 앞과 뒤를 결정하는건 렌더큐(RenderQueue)다.
2. 불투명한 물체는 대개 렌더큐가 2000인 Opaque 셰이더를 사용한다.
3. 반투명한 물체는 렌더큐가 3000인 Transparent 셰이더를 사용한다.
+ 추가적으로 나머지 렌더큐 값들이 있는데 함께 정리하자면 용도는 이렇다.
Background - 1000
가장 뒤에서 보이게 되는데 이름 그대로 배경이나 스카이박스를 만들 때 쓴다.
Geometry - 2000
기본적인 불투명 물체에 쓴다.
AlphaTest - 2500
불투명과 반투명 사이에 위치한 값. Transparent처럼 반투명 물체를 표현할 수 있음.
Transparent에 의해 물체가 가려져야 할 때 쓰기도 함.
Transparent - 3000
기본적인 반투명 오브젝트에 쓴다. 파티클도 이에 포함된다.
Overlay - 4000
가장 먼저 보이게 될 물체에 쓴다. 셰이더FX(특히 굴절)나 렌즈 플레어 등에 사용한다.