URP 를 공부하며, 기존 레거시 쉐이더에서 자주 쓰이는 2Pass 방식을 어떻게 적용할지 고민하고 있다.
URP 는 기본적으로 싱글패스만 지원하기 때문에 멀티패스를 쓰기 위해선 별도 처리가 필요한데, 이를 위해 유니티에서 마련해준 기능이 RenderFeature 중 RenderObjects 이다.
(물론 이 RenderFeature 또한 직접 구현이 가능하며, RenderObjects 는 유니티에서 편하게 쓰라고 만들어준 RenderFeature 의 일종이다)
어떻게 쓰느냐에 따라 활용방법이 무궁무진 한데, 멀티패스 구현 또한 가능하다.
여기서는 알파 블렌딩 시 가려지는 뒷쪽 메시들이 부분부분 보이는 문제를 해결하기 위한 RenderFeature 사용 방식을 설명할 것이다.
먼저 우리의 가장 중요한 ForwardRenderer 를 보자
이녀석은 ScriptableRenderer 를 상속받아 유니티에서 마련해놓은 포워드렌더링 방식의 파이프라인이다.
여기에 Add RenderFeature 가 보일것이다.
버튼을 눌러보면 Render Objects(Experimental) 이라는 항목이 하나 있을텐데 그걸 선택한 뒤 다음처럼 셋팅하자
아 참, 아래 ZWriteOnly 메테리얼은 새로 만든 셰이더로서 이렇게 셋팅하면 된다
중요한 부분은 Base Map 의 알파를 0 으로 셋팅해서 안보이게 해야 한다는 것이다 (추후 설명하겠지만 Z 버퍼에 쓰기만 할 용도임)
아래 부분이 Render Object 에 대한 설정값
그 후 반투명 처리할 물체의 메시에 적용해줄 메테리얼을 하나 만들고 다음과 같이 셋팅한다
Base Map 항목에 컬러값을 셋팅할 수 있는걸 볼 수 있는데 여기에서 알파를 조절하면, 씬뷰에서 반투명 처리되는 메시를 볼 수 있을 것이다.
이 메시의 Layer 도 위 값에 셋팅된 대로 ZTestTransparent 라는 걸로 만들어서 적용하면, 아래처럼 깔끔히 알파처리된 메시를 볼 수 있다.
위 코드는 저의 깃헙에서도 확인할 수 있습니다. (Assets/Scenes/ConvexMeshAlphaScene.unity 를 열어서 확인가능함)
https://github.com/SeonHwan/ShaderExample
자 이제 어떻게 이렇게 구현이 되는지 하나하나 따져볼 시간이지만 포스팅이 길어지므로 다음 포스팅에 자세히 설명하겠습니다.
Universal RP 패키지의 몇몇 버전에서 제대로 동작하지 않는 버그가 있습니다. (7.2.0 ~ 7.4.3 쯤에서 비정상 동작하는거 같음)
각 유니티 버전에 verified 된 버전을 사용하거나 최신 유니티 버전을 사용하세요
'Unity > Universal Render Pipeline' 카테고리의 다른 글
알파 블렌딩 (2) (0) | 2020.12.10 |
---|