Unity 검색

Image of wooden cottages on a beach near sparkling aqua colored water
Image of wooden cottages on a beach near sparkling aqua colored water
다루는 주제
공유

Unity 2021.2 릴리스에서는 셰이더 그래프에 URP(유니버설 렌더 파이프라인)의 Surface Options 지원, 커스텀 인터폴레이터(Custom Interpolator), 블랙보드 카테고리와 같은 새롭고 흥미로운 기능이 도입되어, 아티스트 워크플로와 셰이더 성능이 대폭 향상되었습니다.

이번 블로그 포스팅에서는 앞서 릴리스된 Unity 프로젝트 Viking Village를 이용하여, 프로젝트에서 사용된 셰이더 중 일부를 최신 셰이더 그래프 기능으로 다시 제작하는 과정을 보여 드립니다.

Viking Village 에셋 패키지 시작하기

Viking Village URP 에셋 패키지는 에셋 스토어에서 다운로드할 수 있습니다. 이번 데모 프로젝트에서는 URP 템플릿이 포함된 Unity 2021.2 베타 7 버전을 사용하여 새로운 URP 프로젝트를 생성했습니다. 새 프로젝트를 연 다음 Viking Village URP 팩을 다운로드하여 이 프로젝트로 임포트하세요. 여기에서 물과 셰이더 예제를 다운로드할 수 있습니다.

URP Surface Options

제일 먼저 시연할 기능은 URP Surface Options입니다. 이 기능을 사용하면 릿/언릿 셰이더 그래프 셰이더에서 Surface Options의 프로퍼티를 머티리얼 인스펙터에 노출할 수 있습니다. Allow Material Override 옵션을 활성화하여 머티리얼 인스펙터에서 Surface Type, Alpha Clipping, Shadows와 같은 일반적인 프로퍼티를 선택할 수 있습니다. 예제 프로젝트에서 해당 옵션을 자세히 살펴보겠습니다. 

graph inspector and material inspector in URP

Viking Village URP 패키지에는 다양한 머티리얼이 포함되어 있습니다. 머티리얼은 서로 다른 표면 옵션 설정을 가지는 경우가 많습니다. 하지만 머티리얼에 사용되는 셰이더는 서로 크게 다르지 않을 수 있습니다. 그래프 인스펙터의 새로운 'Allow Material Override' 옵션을 사용하면 머티리얼 인스턴스별로 셰이더 그래프의 표면 옵션을 오버라이드할 수 있으므로, 하나의 셰이더 그래프 에셋을 기반으로 다양한 설정의 머티리얼을 만들 수 있습니다.

예시를 살펴보겠습니다. 해당 프로젝트에서 Mat_fence_02.matstandard.shadergraph를 사용하고 있고, Mat_strawroof_01.mat은 Alpha Clipping이 활성화된 standard.shadergraph 버전인 standard_AlphaClip.shadergraph를 사용하고 있습니다. 그래프 인스펙터에서 'Allow Material Override' 옵션을 활성화하면 동일한 셰이더를 사용하여 머티리얼 수준에서 Alpha Clipping을 제어하여 머티리얼의 다양한 배리언트를 만들 수 있습니다.

Image of Mat_fence_02 vs. Mat-strawroof-01 project settings in shader graph

'Allow Material Override' 옵션이 활성화되어 있으면 머티리얼 인스펙터에서 Metallic-Roughness 워크플로와 Specular-Glossiness 워크플로를 손쉽게 전환할 수도 있습니다. 아래는 두 워크플로의 차이를 보여주는 간단한 표입니다. 자세한 내용은 이 페이지를 참조하세요.

해당 프로젝트의 Lit_SSS_Cutout.shadergraph를 예시로 살펴보겠습니다. 이 셰이더는 프로젝트에서 다양한 초목 머티리얼에 사용되며, Metallic 워크플로로 기본 설정됩니다. 셰이더를 사용하는 머티리얼 중 하나만 Specular 워크플로로 전환하려는 경우에 'Allow Material Override' 옵션이 활성화되어 있다면 머티리얼 인스펙터에서 설정을 오버라이드하면서 같은 셰이더를 사용하는 나머지 머티리얼은 그대로 둘 수 있습니다.

커스텀 인터폴레이터

프로젝트와 셰이더 에셋에 대해 살펴보았으므로 이제 셰이더 그래프에 추가된 커스텀 인터폴레이터라는 유용한 기능을 소개하겠습니다.

커스텀 인터폴레이터를 사용하면 버텍스 스테이지에 있는 버텍스 데이터나 커스텀 계산 결과 등의 정보를 프래그먼트 스테이지로 전달하여 셰이더 성능을 개선할 수 있습니다. 

시연을 위해 마스터 스택 블로그 포스팅에서 물 셰이더를 가져왔습니다. 물 셰이더가 Viking Village 환경과 잘 어우러지도록 반사와 굴절을 추가하겠습니다. 

마스터 스택 데모에서와는 다르게, 포말을 개선하여 수중에서도 나타나도록 했습니다. 

포말 텍스처에 왜곡 효과를 주기 위해 Simple Noise 노드로 UV를 타일링하고 오프셋합니다. 포말 텍스처는 RGB 채널을 활용하여 밀도가 서로 다른 포말 텍스처를 저장합니다. 보다 사실적인 결과가 나올 수 있도록 서로 다른 채널이 반대 방향으로 왜곡됩니다. 포말의 어색함을 줄이기 위해 파도의 노멀 맵을 마스크로 사용하여 포말과 파도가 자연스럽게 어우러지도록 했습니다. 셰이더 성능을 높이기 위해 포말은 버텍스 스테이지에서 계산됩니다.

Process: Distort the UVs in Vertex Stage to the Fragment Stage via Custom Interpolator

셰이더에 있는 노멀 맵의 타일링을 살펴보겠습니다. 파도를 사실적으로 구현하기 위해 기존의 셰이더가 두 개의 노멀 맵을 다른 방향으로 타일링하고, 모든 계산이 픽셀 단위로 수행됩니다. 이때 커스텀 인터폴레이터를 통해 UV 타일링 부분을 버텍스 스테이지로 이동할 수 있습니다.

Normal maps UV tiling: pass to the fragment stage via custom interpolator

커스텀 인터폴레이터 사용으로 개선된 효과를 확인하기 위해 물 셰이더만 교체된 두 개의 빌드를 만들었습니다. 물 셰이더 하나는 커스텀 인터폴레이터를 사용했고, 다른 하나는 사용하지 않았습니다. 그리고 PIX로 각 빌드의 프레임을 캡처하여 GPU에서 발생하는 렌더링 비용을 분석했습니다. 커스텀 인터폴레이터를 사용한 셰이더에서 물 셰이더의 드로우 콜 시간이 33%나 단축된 것을 분명히 확인할 수 있습니다. 

Pix comparison of water shader without custom interpolator vs water shader with custom interpolator

커스텀 인터폴레이터를 사용할 때 유의할 점은 프래그먼트 스테이지에서 수행되는 작업이 버텍스 스테이지보다 자주 실행된다는 것입니다. 계산을 버텍스 스테이지로 이동하면 시각적 결과물에서 사소한 디테일 손실이 발생하는 경우가 있습니다. 커스텀 인터폴레이터 기능은 최대 32개의 채널을 지원합니다. 인터폴레이터 변수 한도는 플랫폼과 GPU에 따라 다릅니다. 자세한 내용은 셰이더 그래프 매뉴얼을 참조하세요.

블랙보드 카테고리

셰이더가 복잡해지면 블랙보드에서 수많은 프로퍼티를 탐색하기 어려워질 수 있습니다. 하지만 새로운 블랙보드 카테고리를 사용하면 프로퍼티의 커스텀 그룹을 만들고, 이를 머티리얼 인스펙터에서 확장 가능한 섹션으로 노출할 수 있습니다. 

물 셰이더를 계속 예로 들겠습니다. 셰이더 그래프의 블랙보드에서 모든 노멀 맵 프로퍼티를 Wave Normal이라는 카테고리로 그룹화했습니다. 이후 씬에서 작업을 하다가 머티리얼 인스펙터에서 프로퍼티 값을 미세 조정하고 싶을 때 이 그룹으로 쉽게 이동할 수 있었습니다. 인스펙터 공간을 절약하기 위해 목록을 접을 수도 있습니다.

Normal map properties are grouped into wave normal section, which can be collapsed to save space in the material inspector

이번 포스팅에서 언급된 모든 기능은 Unity 2021.2와 함께 최신 셰이더 그래프 패키지에서 사용할 수 있습니다. 셰이더 그래프와 관련하여 피드백이 있거나 더 자세한 내용을 알고 싶다면, 포럼 또는 Discord에 참여하세요. Product Board에서 예정된 기능이나 업데이트를 살펴볼 수 있습니다.

다루는 주제
관련 게시물