Unity 2022 LTS 및 2023.1의 새로운 워터 시스템

대부분의 고급 환경에는 바다, 호수, 강, 심지어 수영장이 필요합니다. 몇 가지 셰이더로 이를 에뮬레이트하는 방법은 여러 가지가 있지만, 고해상도 렌더 파이프라인(HDRP)에서 물리 기반의 일관된 통합 시스템을 구축하는 것은 복잡하고 시간이 많이 소요되는 작업이었습니다.
오늘은 렌더링에 중점을 두고 2022.2 테크 스트림의 일부로 HDRP에 처음 도입된 새로운 Unity 워터 시스템을 집중 조명합니다. 곧 출시될 2023.1 테크 스트림에서는 월드 및 게임플레이와 더 잘 통합되도록 시스템의 기능 세트가 확장됩니다.
이제 환경 아티스트는 바다, 호수, 강, 수영장 등의 수면을 쉽게 생성하고 구성하여 보트나 해변과 같은 다른 월드 및 게임플레이 요소와 통합할 수 있습니다.
첫 번째 단계는 프로젝트에서 물을 활성화하는 것입니다:
- 각 품질 수준에 맞는 물 활성화 및 구성(각 품질 수준에 맞는 파이프라인 에셋 렌더링)
- 카메라의 프레임 설정에서 물 활성화하기
- 카메라 위치에 따라 필요할 때만 워터 렌더링을 활성화할 수 있는 워터 렌더링 볼륨 오버라이드를 사용하여 씬 내부의 물을 활성화할 수 있습니다.
물이 활성화되면 게임 오브젝트 메뉴에서 몇 번의 클릭만으로 아름다운 수역을 만들 수 있습니다. HDRP는 수영장, 강, 바다의 세 가지 수면 유형을 제공합니다.


수역을 빠르게 생성할 수 있는 워터 시스템은 월드와 게임플레이에 물을 커스터마이징하고 통합할 수 있는 다양한 툴과 옵션을 제공합니다.
사용 중인 모든 시스템과 확장 기능에 대한 간략한 개요를 보려면 HDRP 패키지의 물 샘플을 살펴보세요(패키지 관리자 열기 > 에셋에서 고해상도 렌더 파이프라인 패키지 선택 > 샘플 섹션에서 물 샘플 선택).
네 가지 샘플 장면을 제공합니다.
수영장 씬은 같은 씬에서 서로 다른 높이의 서로 다른 "풀"을 설정하는 방법과 커스텀 메시를 사용하여 커스텀 모양으로 표면을 렌더링하는 방법을 보여줍니다.
섬 씬에는 섬 주변의 부유물을 제거하는 워터 마스크, 파도를 만드는 워터 디포머, 해변에 거품을 만드는 데칼, 파도 뒤와 섬 주변에 거품을 생성하는 폼 제너레이터, 보트 내부의 물을 배제하는 워터 엑설러가 포함되어 있습니다. 또한 물 위에 떠 있는 여러 개체(예: 갈매기)의 계산을 병렬화하기 위해 Burst를 물 쿼리 API와 함께 활용하는 데 중점을 둡니다.
빙하 장면에서는 다음과 같은 다양한 기능을 선보입니다:
- 강 수역
- 폭포를 만드는 워터 디포머
- 빙하를 통과하는 물의 흐름을 만들기 위한 전류 시뮬레이션
- 빙산을 강물에 띄우는 물 쿼리 API
- 빙산 뒤에 거품을 추가하는 거품 생성기
- 셰이더 그래프와 워터 마스터 노드를 사용하여 강 테두리와 폭포 소용돌이에 커스텀 폼을 적용합니다.
- 폭포에서 떨어지는 물에 애니메이션을 적용하는 데칼
- 물 밖에서 투사하는 샘플 부식제
워터 라인 씬은 커스텀 패스를 사용하여 물의 표면 레벨과 수중 렌더링을 사용자 정의하여 더 큰 흐릿한 분리를 생성하고 카메라 렌즈에 물의 효과를 시뮬레이션하는 방법을 보여줍니다.
이제 전체 브리핑을 마쳤으니 각 시스템에 대해 자세히 알아보겠습니다.
워터 시스템에는 HDRP에 최근 도입된 라이팅 모델에서 설계된 기성품의 물리 기반 물 셰이더가 포함되어 있으며, 셰이더 그래프에서도 커스터마이징을 위해 사용할 수 있습니다. 수면의 매끄러움, 굴절, 흡수, 확산 및 빛의 산란 특성을 조정할 수 있습니다.
산란 색은 물의 기본 색상과 같은 역할을 하므로 거기서부터 시작하여 전체적인 느낌을 설정해야 합니다. 그런 다음 흡수 거리와 굴절 색상을 변경하여 물의 투명도와 물의 굴절을 통해 보이는 물체에 적용되는 색조를 제어할 수 있습니다. 깨끗한 카리브해의 경우 청록색 산란 및 굴절 색상과 함께 흡수 거리가 큰 반면, 더러운 강은 짙은 갈색 산란 색상과 흡수 거리가 작은 준불투명 강을 원합니다.
2022.2의 물 렌더링에는 몇 가지 제한 사항이 있으며, 이 중 일부는 2023.1에서 해결되었거나(볼류메트릭 클라우드 뒤의 물 보기, 정확한 수위선) 2023.2에 적용될 예정입니다(성능 개선, 물 위에 투명한 표면을 겹쳐서 렌더링하는 기능 지원).
저희처럼 쿠스토 사령관의 팬이라면 워터 시스템으로 수중 다이빙을 즐길 수 있습니다. 카메라가 수면 아래에 있을 때를 감지하고 물의 물리적 특성에 따라 수중 렌더링을 시뮬레이션할 수 있습니다.
코스틱스는 절차적으로 생성하여 지표면에 투영된 표면의 빛 굴절을 시뮬레이션할 수 있습니다. 예를 들어 동굴 내부에 반사된 물의 부식성을 시뮬레이션하기 위해 데칼을 사용하여 부식성을 물 밖의 투영으로 재사용할 수 있습니다.
카메라가 물과 외부 사이에 위치하면 물줄기가 생성되고 카메라가 물에 잠긴 부분에 수중 렌더링이 구성됩니다. 2023.1에서는 워터 라인 렌더링이 개선되어 커스텀 패스로 커스터마이징할 수 있습니다(참조: 워터 라인 샘플 장면).
물을 더욱 시각적으로 매력적으로 만드는 것은 물이 움직이는 방식입니다. 제공되는 물 시뮬레이션 시스템은 유체 또는 스플래시 시뮬레이션이 아닌 물면 변형에 중점을 둡니다.
파동은 고속 푸리에 변환(FFT) 시뮬레이션을 사용하여 절차적으로 생성됩니다. 간단히 말해, 이것은 주파수가 다른 수많은 단순파를 합산하여 복잡한 파동을 형성하는 방식으로 작동합니다. 주파수 범위를 조절하여 물의 교반을 제어할 수 있습니다.
이 시스템은 다양한 범위의 주파수를 더하는 방식으로 작동하며, 이를 밴드라고 부릅니다.

HDRP는 최대 3개의 밴드를 지원하여 현실 세계의 세 가지 효과를 물에 시뮬레이션하고 대부분의 사용 사례를 다룹니다:
- 달과 먼 바람의 영향으로 발생하는 파도를 나타내는 파도입니다. 거리 바람 매개변수에 의해서만 제어되며 스웰의 방향을 지정할 수 있습니다.
- 바람으로 인해 발생하는 혼란을 나타내는 애그리게이션.
- 물결 - 해류 또는 국부적인 바람 효과를 나타냅니다. 이 대역은 가장 높은 주파수 또는 가장 작은 파도를 가진 대역으로, 물에 미세한 디테일을 더합니다.

예를 들어, 풀은 작은 섭동을 가지므로 가장 높은 주파수 대역인 리플만 사용합니다. 조금 더 복잡한 강에는 잔물결과 교반 밴드가 있습니다. 그리고 바다는 우리가 실생활에서 볼 수 있는 다양한 파도 크기를 모두 커버할 수 있는 전체 주파수 범위를 가지고 있습니다. 시뮬레이션은 정사각형 패치에서 수행된 다음 무한히 반복됩니다.
2023.1에서는 플로우맵에 따라 물결이 흐르도록 하는 전류에 대한 지원이 추가됩니다. 시뮬레이션은 완전히 결정론적이기 때문에 멀티플레이어 게임, 물리 시뮬레이션, 단편 영화나 시네마틱을 녹화할 때 일관된 결과를 얻을 수 있습니다.
수면면 변형을 렌더링하기 위해 시스템은 버텍스 변위를 사용하며, 제공된 절차적으로 생성된 지오메트리 또는 사용자가 제공한 커스텀 메시를 적용할 수 있습니다. 절차적 지오메트리는 지형이 렌더링하는 것과 유사하게 쿼드를 나란히 인스턴스화하는 방식으로 작동합니다. 무한한 바다나 긴 강을 만들 때 카메라의 위치에 따라 버텍스 밀도를 조정할 때도 사용할 수 있습니다.
또한 작은 잔물결을 렌더링하기 위해 더 미세한 버텍스 밀도를 갖기 위해 HDRP는 특수 셰이더를 사용하여 삼각형을 세분화하는 방법인 GPU 테셀레이션에 의존할 수 있습니다. 이 기능을 사용하면 카메라가 수면에서 특정 범위에 있을 때 시점에 가까운 곳에 더 많은 삼각형이 생성되는 것을 볼 수 있습니다.
또한 시각적 품질과 렌더링 성능 간의 균형을 맞출 수 있는 다양한 옵션을 제공합니다. 성능 최적화에 대한 자세한 내용은 문서에서 확인하세요.
방금 설명했듯이 시뮬레이션은 효율성을 위해 전적으로 GPU에서 실행되지만 일부는 CPU에서 미러링하여 물의 높이와 흐름을 샘플링할 수 있습니다(예: 강을 따라 물체를 띄우는 경우).
시뮬레이션에 필요한 계산이 많기 때문에 CPU 비용이 높지만, 버스트화된 작업을 사용하여 작업을 보다 효율적으로 병렬화함으로써 이를 합리적으로 유지합니다.
피드백에 따라 스크립팅 API는 2022.2와 2023.1 사이에 발전했으며, 두 버전 간에 코드를 조정해야 할 수도 있습니다.
먼저 물 씬에서 두 가지 코드 샘플을 확인할 수 있는데, 하나는 섬 씬에서 버스트를 활용하여 많은 오브젝트의 샘플링을 병렬화하는 방법이고, 다른 하나는 빙하 씬에서 더 간단한 비병렬화 코드를 사용하여 빙산이 강물을 따라 떠다니고 폭포 아래로 떨어지게 만드는 방법을 보여줍니다.
거품은 절벽의 바람, 해안이나 바위에 부딪히는 파도, 물속에서 움직이는 보트나 캐릭터에 의해 물 위나 물속에서 생성되는 거품을 시뮬레이션합니다.
워터 시스템은 수체 시뮬레이션과 강과 바다의 거리 풍속을 기반으로 거품을 자동으로 생성할 수 있습니다. 그런 다음 거품의 양을 조절하고 모양을 조정하여 부드러움과 텍스처의 타일링을 선택할 수 있습니다.

2023.1 버전에서는 보트 트레일, 파도 또는 오픈 워터의 바위 주변에서 급류를 시뮬레이션할 수 있는 거품 생성기가 추가되어 거품이 생성되고 파도에 따라 자체 코스를 계속 따라갈 수 있습니다. 샘플 씬에서 폼 생성기의 다양한 사용 예시를 확인할 수 있습니다: 섬 씬에서는 부서지는 파도 위와 섬 주변에 거품을 생성하는 데 사용되며, 빙하 씬에서는 강을 따라 떠다니는 빙산 뒤에 거품을 생성하는 데 사용됩니다.

셰이더 그래프를 사용하여 워터 마스터 노드에 커스텀 폼을 주입하고 이를 사용하여 강 테두리나 폭포의 소용돌이 같은 커스텀 프로시저럴 폼을 추가할 수 있습니다. 예를 들어 빙하 샘플에서 폭포 바닥의 소용돌이는 셰이더 그래프에서 커스텀 폼 텍스처를 스크롤하고 블렌딩하기만 하면 완성됩니다. 테두리의 거품은 뎁스 버퍼를 샘플링하여 대략적인 깊이로 만들어집니다.

파도의 교반이 필요한 곳에 시뮬레이션 거품이 주입됩니다. 그러나 예술적인 목적을 위해 폼 마스크를 사용하여 폼이 닿지 않도록 일부 영역을 가릴 수 있습니다.
보다 사실적으로 보이게 하려면 수면과 시뮬레이션을 로컬에서 수정하여 월드 및 소품과 더 잘 통합되도록 해야 합니다. 예를 들어, 보트 내부의 물 지오메트리를 제거하려면 파도에 노출된 해변의 해안 근처에 부서지는 파도를 추가하고, 바위 주변에 거품을 생성하고, 지역 해류를 수정하고, 만 내부의 잔잔한 지역을 형성하고, 강 한가운데 폭포를 만들거나 강에 작은 소용돌이를 생성하거나 바다 한가운데에 거대한 소용돌이를 만들어야 합니다.
여러 구성 요소를 사용하여 시뮬레이션, 거품 및 전류를 사용자 지정하여 이러한 국소적인 변화 또는 더 복잡한 효과를 만들 수 있습니다:
- 워터 마스크를 사용하면 수면의 특정 부분에서 잔물결, 부풀어 오름, 거품을 약화시키거나 억제할 수 있습니다.
- 물 위에 데칼을 추가하여 국부적인 거품을 만들거나 물의 매끄러움을 덮어쓰거나 노멀 맵을 사용하여 물방울, 충격 또는 커스텀 파문과 같은 작은 국부적인 변형을 시뮬레이션할 수 있습니다. 또한 물 시스템과 독립적으로 모래나 바위의 습기(섬 샘플 씬 참조) 또는 벽의 부식성(빙하 샘플 씬 참조)을 시뮬레이션하는 데 사용할 수 있습니다. 데칼은 회색조로만 처리되므로 색상을 변경할 수 없습니다.
- 워터 디포머는 시뮬레이션을 로컬로 수정하여 섬 샘플에서 볼 수 있는 것처럼 파도를 만들거나 빙하 샘플에서 볼 수 있는 것처럼 폭포를 만들 수 있습니다.
다양한 콘솔에서 대부분의 기능이 활성화되는 빙하 씬의 성능을 측정하고 이를 기반으로 워터 시스템을 프로파일링했습니다. 측정을 통해 최신 세대의 GPU에서는 워터 렌더링 시간이 약 4ms가 걸리는 반면, 이전 세대의 콘솔에서는 약 7ms가 걸린다는 사실을 알게 되었습니다. 물론 이는 물의 품질 설정, 시뮬레이션의 복잡성, 화면에 표시되는 물 픽셀의 양에 따라 크게 달라집니다. 그러나 이 시스템은 다양한 플랫폼에서 원활하게 실행될 수 있을 만큼 성능이 뛰어납니다.
또한 이 시스템은 음영을 최적화하고 많은 수의 광원을 지원하기 위해 디퍼드 클러스터 조명을 사용하고 있습니다. 원거리에서도 멋진 파도를 얻기 위해 필요한 버텍스 수가 중요하기 때문에 대부분의 렌더링 시간은 GBuffer 패스에서 발생합니다. 표면에서 GPU 테셀레이션을 활성화할 때 이 비용은 카메라가 물에서 멀리 떨어져 있을 때 최대 테셀레이션 레벨과 페이드 거리를 변경하여 제어할 수 있습니다.
각 수면의 기타 섹션에서는 다양한 디버그 모드에 액세스하여 현재 방향, 변형, 거품 및 수면에 적용된 기타 마스크를 시각화할 수 있습니다.

워터 시스템이 보다 복잡한 장면에서 실행되는 것을 확인하기 위해 수영장, 섬, 강 장면을 보여주는 데모 프로젝트를 만들었습니다.

섬 장면은 해변에 파도가 밀려오는 무한한 바다를 보여줍니다. 워터 마스크를 사용하고 커스텀 렌더 텍스처를 사용하여 디포머와 폼 제너레이터를 만드는 방법을 보여줍니다. 또한 데칼을 사용하여 파도가 해변에 다가올 때 수면과 복잡한 상호작용을 일으킵니다.
수영장 씬은 사실적인 색상, 깊이, 수중 및 부식성이 있는 실내 수면을 선보입니다.

강 씬은 인스턴스화된 쿼드를 사용하고 현재 맵을 활용하여 흐름을 시뮬레이션하고 데칼, 커스텀 셰이더 그래프 및 VFX 그래프를 활용하여 시각적 효과를 높였습니다.
데모는 GitHub에서 다운로드할 수 있습니다.
워터 시스템을 사용하려면 HDRP 및 Unity 2022.2 이상 버전으로 작업해야 합니다.
초기 기능 중 일부는 2022.2에서도 사용할 수 있지만, 일부 API 변경을 포함하여 여러 개선 사항과 기능이 추가된 2023.1부터 시작하는 것이 좋습니다.
패키지 관리자에서 물 샘플을 다운로드하여 샘플 코드와 시스템을 재사용할 수 있습니다. 또한, 워터 시스템 통합에 대한 보다 복잡한 예시를 보려면 GitHub에서 WaterScenes 데모 프로젝트를 확인해 보세요.
자세한 내용은 GDC 2023에서 레미와 에이드리언의 워터 시스템 심층 분석을 시청하거나 유니티 문서를 읽어보세요.