//
[실험🔆보았다] 광원이 여러 개일때 여러 겹의 메시를 올바르게 알파블랜딩하려면
Search
Try Notion
[실험🔆보았다] 광원이 여러 개일때 여러 겹의 메시를 올바르게 알파블랜딩하려면
date
January 28, 2020
tags
렌더링
유니티3D
4 more properties
요약
레이어된 치마처럼 하나의 메시를 여러 겹으로 만들어 투명하게 그려줘야 하는 경우가 있는데, 광원이 하나일 때는 문제가 없다가 광원이 여러 개가 되면 심각하게 밝아지는 경우가 있습니다. 근본적인 원인은 유니티의 내장 렌더링 시스템이 첫 번째 방향성 광원과 나머지 광원을 두 개의 패스로 나누어 그리기 때문입니다.  LWRP, URP와 같이 모든 주요 광원에 대해서 한 패스로 렌더링할 수 있는 시스템을 사용하면 문제를 해결할 수 있습니다. 이번 포스팅에서는 왜 문제가 발생하는지 원인을 확인하고, LWRP 상에서 문제가 해결되는 것을 확인해보겠습니다.
문제 상황
블렌더3D에서 아래와 같이 3겹으로된 큐브를 만들었습니다.
블렌더 3D에서 만든 3겹으로 된 큐브
아래는 광원이 하나일 때의 여러겹 큐브와 한 겹 큐브의 렌더링 결과입니다.
유니티 빌트인 렌더링 시스템. 광원 1개. 좌: 여러겹 메시, 우: 한 겹 메시
아래는 점 광원을 추가했을 때의 모습입니다. 레이어가 겹칠 수록 심하게 밝아집니다.
유니티 빌트인 렌더링 시스템. 광원 2개. 좌: 여러겹 메시, 우: 한 겹 메시
그 원인은 2 가지로 요약할 수 있습니다.
내장 렌더링 시스템에서는 첫번째 방향성 광원과 나머지 광원은 별도의 드로우 콜로 그려진다.
두 번째 드로우콜은 덧그리는 방식이기 때문에 Blend SrcAlpha One 이 된다.
Blend SrcAlpha One은 “셰이더에서 반환한 색상에 알파를 곱한 값”과 “프레임 버퍼에서 가져온 색상에 1(One)을 곱한값”을 더해서 다시 프레임 버퍼에 그리라는 얘기입니다. 즉, 이미 그려진 화면에 더해서 계속해서 덧칠을 하는 방식이죠. 메시가 한 겹이라는 가정에서는 괜찮지만, 여러 겹인 경우에는 지속적으로 덧칠이 되기 때문에 위의 그림처럼 밝아지게 됩니다.
아래는 첫번째 방향성 광원을 그리는 패스 정보입니다.
아래는 두번째 방향성 광원을 그리는 패스 정보입니다.
해결
해결 방법 중에 하나는 모든 광원에 대해서 한 번에 그리는 겁니다. 그렇게 하려면 하나의 드로우콜에 다 그릴 수 있어야 하는데, LWRP나 URP가 그런 방식으로 동작합니다. 아래는 LWRP 상에서 하나의 광원만 있는 경우의 결과입니다.
LWRP. 광원 1개. 좌: 여러겹 메시, 우: 한 겹 메시
아래는 점 광원을 추가한 경우입니다. 살짝 밝아지는 것 외에는 이상한 증상은 나오지 않습니다.
LWRP. 광원 2개. 좌: 여러겹 메시, 우: 한 겹 메시
프레임 디버거를 보면 하나의 드로우 콜에 모두 그리고 있습니다.
결론
유니티의 내장 렌더링 시스템에서는 여러 겹의 메시를 알파블랜딩하는데 문제가 있습니다. 원인은 여러 드로우 콜에 나눠그리면서 Blend SrcAlpha One 방식으로 블랜딩하면서 계속 밝아지기 때문입니다.   LWRP나 SRP와 같이 한 번에 그리는 방식을 통해서 문제를 해결할 수 있습니다.