본문 바로가기
[Unity]

[Unity] URP 스텐실(Stencil) 활용하기

by 김기승 2024. 9. 5.

스텐실은 GPU의 스텐실 버퍼(Stencil Buffer)를 활용하여

특정 픽셀의 렌더링을 제어하는 기능이다.

 

 

이번에는 스텐실을 활용한 간단한 예시를 구현해보도록 하겠다.

아래의 결과 화면부터 보도록 하자.

바라보는 면이 달라짐에 따라,

각각 다른 오브젝트가 렌더링되는 것을 볼 수 있다.

 

이를 구현해보도록 하자.


① URP 세팅

URP(Universal Render Pipeline)에서는 Renderer Features를 통해

스텐실을 간단히 설정할 수 있다.

 

프로젝트를 URP로 변환하는 과정은 워낙 자료가 많으므로

간략히 설명하겠다.

먼저, Package Manager에서 Universal RP를 설치해준다.

 

Create > Rendering > URP Asset (with Universal Renderer)을 생성하고,

 

URP AssetGraphicsQuality에 각각 적용해주면 된다.

※ 이 시점부터는 Standard 머티리얼을 사용할 수 없다.

 


② 레이어 적용

레이어(Layer)를 적용하기 전에 먼저 환경을 구성하도록 하자.

Plane을 아래에 깔고, 위에 Cube를 배치해준다.

 

그리고, 앞 쪽에 Transparent 타입의 Quad를 배치해준다.

 

레이어를 새로 생성해주어야 하는데,

StencilMaskStencilTarget이라는 이름으로 생성해주겠다.

※ 레이어 이름은 자유다.

 

마지막으로, Cube에는 StencilTarget,

Quad에는 Stencilmask로 레이어를 적용해준다.


③ Renderer 설정

URP 에셋을 생성하면서,

Universal Renderer Data 에셋이 함께 생성이 되었다.

아래를 보도록 하자.

Opaque Layer MaskTransparent Layer Mask에서

StencilMaskStencilTarget을 해제해준다.

 

이렇게 되면, 두 레이어가 적용된 오브젝트는 제외하므로,

CubeQuad는 보이지 않게 된다.

 

아래의 Add Renderer Feature > Render Objects를 생성해준다.

 

Renderer Feature의 이름이다. 자유롭게 설정하면 된다.

오브젝트가 그려지는 순서이다.

불투명 오브젝트가 그려진 시점은 모든 오브젝트가 그려진 시점이므로,

무난하게 AfterRenderingTransparents를 선택해준다.

오브젝트의 RenderQueue이다.

StencilMask는 반투명인 Quad를 위한 레이어이므로,

Transparent를 선택해준다.

렌더 오브젝트가 적용될 레이어이다.

StencilMask로 지정해준다.

렌더 오브젝트를 항상 그리고,

그려지는 픽셀을 1이라는 값으로 교체한다.

그려지지 않는 부분은 (0으로)유지한다는 의미이다.

※ 위 설정을 통해 스텐실 버퍼에 1이라는 값을 쓰게된다.

 

위 설정을 마치고 나면,

Quad가 렌더 오브젝트로 지정되어 따로 그려지게 된다.

 

이때, 스텐실 버퍼는 이렇게 된다.

 

이어서, StencilTarget 레이어를 위한 렌더 오브젝트도 추가해주자.

 

Cube는 불투명 오브젝트이므로

RenderQueueOpaque로 설정한다.

레이어는 당연히 StencilTarget이다.

렌더 오브젝트를 값이 1인 픽셀에 그리고,

그려지는 픽셀과 그려지지 않는 픽셀 모두 값을 유지한다는 의미이다.

 

그러면, 결과는 이러하다.

※ 보이지 않는 Cube에 그림자가 생기는 문제는

새로운 Light를 생성하고, StencilTarget만을 Culling Mask로 설정해주는 방법이 있다.

단, 이 방법을 사용할 때는 Main LightCulling Mask에서는 제외해야한다.


④ 마무리

여기서 Quad를 완전 투명으로 만들고,

 

도 좀 세워주고,

 

레이어도 더 만들어주고,

 

동일한 과정으로 렌더 오브젝트도 더 만들어주고,

Mask & Target 그룹의 Value 값이 일치하도록 하면서,

그룹마다 다른 값을 주도록 하자. (ex> 1, 2, 3, 4)

 

QuadCube를 더 생성해서 배치하고 레이어를 적용해주면,

 

최종 결과이다.


스텐실을 활용하면 마술(?)같은 개발을 할 수 있을 것이다.

 

여튼, URP에서 간단한 스텐실 기능을 제공하고,

또 소개할 수 있어서 매우 만족스럽다.

댓글