먼저 이 가이드에서 자주 등장하는 주요 그래픽스 렌더링 용어들의 정의를 살펴보겠습니다.
셰이더는 그래픽처리장치(GPU)에서 실행되는 프로그램이나 프로그램 컬렉션을 가리키는 일반적인 이름입니다. 예를 들어, 컬링 단계를 마치면 버텍스 셰이더를 사용하여 ’오브젝트 공간’의 가시 오브젝트에 대한 버텍스 좌표를 ’클립 공간’이라고 부르는 다른 공간으로 변환합니다. 그러면 GPU는 이러한 새 좌표를 사용하여 씬을 래스터화, 즉 씬의 벡터 표현을 실제 픽셀로 전환합니다. 후반 단계에서 이러한 픽셀은 픽셀(또는 프래그먼트) 셰이더에 의해 컬러가 지정됩니다. 픽셀 컬러는 대개 해당 표면과 주변 조명의 머티리얼 프로퍼티에 따라 다릅니다. 현대 하드웨어에서 이용 가능한 또 다른 일반적인 셰이더 타입은 컴퓨트 셰이더입니다. 이 타입의 셰이더를 통해 프로그래머들은 모든 종류의 수학 연산(예: 광원 컬링, 파티클 물리 또는 체적 시뮬레이션)에 GPU의 강력한 병렬 처리 기능을 활용할 수 있습니다.
간접 조명은 표면에 반사되는 광원에 의해 발생하며, 대기 또는 반투명 머티리얼 등과 같은 매체를 통해 전달되고 분산됩니다. 이러한 조건에서 오클루더는 일반적으로 부드럽고 감지하기 어려운 그림자를 드리웁니다.
다음 플로우차트는 콘텐츠 크리에이터의 시각에서 Unity의 전체 조명 파이프라인에 대한 높은 수준의 통찰을 제공합니다.
먼저 렌더 파이프라인을 선택해야 합니다. 그런 다음 그에 따라 간접 조명이 생성되는 방식을 결정하고 전역 조명 시스템을 선택할 수 있습니다. 모든 전역 조명 설정을 프로젝트에 맞게 적절하게 조정하고 나면 광원, 발광 표면, 반사 프로브, 라이트 프로브, 라이트 프로브 프록시 볼륨(LPPV)을 계속 추가할 수 있습니다. 이러한 모든 조명 오브젝트의 사용법과 기능은 이 문서에서 다루지 않습니다. 프로젝트에서 이러한 조명 오브젝트를 올바르게 활용하는 방법은 매뉴얼의 조명 섹션을 참조하시기 바랍니다.
2018년 초까지 Unity에서는 하나의 렌더 파이프라인만 이용할 수 있었으며, 현재는 ’빌트인 렌더 파이프라인’으로 이름이 바뀌었습니다. 이 렌더러는 포워드 렌더링과 디퍼드 렌더링을 제공합니다.
2018년 1월 Unity는 사용자들이 C# 스크립팅을 통해 렌더링 루프를 커스터마이즈할 수 있도록 해주는 스크립터블 렌더 파이프라인(SRP)을 공개했습니다. 이는 게임 엔진 분야에서 작은 혁명을 일으켰습니다. 덕분에 사용자들은 C++ 같은 저수준 프로그래밍 언어를 사용하지 않고도 오브젝트 컬링, 드로잉, 프레임 포스트 프로세싱을 맞춤화할 수 있습니다.
Unity는 현재 성능 강화와 최신 하드웨어를 염두에 두고 제작한 두 가지의 미리보기 SRP를 제공합니다.
타일은 프레임의 작은 2차원 사각형 픽셀 섹션이고, 클러스터는 카메라 절두체 내의 3차원 볼륨입니다. 이 두 가지 타일 및 클러스터 렌더링 기술은 모두 모든 단일 타일 및 클러스터에 영향을 주는 광원 리스트를 사용하며, 각 조명은 해당하는 알려진 광원 리스트를 사용하여 단일 패스로 계산됩니다. 불투명 오브젝트는 타일 시스템을 사용하여 셰이드를 적용할 가능성이 높고, 투명 오브젝트는 클러스터 시스템을 사용합니다. 이러한 렌더러의 주요 이점은 아주 느린 멀티 패스 광원 누적을 사용하는 빌트인 렌더 파이프라인(디퍼드)보다 조명을 더 빠르게 처리하고 대역폭 소모를 크게 감소시킨다는 점입니다.
이제 다음의 의사결정 차트를 사용하여 몇 가지 핵심 기준에 따라 가장 적합한 렌더 파이프라인을 빠르게 찾을 수 있습니다.
최신 버전의 HDRP 및 LWRP는 Unity 패키지 관리자(Window > Package Manager)를 통해 다운로드할 수 있습니다. 이러한 SRP를 가장 손쉽게 사용하려면 Unity 허브에서 새 프로젝트를 만든 후 해당 템플릿 중 하나를 사용하십시오.
수동으로 HDRP 또는 LWRP용 프로젝트를 설정하려면 필요한 패키지를 설치해야 합니다. 그런 다음 프로젝트 창의 Create > Rendering > High Definition Render Pipeline Asset에서 새 에셋을 만든 후 그래픽스 설정으로 드래그하십시오. HDRP를 선택한 경우에는 플레이어 설정에서 리니어 색 공간을 선택한 후 Rendering > Scene Settings에서 오브젝트를 씬에 추가해야 합니다.
Graphics Settings 창에 할당된 파이프라인 에셋이 없으면 Unity는 기본 빌트인 렌더 파이프라인을 사용합니다.
렌더링에 대해 잘 알고 C#에 익숙하다면 SRP 콘셉트로 실험하며 고유한 커스텀 스크립터블 렌더 파이프라인을 만들 것을 권장합니다. 그러면 프로젝트에 맞게 렌더러를 맞춤 설정할 수 있습니다. LWRP는 셰이더 라이브러리가 작고 렌더링 패스를 쉽게 삽입, 제거 및 교체할 수 있어서 확장이 매우 간편합니다.
Unity에서는 빌트인 렌더 파이프라인에서 HDRP 또는 LWRP로 프로젝트의 머티리얼을 쉽게 포팅할 수 있습니다. Edit > Render Pipeline > Upgrade…에서 머티리얼 컨버터를 한 번만 클릭하면 모든 작업이 끝납니다. 단, 이 작업은 되돌릴 수 없습니다. 반드시 프로젝트를 미리 백업해 두십시오!
반면에 커스텀 셰이더는 수동으로 포팅해야 합니다. 따라서 프로덕션 동안 빌트인 렌더 파이프라인에서 HDRP 또는 LWRP로 전환하는 작업은 재작성할 커스텀 셰이더 수에 따라 시간이 매우 많이 소요될 수 있습니다.
그리고 고해상도 렌더 파이프라인은 빌트인 렌더 파이프라인보다 광원 감쇠 및 분산 등의 부문에서 물리적으로 더 정확하기 때문에 HDRP로 전환한 후에 프로젝트의 모습이 다소 달라질 수 있습니다.
또한 HDRP와 LWRP는 동일한 렌더링 기능을 공유하지 않기 때문에 상호 호환되지 않습니다. HDRP에서 LWRP로 또는 그 반대 방향으로 프로젝트를 포팅할 수 있지만, 한 번의 클릭으로 작업이 끝나는 게 아니라 조명, 머티리얼 및 셰이더를 수동으로 다시 작업해야 합니다!
마지막으로 HDRP 및 LWRP는 여전히 미리보기 단계이며, Unity는 빠른 시일 내에 정식 출시를 위해 노력하고 있습니다. 두 파이프라인 모두 아직 모든 기능이 구현되지 않았다는 점에 유의하십시오. 예를 들어, 아래에서 상세히 설명하는 특정 조명 모드는 LWRP에서 일부만 제공되며, XR은 HDRP에서 아직 올바르게 지원되지 않습니다.
Unity는 두 가지의 전역 조명 시스템을 제공하며, Window > Rendering > Lighting Settings에서 활성화할 수 있습니다.
(사전에 계산됨) 실시간 전역 조명: 이 시스템은 타사 조명 미들웨어인 인라이튼에 전적으로 기반합니다. Unity의 사전 계산 시 인라이튼은 두 가지의 긴 단계, 즉 클러스터링과 광원 전송 단계를 거칩니다. 첫 번째 단계에서는 클러스터라고 불리는 표면 패치 컬렉션으로 씬을 단순화하고, 두 번째 단계에서는 이러한 클러스터 간의 가시성을 계산합니다. 이러한 미리 계산된 데이터는 런타임 시 상호작용을 통해 간접 조명을 생성하는 데 사용됩니다. 인라이튼의 장점은 미리 계산된 데이터가 클러스터 간의 관계에 기반하므로 조명을 실시간으로 편집할 수 있다는 점입니다. 하지만 다른 기존 라이트매핑 기술과 마찬가지로 씬의 정적 지오메트리를 수정하면 새로운 사전 계산이 트리거됩니다.
베이크된 전역 조명: 조명이 라이트맵이라고 불리는 텍스처와 라이트 프로브로 베이크됩니다. 베이크된 GI 시스템은 다음 라이트매퍼 중 하나를 사용할 수 있습니다.
프로그레시브 라이트매퍼는 카메라에 보이는 오브젝트에 대한 조명 사전 계산을 우선적으로 처리할 수 있으며 조명에 대한 반복 작업의 속도를 크게 높일 수 있습니다. 단, 전체 씬의 전반적인 베이킹 시간이 증가합니다. 프로그레시브 라이트매퍼는 CPU를 사용하며 경로 추적을 통해 간접 조명을 계산합니다. 새로운 GPU 프로그레시브 라이트매퍼가 현재 개발되는 중이며, 씬의 베이킹 시간을 크게 줄여줄 것으로 기대합니다.
인라이튼과 프로그레시브 라이트매퍼는 모두 다른 방식으로 베이크된 조명을 생성하기 때문에 조명 결과가 서로 완전히 일치하지 않을 수 있습니다.
아래 다이어그램에서 각 전역 조명 시스템의 장단점을 살펴본 후 프로젝트에 가장 적합한 전역 조명 시스템을 선택하십시오.
어느 전역 조명 시스템을 사용하든 Unity는 조명의 베이킹/사전 계산 중에 ’Lightmap Static’이라고 표시된 오브젝트만 처리합니다. 동적(즉, 비정적) 오브젝트는 간접 조명을 받기 위해 씬 곳곳에 배치한 라이트 프로브를 사용해야 합니다.
조명의 베이킹/사전 계산은 비교적 느린 프로세스이므로 뚜렷한 조명 배리에이션을 가진 크고 복잡한 에셋(예: 오목면, 자체 그림자)에만 ‘Lightmap Static’ 태그를 지정해야 합니다. 균일한 조명을 받는 작고 볼록한 메시는 ’정적’으로 표시하면 안 되며, 조명의 단순 근사치를 저장하는 라이트 프로브에서 간접 조명을 받아야 합니다. 더 큰 동적 오브젝트는 LPPV를 사용하면 더욱 뛰어난 국지적 간접 조명을 받을 수 있습니다. 씬에서 ’Lightmap Static’으로 태그가 지정된 오브젝트의 수를 제한하면 베이킹 시간을 대폭 줄이고 적절한 조명 품질을 유지할 수 있습니다. 이러한 최적화 프로세스와 프로브 조명의 중요성은 이 튜토리얼에서 자세히 알아볼 수 있습니다.
Unity는 베이크된 GI 시스템과 실시간 GI 시스템을 동시에 활성화하여 모든 조명 기능에 액세스하도록 허용합니다. 하지만 두 시스템을 동시에 활성화하면 런타임 시 베이킹 시간과 메모리 사용량이 크게 증가한다는 경고를 받게 됩니다. 이러한 시스템이 동일한 데이터 집합을 사용하지 않기 때문입니다. 게다가 런타임 시 간접 조명의 인터랙티브 업데이트를 수행하면 CPU에 추가 부하를 주게 되어 베이크된 GI 시스템과 실시간 GI 시스템이 제공한 간접 조명을 육안으로 확인하면 서로 일치하지 않을 수 있습니다. 이는 각 GI 시스템이 서로 다른 기술을 사용하여 간접 조명을 시뮬레이션하고, 때로는 아주 다른 해상도에서 동작하기 때문입니다.
이 두 GI 시스템은 고사양 플랫폼, 또는 성능 소모가 예측 가능한 엄격히 통제된 씬이 포함된 프로젝트에만 동시에 사용해야 합니다. 또한 이 두 GI 시스템을 모두 관리하려면 복잡도가 늘어나기 때문에 모든 조명 설정을 완전히 이해하고 있는 전문가만 사용하는 것이 좋습니다. 따라서 두 GI 시스템 중 하나를 선택하는 것이 대부분의 프로젝트에 바람직합니다. 두 시스템을 모두 사용하는 것은 별로 권장하지 않습니다!
광원 모드는 다소 혼란스러울 수 있는 프로퍼티입니다. 무엇보다도, 광원 모드는 베이크된 전역 조명 시스템을 활성화한 경우에만 유효합니다.
다음의 세 가지 모드가 광원 인스펙터에서 제공됩니다.
GI 시스템을 사용하지 않고 실시간 GI 시스템만 사용하는 경우에는 모든 베이크된 광원과 혼합 광원이 실시간 광원으로 오버라이드됩니다!
다음 다이어그램은 의사결정 차트와 비교 표를 결합한 것으로, 씬에 새로운 광원이 추가될 때마다 적절한 광원 모드를 선택하는 데 도움이 됩니다.
이전 다이어그램에서 볼 수 있듯이, 혼합 광원에는 Lighting > Settings 창에서 선택한 전역 혼합 조명 모드에 따라 특정한 베이크된 기능과 실시간 기능이 포함되어 있습니다.
다음 네 가지 모드 중에서 선택할 수 있습니다.
섀도우 마스크 모드와 섀도우 디스턴스는 Edit > Project Settings > Quality에서 조정할 수 있습니다. HDRP를 사용할 때는 그래픽스 설정에 할당된 HDRenderPipelineAsset에서 섀도우 마스크 모드가 활성화되는 반면, 그림자 최대 거리는 Scene Settings 오브젝트에서 설정됩니다.
HDRP는 새로운 하이브리드 섀도우 마스크 모드를 지원합니다. Additional Settings의 Non Lightmapped Only 체크박스를 통해 특정 광원이 실시간 그림자를 드리우게 만들지 제어할 수 있습니다. 이 파라미터를 사용하면 카메라가 광원의 페이드 거리 내에 있을 때 실시간 동적 그림자를 드리우고, 그렇지 않은 경우에는 베이크된 섀도우 마스크로 폴백합니다. 이러한 새로운 HDRP 모드의 주요 이점은 주요 방향 광원이 사용하는 그림자 거리 내 특정 광원에 실시간 그림자가 아니라 베이크된 광원을 사용할 수 있다는 점입니다.
LWRP와 HDRP는 여전히 프리뷰 단계입니다. 즉, 흥미롭고 새로운 기능을 사용할 수 있지만, 빌트인 파이프라인에서 제공하는 일부 기능을 지원하지 않거나 다른 기능에 대한 지원이 없을 수 있습니다. 다음 표에서 Unity 2018.3용 조명 파이프라인의 현재 상태에 대한 개요를 확인할 수 있습니다.
지금까지 렌더 파이프라인과 주요 조명 기능에 대해 소개해드렸습니다. 이제는 몇 가지 프로젝트 사례와 각 프로젝트에 사용할 수 있는 조명 설정을 살펴보겠습니다. 모든 프로젝트는 제각기 고유하므로 해당 요구사항에 따라 약간 다른 옵션을 사용할 수 있습니다.
프로토타입을 빌드하기 위해 에셋 스토어를 많이 사용하는 경우 에셋 스토어에 있는 대부분의 에셋이 HDRP 및 LWRP와 완전히 호환되지 않을 수 있기 때문에 빌트인 렌더 파이프라인을 선택하는 것이 좋습니다. 하지만 에셋 호환성은 시간이 지나면서 개선될 예정입니다. 모든 에셋을 처음부터 빌드하고 프로젝트 요구사항을 분명하게 파악하고 있다면 두 가지 SRP(LWRP 또는 HDRP) 중에서 한 가지를 선택하거나 커스텀 렌더 파이프라인을 만들 수 있습니다.
(사전) 프로덕션의 초기 단계에 있고 조명에 대한 빠른 턴어라운드와 최대 유연성이 필요한 경우 사전 계산이 필요 없는 완전 실시간 방식을 선택하여 베이크된 GI 시스템과 실시간 GI 시스템을 모두 비활성화할 수 있습니다. 적절한 간접 조명의 부재 문제를 완화하기 위해 포스트 프로세싱 스택 V2에서 스크린 공간 앰비언트 오클루전을 활성화할 수 있습니다. 그러면 성능 부하가 작은 실시간 컨택트 섀도우를 제공하여 씬에 오브젝트를 쉽게 배치할 수 있습니다.
모바일 기기를 대상으로 하는 경우 LWRP를 사용하면 전략 게임에 적합한 성능을 효과적으로 확보할 수 있습니다. 게임에 맞게 렌더링 파이프라인을 커스터마이즈해야 하는 경우 그래픽스 프로그래머가 간단하게 LWRP를 확장할 수 있습니다.
LWRP를 선택하고 베이크된 전역 조명을 사용하는 경우 현재 서브트랙티브 조명 모드만 혼합 광원에 사용할 수 있다는 점에 유의하십시오. 베이크된 간접 모드와 섀도우 마스크 모드에 대한 지원은 향후 릴리스에서 추가될 예정입니다.
또는 예를 들어 에셋 스토어의 에셋을 많이 사용하기 때문에 예전의 빌트인 렌더 파이프라인을 그대로 사용하기로 결정한 경우에는 모든 전역 혼합 조명 모드가 지원됩니다. 이 경우 섀도우 마스크 조명 모드의 방식을 통해 베이크된 그림자를 제공하는 동시에 동적 오브젝트가 실시간 그림자를 드리우도록 만들 수 있습니다. 섀도우 마스크의 성능 소모가 너무 커서 프로젝트에 사용할 수 없으면 성능 소모가 가장 적은 서브트랙티브 모드로 폴백할 수 있습니다. 마지막으로 현재 레벨에 광원 수가 매우 적고 구형 하드웨어를 대상으로 하는 경우에는 포워드 렌더링 경로가 최고의 옵션일 수 있습니다.
일자형 FPS 게임을 위해 PC와 콘솔에서 AAA급 품질의 비주얼을 구현하고자 하는 경우 HDRP를 렌더 파이프라인으로 선택하는 것이 좋습니다. 다시 말하지만, 그래픽스 프로그래머의 도움을 받아 커스텀 SRP를 개발할 수도 있습니다.
현재 레벨에 실시간 그림자를 드리우는 광원(예: 파괴 가능한 광원 소품과 움직이는 광원)이 많은 경우에는 베이크된 GI 시스템을 베이크된 간접 모드와 함께 사용하면 혼합 방향 광원에서 뛰어난 간접 조명을 얻고 정적 광원 소품에서 베이크된 광원을 얻을 수 있습니다. 현재 레벨에서 그림자를 드리우는 고정 광원의 비율이 큰 경우 섀도우 마스크 모드의 방식을 추천합니다. 이는 HDRP가 제공하는 우수한 하이브리드 섀도우 마스크 모드를 사용하여 실시간 그림자와 베이크된 그림자 간의 블렌드를 더욱 세세하게 제어할 수 있기 때문입니다.
이러한 타입의 일자형 게임은 대개 성능 및 메모리 소모의 예측이 매우 쉽기 때문에 베이크된 GI 시스템과 실시간 GI 시스템을 동시에 활성화할 수도 있습니다. 하지만 전역 조명 섹션에서 설명한 것처럼 두 시스템을 동시에 사용하면 성능 소모와 베이킹 시간이 크게 증가할 수 있으므로, 모든 기술적 사항을 이해하고 있는 전문가만 사용하는 것이 좋습니다.
PC 및 콘솔용 배틀 로얄 게임을 출시하려는 경우에는 대규모 환경과 완전한 동적 조명이 필요하기 때문에 HDRP를 선택하거나, 확장을 통해 렌더링 파이프라인을 프로젝트에 맞춤 설정해야 합니다. AAA 비주얼 정확도를 목표로 하지 않고 모바일 기기나 저사양 시스템을 대상으로 한다면 LWRP를 고려할 수도 있습니다.
낮-밤 사이클을 구현하기 위해 HDRP를 선택한 경우 실시간 GI 시스템을 활성화하여 하루 종일 간접 조명을 시뮬레이션해야 합니다. 밀도가 높은 조명을 비춘 실내에서 성능을 극대화하려면 실시간 GI 시스템이 이를 무시하고 렌더링 성능 소모를 최소화하도록 특정 광원의 간접 멀티플라이어를 0으로 설정할 수 있습니다.
LWRP는 실시간 전역 조명 시스템을 지원하지 않습니다. 따라서 하루 종일 태양과 앰비언트 컬러를 조절하는 커스텀 스크립트를 통해 낮-밤 사이클을 처리해야 합니다.
이러한 특정한 시나리오에서 실시간 GI 시스템과 베이크된 GI 시스템을 동시에 활성화하는 것은 적절하지 않습니다. 그러면 거대한 레벨의 성능 및 씬 관리에 막대한 성능이 소모될 수 있습니다. 이 두 GI 시스템을 동시에 사용하지 말아야 하는 또 다른 이유는 대규모 멀티플레이어 게임의 경우 예측 불가능한 요소가 많기 때문입니다. 따라서 고도로 스크립트화된 싱글플레이어 어드벤처 게임보다 인스턴스에 대한 성능 예측이 더 어렵습니다.
스크립터블 렌더 파이프라인을 도입한 덕분에 지난 몇 달에 걸쳐 Unity의 렌더링 환경이 크게 바뀌었습니다. 따라서 이러한 조명 파이프라인의 모든 변경 사항과 그로 인한 영향을 모두 파악하기가 어려울 수 있습니다.
이 가이드와 여기에 수록된 많은 예시가 각 렌더 파이프라인을 이해하는 데 도움이 되길 바랍니다. 또한 모든 사용자가 Unity 프로젝트에 올바른 조명 설정을 원활하게 사용할 수 있게 되기를 바랍니다!
Unity의 조명과 렌더링 파이프라인에 관한 정보는 다음 문서에서 자세히 알아볼 수 있습니다.