Search Unity

사진처럼 사실적인 디지털 휴먼을 제작하려면 높은 수준의 시각적 정확도를 구현하기 위해 많은 양의 데이터가 필요하며, 기술적으로 복잡한 과제입니다. 데모 팀은 더 헤러틱(The Heretic)을 제작하면서 얼굴 애니메이션과 관련된 문제들을 해결하기 위한 여러 툴을 개발하여 머리카락을 피부에 붙이거나 눈, 이, 피부를 Unity에서 렌더링했습니다. 해당 툴은 GitHub에서 확인할 수 있습니다. 툴 제작 과정에 대한 전체 기술 요약은 아래에서 확인하시기 바랍니다.

저는 유니티 데모 팀의 수석 소프트웨어 엔지니어 라세 욘 풀상 페데르센입니다. 더 헤러틱 제작 과정에서 영상 속 디지털 휴먼인 가웨인의 얼굴과 관련된 기술 솔루션을 제작했습니다.

디지털 휴먼 패키지는 최근 GitHub에 스탠드얼론 패키지로 릴리스되었으며, 이번 블로그 포스팅에서는 패키지에 포함된 기능 일부와 개발 과정을 소개합니다.

얼굴 애니메이션

더 헤러틱의 디지털 휴먼을 제작할 때 주요 목표 중 하나는 캐릭터를 사실적으로 구현하되, 얼굴 애니메이션 과정에서 불쾌한 골짜기(uncanny valley)를 방지하는 것이었습니다. 배우의 연기와 최대한 유사하도록 얼굴 메시 애니메이션에 4D 캡처 데이터(애니메이션 프레임당 3D 스캔)를 이용했으며, 그 결과 배우의 표정 연기(가려지지 않은 부분)에 일치하는 정확한 지오메트리를 확보할 수 있었습니다.

4D 캡처 데이터를 사용하며 발생한 문제에 대한 자세한 내용은 애니메이션 감독 크라시미르 네체프스키가 작성한 이전 블로그 포스팅에서 보실 수 있습니다. 캡처된 데이터를 처리하고 미세 조정하는 방법을 연구하여 만족스러운 결과물을 얻기까지는 상당한 노력이 들었습니다.

눈꺼풀 처리 과정

눈꺼풀 지오메트리를 작업할 때는 캡처하는 동안 속눈썹이 눈꺼풀 일부를 가려서 캡처된 데이터도 속눈썹의 영향을 받아 해당 영역에 노이즈가 나타났습니다. 그 결과, 눈꺼풀의 지오메트리가 부정확하고 떨림 현상이 있어서 해당 영역의 지오메트리를 복원하는 방법을 찾아야 했습니다.

눈꺼풀 부근의 지오메트리 떨림 현상

작업 초반부터 눈꺼풀 지오메트리에 문제가 있었기 때문에, 임포터를 이용하여 데이터를 Unity로 임포트하는 과정에서 차등적인 메시 처리 기술을 이용하여 영역에 따른 노이즈 감소와 복원에 대한 실험도 진행했습니다. 시간의 흐름에 따른 곡률의 영역 변화를 부드럽게 처리하여 노이즈를 감소시키고 (정제된) 기본 메시의 곡률을 캡처된 시퀀스 프레임의 손상된 영역으로 각각 이식하여 복원했습니다.

눈꺼풀 근처 노이즈 제거 지오메트리 이식

결과는 조금 더 나아졌지만 아쉽게도 원본 데이터와 비교했을 때 합성한 느낌이 들었습니다. 눈꺼풀의 안정성은 향상되었지만 진짜 사람의 눈처럼 느껴지던 원래의 움직임이 일부 사라졌습니다. 둘 사이의 타협점을 찾기에는 시간이 현실적으로 충분치 않았지만 한 외부업체가 복원 작업을 제의하여 이를 수용하게 되었습니다. GitHub 패키지에는 노이즈 제거와 영역 이식을 위해 작성된 내부용 툴이 포함되어 있으므로 학습 자료로 활용하실 수 있습니다.

주름 표현

대상 얼굴 메시의 해상도 때문에 미세한 표면 디테일이 부족한 문제도 있었습니다. 가웨인의 얼굴 메시는 약 28,000개의 버텍스로 이루어져 있는데, 이는 배우의 동작으로 나타나는 미세한 주름을 표현하기에 충분하지 않으며 피부 모공의 확장을 표현하기에는 더욱 부족합니다. 원시 4D 데이터가 디테일을 일부 가지고 있었지만, 변형 및 렌더링 중인 메시의 버텍스 예산에 맞춰 데이터를 처리한 후에는 그 디테일을 유지할 수 없었습니다. 노멀 맵을 프레임마다 베이크하는 방법도 있지만 상당히 많은 디스크 공간이 필요하게 됩니다.

미세한 표면 디테일을 처리하기 위해 저희는 임포트된 시퀀스의 지오메트리와 Snappers Systems의 블렌드 셰이프 기반 얼굴 릭(Rig)에서 제공하는 포즈 기반 특징 맵을 결합하기로 했습니다. 얼굴 릭의 포즈 기반 특징 맵에는 주름이나 모공의 확장과 같이 임포트된 시퀀스에 없었던 유형의 표면 디테일이 포함되어 있습니다. 따라서 4D의 각 프레임에 가장 알맞은 블렌드 셰이프의 조합을 찾아낸 후에 해당 가중치를 사용하여 포즈 기반 특징 맵(블렌드 셰이프의 변형 제외)을 구동하면 4D 플레이백 중에 표면 디테일을 향상할 수 있습니다.

블렌드 셰이프를 4D에 맞추는 방법은 2단계 과정으로 이루어져 있습니다. 첫 번째 단계에서는 문제를 행렬 형식으로 놓고 최소 제곱법을 사용합니다. 모든 블렌드 셰이프(기본 메시의 델타)를 하나의 큰 행렬 A로 작성하면 각 열에 단일 블렌드 셰이프의 델타가 있게 되고, 복합 델타는 Ax = b로 주어집니다. 여기서 x는 블렌드 셰이프 각각의 가중치를 나타냅니다.

A의 역행렬이 존재하지 않는 경우가 많기 때문에(이 경우는 정방 행렬이 아니기 때문에 역행렬이 존재하지 않음) x 값을 구하지 못하는 경우가 종종 발생합니다. 하지만 문제를 조금만 다르게 수식화하면 근사해 x*를 도출해 내는 것은 가능합니다. 소위 정규 방정식이라 불리는 ATAx* = ATb를 이용하면 최소제곱해를 x* = (ATA)-1ATb로 쓸 수 있습니다. 그러면 A에 선형 독립 열만 있으면 됩니다. 블렌드 셰이프로 작업할 때, 포함된 셰이프를 필터링하여 선형 독립이 되도록 하면 근사해를 구할 수 있습니다. 릭의 필터링된 블렌드 셰이프에 대해 (ATA)-1A를 미리 계산한 다음, 4D의 각 프레임에 델타 b를 대입하여 x*(피팅된 가중치)를 계산합니다.

위에 언급된 비제약 최소 제곱 방식은 이 문제를 이해하는 데 도움은 되었지만 실제로 활용하기는 어려웠습니다. 또한 전체적으로 주어진 4D 프레임에 더 가까워지기 위해 해에 음의 가중치가 포함되는 경우도 있었습니다. 하지만 얼굴 릭의 경우 블렌드 셰이프를 빼지 않고 더해야만 했기 때문에, 피팅된 가중치가 릭의 제약 조건을 사실상 초과하여 주름을 제대로 구현하기 힘들었습니다.

다시 말해, 원하는 주름을 구현하려면 음수가 아닌 해가 필요했습니다. 음수가 아닌 해를 계산하기 위해 Accord.NET이라는 타사 라이브러리의 일부를 이용했습니다. 여기에는 음수가 아닌 최소 제곱 문제를 해결하기 위한 반복계산기법이 포함되어 있습니다. 문제를 분할하고 비제약 해를 테스트할 때 이미 필터링된 블렌드 셰이프 행렬 A와 원하는 델타 b를 확보한 상태였으므로 반복계산기법에 값을 대입하여 4D의 각 프레임에 대해 음수가 아닌 피팅된 가중치 집합을 손쉽게 얻을 수 있었습니다.

주름 피팅 전과 후의 이마 모습

더 나아가 기본 메시 위치 델타를 기반으로 하지 않고, 메시 가장자리 길이와 가장자리 곡률을 기반으로 하여 피팅된 가중치를 계산하는 실험도 해 보았습니다. 만약 4D 데이터에서 헤드 모션을 제거할 수 없다면, 피팅이 헤드 모션에 종속되지 않도록 위 방법 중 하나를 이용해야 합니다. 가웨인의 경우 위치 델타를 피팅하는 것으로 마무리되었지만, 패키지에서 나머지 두 개 옵션을 사용해 볼 수 있습니다.

Unity 워크플로

4D 데이터를 Unity로 가져오기 전에, 먼저 외부 툴을 이용하여 4D 캡처 데이터를 일련의 메시(확장자 .obj)로 전환하고 프레임 간 토폴로지가 일치하도록 했습니다. 또한 토폴로지는 데이터가 임포트되는 대상 메시의 토폴로지와도 일치해야 합니다. (자세한 내용은 크라시미르 네체프스키의 블로그 포스팅 참고)

그런 다음, 전처리된 4D 데이터를 Unity로 가져와 패키지에서 제공하는 커스텀 유형의 에셋 SkinDeformationClip을 사용하여 런타임 준비가 완료된 클립으로 전환합니다. SkinDeformationClip이 생성되면 4D 데이터 세그먼트를 임포트 및 처리할 수 있는 툴이 표시되며, 디스크 내의 obj 파일(프로젝트에 중간 단계 에셋을 포함할 필요가 없음) 또는 이미 프로젝트에 포함된 메시 에셋으로 경로를 지정할 수 있습니다.

클립 에셋을 생성하고 obj 파일에서 4D 프레임 임포트하기

SkinDeformationClip 에셋을 구성한 후, 인스펙터에서 Import 버튼을 클릭하여 프레임 데이터를 임포트하고 처리합니다. 에셋에서 메시 처리나 프레임 피팅이 활성화된 경우, 작업에 다소 시간이 걸릴 수 있습니다. 임포트가 끝나면, 임포트된 프레임 간격, 피팅된 가중치 등은 클립 에셋에 저장되지만, 최종 프레임 데이터는 저장되지 않습니다. 프레임 데이터는 에셋 옆에 있는 별도의 바이너리에 저장되며, 이를 통해 플레이하는 동안 디스크에서 데이터를 효율적으로 스트리밍할 수 있습니다.

임포트가 완료되면 Unity Timeline의 커스텀 트랙(SkinDeformationTimeline)으로 에셋을 끌어와 플레이할 수 있습니다. 이 유형의 트랙은 트랙에 클립 데이터를 출력하는 SkinDeformationRenderer 컴포넌트를 대상으로 합니다. 아래 동영상은 임포트된 4D 데이터를 Timeline에서 시퀀싱 및 플레이하는 과정을 보여줍니다.

Unity Timeline에서 클립 에셋 플레이

또한 커스텀 트랙과 SkinDeformationRenderer를 사용하면 다수의 4D 클립을 블렌딩하여 아티스트가 데이터를 창의적으로 활용할 수 있습니다. 예를 들어, 더 헤러틱의 파트 1에서는 테스트 문구와 초기 클로즈업을 위한 3초 동안의 연기만 포함하는 매우 짧은 4D 데이터 세그먼트만 사용했습니다. 하지만 데이터를 재사용하여(자르기, 스케일링 및 블렌딩) 파트 1의 나머지 얼굴 애니메이션 부분에 동일한 클립을 사용할 수 있었습니다.

피부 부착

얼굴 애니메이션에 4D 데이터를 직접 사용했기 때문에, 속눈썹, 눈썹, 수염과 같은 중요한 이차적 특징의 위치를 결정하는 데 뼈대의 가중치를 적용한 스키닝이나 블렌드 셰이프를 사용할 수 없었습니다. 따라서 애니메이션화된 얼굴 메시 자체에서 이러한 특징을 구현할 방법이 필요했습니다.

기술적으로 보면, 처리된 4D 데이터를 외부 툴로 로드하고 이차적 특징을 모델링하고 부착한 후 추가 데이터를 베이크할 수 있습니다. 하지만 프레임당 수만 개의 추가 버텍스를 스트리밍하면 스토리지 측면에서 비효율적이며 만족할 만한 결과를 얻기도 힘듭니다. 제작 기간 동안 4D 데이터로 반복 작업을 수행해야 하므로, 번거로운 베이킹 단계를 포함하지 않는 해결책이 필요했습니다.

이 문제를 해결하기 위해 ‘피부 부착 시스템’ 기능이 디지털 휴먼 패키지에 포함되었습니다. 기본적으로 이 시스템은 에디터 시점에서 임의의 메시와 트랜스폼을 주어진 대상 메시에 연결하고 런타임에 이들을 대상 메시의 애니메이션 방식과 관계없이 대상 메시에 부합하도록 결정합니다.

더 헤러틱의 디지털 휴먼 제작에는 피부와 관련된 눈썹, 속눈썹, 수염, 로직 마커를 구현하는 데 피부 부착 시스템을 이용했습니다. 또한 퍼(fur) 메시를 자켓에 부착할 때 이 시스템이 사용되었는데, 이에 관해서는 선임 3D 아티스트인 플라멘 탐네프가 작성한 포스팅에서 자세한 내용을 확인하실 수 있습니다.

시스템 사용법에 관한 이해를 돕기 위해, 게임 오브젝트의 트랜스폼을 가웨인의 얼굴에 부착하는 단계를 소개합니다.

  1. SkinAttachment 컴포넌트를 추가합니다.
  2. 인스펙터에서 부착 유형을Transform으로 설정합니다.
  3. 인스펙터에서 대상 필드가 얼굴의 SkinAttachmentTarget을 가리키도록 합니다.
  4. 트랜스폼을 원하는 상대 위치로 이동합니다.
  5. 인스펙터의Attach 버튼을 클릭합니다.

트랜스폼 배치 부착

작동 원리

Attach 버튼을 클릭하여 트랜스폼을 부착하면 시스템은 트랜스폼의 포지션을 이용하여 얼굴 메시의 가장 가까운 버텍스에 대해 k-d 트리를 쿼리합니다. 가장 가까운 버텍스는 해당 버텍스에서 모든 입사 삼각형을 식별하는 데 사용되며, 시스템은 각각의 입사 삼각형에 트랜스폼의 현재 포지션을 바탕으로 로컬 포즈를 생성하여 트랜스폼의 로컬 포즈의 집합을 만들어 냅니다.

가장 가까운 버텍스에서 입사 삼각형으로 투사

각 로컬 포즈는 연결된 점을 주어진 삼각형의 평면으로 투사한 것이며, 삼각형의 버텍스 인덱스, 연결된 점에서 삼각형까지의 노멀 거리 및 투사된 점의 무게중심 좌표를 포함합니다.

변형 이후, 각각 투사 해제하고 결과의 평균 구하기

단일 삼각형이 아닌 각각의 연결된 점에 대해 다수의 로컬 포즈를 생성하는 이유는 메시의 어떤 특정 삼각형에도 속하지 않는 점들을 지원하기 위해서입니다. 예를 들어 메시 위에 살짝 떠 있는 일부 헤어 카드(hair card)가 여기에 해당됩니다. 다수의 로컬 포즈를 바탕으로 연결된 점을 결정하려면, 먼저 로컬 포즈를 각 삼각형에서 투사 해제한 다음 삼각형 영역을 측정하여 결과값들의 평균을 냅니다.

생성된 로컬 포즈는 얼굴의 나머지 연결 부위의 모든 로컬 포즈와 함께 커다란 연속 배열에 저장됩니다. 각 연결 부위는 기본 데이터가 수정될 경우를 대비하여 체크섬을 사용하며 데이터에 대한 레퍼런스를 포함합니다.

메시를 부착하는 과정은 트랜스폼과 매우 유사하며, 다만 횟수가 훨씬 더 많다는 차이만 있습니다. 시스템은 메시를 부착할 때 트랜스폼의 단일 포지션이 아닌 메시의 각 버텍스마다 로컬 포즈 집합을 생성합니다.

일반 메시 모드를 사용한 눈썹 부착

메시의 경우, MeshRoots라는 부수적인 부착 모드도 있습니다. 이 모드에서 시스템은 먼저 메시 연결성을 바탕으로 메시를 아일랜드(island)로 그룹화하고 얼굴 메시를 기준으로 각 아일랜드의 “루트”를 찾아냅니다. 마지막으로, 아일랜드 안의 가장 가까운 루트까지 각 아일랜드의 모든 버텍스를 부착합니다. MeshRoots 모드는 개별 아일랜드의 리지드한 상태를 유지해 주기 때문에 일부 사용 사례에 필요합니다. 예를 들어, 눈썹보다는 속눈썹에 이 방식이 적절합니다. 그 이유는 눈썹용 헤어 카드는 대부분 피부와 수평을 이루어 모양의 변형이 예상되지만, 속눈썹용 헤어 카드는 모양을 그대로 유지할 것으로 예상되기 때문입니다.

루트에 별도의 아일랜드로 부착된 속눈썹

런타임에는 시스템이 부착된 부위(메시 형태의 트랜스폼)의 포지션과 버텍스가 얼굴 메시에 부합하도록 지속적으로 업데이트합니다. 각 프레임에서 얼굴 메시의 최종 출력 상태를 계산하고 알려진 로컬 포즈와 함께 사용되어 피부와 관련된 모든 포지션과 버텍스를 결정합니다. 아래의 이미지는 가웨인에 사용된 부착 밀도를 보여줍니다.

얼굴 메시를 이용하여 결정된 점들의 플롯

런타임 결정 작업은 상대적으로 대용량 데이터 처리를 지원하는 C# 잡 시스템과 버스트 컴파일러를 통해 가속화됩니다. 예를 들어, 가웨인의 얼굴에 대한 결정 작업에서는 프레임별로 수만 개의 로컬 포즈를 평가하여 얼굴의 이차적 특징들을 결정합니다.

셰이더 및 렌더링

디지털 휴먼 스탠드얼론 패키지를 출시하면서 렌더링과 관련된 모든 부분을 가능한 한 수정되지 않은 버전의 고해상도 렌더링 파이프라인(HDRP)로 전환하여 새로운 HDRP 기능으로 업그레이드 가능성을 높이고 확장성을 지원하고자 했습니다.

더 헤러틱의 비주얼을 프로토타이핑하기 시작했을 당시, 확장성을 위한 HDRP의 일반적인 기능은 아직 존재하지 않았습니다. 업그레이드가 가능한 커스텀 셰이더를 작성하는 효과적인 방법이나 프레임이 진행되는 동안 커스텀 커맨드를 입력(예: 커스텀 렌더링 패스 사용 시)하는 방법을 알아내지 못한 상태였습니다.

그 결과 초기 디지털 휴먼의 커스텀 셰이더 및 영상의 여러 기타 효과들은 당시 프리뷰 단계로 상당한 구조적 변화를 겪고 있던 HDRP의 기존 기능을 바탕으로 프로토타이핑되었습니다. 다수의 커스텀 셰이더는 HDRP로 전환하는 데 핵심 요소의 수정이 필요해 업그레이드가 어려워지기도 했습니다. 따라서 커스터마이징 횟수를 줄이기 위해 HDRP에서 더 많은 확장성을 지원할 필요가 있었습니다.

결과적으로, 디지털 휴먼 패키지를 제작하는 과정에서 당시 필요했던 커스텀 기능을 전환하여 현재 HDRP가 제공하는 확장성 기능을 이용할 수 있도록 해야 했습니다. 따라서 디지털 휴먼 커스텀 셰이더를 셰이더 그래프로 포팅하고, HDRP 마스터 노드를 이용하고, 필수 커스텀 렌더링 패스를 실행하기 위해 CustomPass API를 사용했습니다. 또한, 유니티의 수석 그래픽스 프로그래머인 세바스티앙 라가르드와 Unity Hackweek 2019 팀의 도움으로 HDRP에 눈 마스터 노드를 확보할 수 있었습니다. 눈 마스터 노드는 더 헤러틱의 이전 커스텀 작업과 호환되었으며 눈을 포팅하는 데 큰 도움이 되었습니다.

다음 섹션에서는 피부, 눈, 이에 관한 셰이더 그래프를 살펴볼 예정이며 패키지에도 그래프가 포함되어 있습니다. 패키지에는 머리카락용 셰이더 그래프도 포함되어 있으나, 대부분 머리카락 마스터 노드를 위한 패스 스루 설정입니다.

피부

일반적으로 피부 셰이더는 HDRP의 빌트인 기능인 피하 산란에 크게 의존합니다. 이는 확산 프로파일을 작성하고 배정하여 여러 종류의 피부를 포함한 다양한 머티리얼을 에뮬레이트하도록 해줍니다. 두 개의 스페큘러 로브(피부에 흔히 사용되는 설정이며 Lit 마스터 노드에서는 지원되지 않음)를 제공하기 위해 피부 그래프 자체는 StackLit 마스터 노드를 이용하며, 피부 셰이더는 포워드만 가능합니다.

피부 셰이더를 위한 셰이더 그래프

두 개의 스페큘러 로브의 경우, 일반 Lit 셰이더와 유사하게 일차 평활도 값이 마스크맵을 통해 주어지며, 이차 평활도 값은 머티리얼 인스펙터에서 수정 가능한 상수로 노출됩니다. 또한 일반 Lit 셰이더처럼 마스크맵은 디테일 평활도가 일차 및 이차 평활도 값에 영향을 줄 때, 앰비언트 오클루전 팩터와 두 개의 디테일 맵(디테일 노멀과 디테일 평활도)이 주는 영향을 제어할 수 있게 해줍니다.

일반 마스크맵뿐 아니라 피부 셰이더는 캐비티 맵(더 낮은 캐비티 값을 갖는 단일 채널 텍스처)을 사용하여 스페큘러 오클루전 팩터를 제어하거나 피부의 모공과 같은 작은 캐비티의 평활도를 감소시킬 수 있습니다. 또한 입사각에서 캐비티 맵의 영향을 블렌드 아웃하여 입사각에서 보이지 않는 작은 캐비티의 효과를 에뮬레이트할 수 있습니다.

캐비티 맵을 이용한 작은 캐비티의 평활도 조정

피부 셰이더는 가웨인에 사용했던 Snappers 얼굴 릭을 통한 포즈 기반 특징(예: 주름)을 지원합니다. 피부 그래프에서 이 기능은 그래프 자체에서는 볼 수 없는 숨겨진 입력을 포함한 커스텀 함수 노드에 캡슐화됩니다. 숨겨진 입력은 패키지에 포함된 SnappersHeadRenderer 컴포넌트에 의해 구동되며, 셰이더를 사용하는 SkinnedMeshRenderer와 동일한 게임 오브젝트에 위치해야 합니다.

피부 셰이더에서 피팅된 가중치를 주름으로 변환

피부 그래프에서 또 한 가지 주목할 노드는 티어라인(tearline) 설정과 관련된 노드이며 아래에 이어질 눈 섹션에서 자세히 알아볼 예정입니다. 기본적으로 티어라인 설정에서 피부의 노멀을 수정할 수 있도록 중간 처리 단계를 폐기하는 노멀 재계산 작업 대신 뎁스 프리패스 동안 노멀을 계산하고 저장한 다음, 노멀을 포워드 패스에서 다시 샘플링했습니다.

더 헤러틱의 커스텀 눈 셰이더는 선임 소프트웨어 엔지니어인 니콜라스 브랑카치오와 작업했습니다. 니콜라스는 두 개의 레이어로 이루어진 분할 조명 모델과 눈꺼풀 주변의 오클루전에 대한 평가 함수 구현 등 초기 작업에 참여했습니다. 디지털 휴먼 패키지에서는 이전의 커스텀 기능 중 일부가 HDRP의 눈 마스터(Eye Master) 노드로 옮겨와 눈 그래프가 출력으로 이용합니다.

눈 셰이더를 위한 셰이더 그래프

눈 셰이더는 눈을 두 개의 레이어로 이루어진 머티리얼로 모델링합니다. 첫 번째 레이어는 각막과 표면의 수분을 표현하는 데 사용되고, 두 번째 레이어는 첫 번째 레이어를 통해 볼 수 있는 흰자위 및 홍채를 표현하는 데 사용됩니다. 조명은 두 개의 레이어 사이에서 분할됩니다. 스페큘러 라이팅은 상단 레이어(좀 더 반짝이는 각막 및 표면 수분 표현)에서만 계산되는 반면 디퓨즈 조명은 하단 레이어(홍채 및 흰자위)에서만 계산됩니다.

전체 안구와 움직이는 광원

각막의 굴절은 내부에서 처리되며 이에 따른 효과는 입력 지오메트리와 몇 가지 사용자 지정 파라미터에 따라 결정됩니다. 눈 입력 지오메트리는 단일 메시여야 하며 각막의 돌출된 부분을 포함한 눈의 표면만 구현할 수 있습니다.

각막의 표면이 시작되는 위치를 대략 나타내는 사용자 지정 단면이 주어지면 렌더링 중에 주어진 프래그먼트가 각막의 일부인지 여부를 알 수 있습니다. 프래그먼트가 각막의 일부분일 경우, 뷰 광선을 굴절시킨 후 굴절된 뷰 광선을 홍채를 나타내는 가상 평면과 교차시킵니다. 홍채 평면은 각막 단면의 오프셋을 통해 조정 가능하며 아티스트가 눈의 시각적 시차의 양을 조절할 수 있게 합니다.

각막의 굴절을 표현하기 위한 안구 회전

홍채의 디퓨즈 조명을 평가하기 위해, 눈 셰이더는 또한 현재 래스터화된 표면(각막)의 프래그먼트를 바탕으로 홍채를 향한 광원의 입사 방향을 굴절시킬 수 있는 옵션을 제공합니다. 이 작업이 적합한 커스틱스(caustics)를 주는 것은 아니지만(굴절 표면에서 단일 프래그먼트의 기여만 누적), 측면에서 눈에 빛이 비출 때와 같이 홍채가 어두운 곳에서도 부자연스럽게 표현되지 않도록 합니다. 굴절된 조명 기능은 이제 눈 마스터 노드의 일부이며 Eye Cinematic 모드를 통해 사용 가능합니다.

홍채를 향한 광원의 입사 방향 굴절

눈꺼풀 근처의 오클루전은 이방성 구형 가우시안(anisotropic spherical Gaussian)을 이용해서 모델링했으며, 피부 부착 시스템을 이용하여 눈꺼풀을 추적하는 네 가지 마커(트랜스폼)를 기반으로 분포시켰습니다. 구체적으로 두 개의 마커는 폐쇄 축을 형성하기 위해 눈의 경계 부분을 추적하는 데 사용되며, 나머지 두 개의 마커는 눈꺼풀의 위아래 부분을 추적하여 폐쇄 각도를 알아내는 데 사용됩니다. 눈의 표면에서 이방성 구형 가우시안을 평가하기 위해 폐쇄 축과 폐쇄 각도를 사용하여 필수 기반 벡터를 생성합니다. 눈 마스터 노드에서 앰비언트 및 스페큘러 오클루전 팩터에 결과값을 직접 입력하고, 오클루전 영역을 인공적으로 어둡게 하기 위해 (필요 시) 알베도를 조절합니다.

오클루전을 구현하기 위한 이방성 구형 가우시안에 사용된 가지 마커

눈꺼풀 근처의 오클루전과 각막의 굴절을 포함한 특징들 대부분은 눈 그래프에서 EyeSetup이라는 단일 커스텀 함수 노드를 통해 이용 가능하며, 그래프 자체에 다수의 읽기 가능한 출력을 제공합니다. 피부 그래프의 얼굴 릭에 대한 커스텀 함수 노드와 마찬가지로, 눈 그래프의 커스텀 함수 노드 또한 숨겨진 파라미터를 사용합니다. 이 파라미터는 복잡도와 프레임별 특성으로 인해 머티리얼 인스펙터를 통해서는 조정할 수 없고 스크립트 코드를 통해서 조정할 수 있습니다. 특히 눈 그래프의 경우, 숨겨진 파라미터는 패키지의 EyeRenderer 컴포넌트에 의해 작동되며 셰이더를 이용하는 렌더러와 동일한 게임 오브젝트에 위치해야 합니다.

EyeRenderer 컴포넌트는 값을 계산하고 셰이더에 전달하는 것뿐 아니라 눈을 설정하는 데 도움이 될만한 유용한 기즈모와 핸들을 제공합니다. 예를 들어, 기즈모를 사용하면 각막 영역을 정의하는 단면에 오프셋을 시각화하고 미세조정할 수 있으며, 제공된 눈 지오메트리가 z축으로 정확히 향하지 않는 경우 평면 텍스처 투사의 전방 축을 확인하고 조정할 수 있습니다.

뷰에서 핸들을 이용한 미세 조정

마지막으로, 피부 그래프에서와 마찬가지로 눈 그래프에도 티어라인 설정과 통합하는 노드가 있습니다. 뎁스 프리패스 동안 노멀과 평활도가 작성된 다음, 포워드 패스 동안 다시 샘플링됩니다.

티어라인

티어라인(눈과 피부 사이의 촉촉한 부분)을 재구성하기 위해, 프레임 중 특정 단계에서 애플리케이션이 커스텀 렌더링 작업을 추가할 수 있게 하는 HDRP CustomPass API를 사용합니다.

노멀 데이터 및 평활도 데이터를 보관하는 HDRP 노멀 버퍼에 커스텀 패스를 사용하면, 얼굴의 특정 스크린 공간 영역(예: 눈과 피부가 맞닿는 곳)에 노멀 및 평활도 값을 블러 처리할 수 있습니다. 피부와 눈은 정방향 전용 머티리얼이기 때문에 포워드 패스 동안 원하는 결과를 샘플링하기 위해 특정 노드를 해당 그래프에 삽입했습니다.

티어라인 블러 패스 적용 전과 후의 노멀

노멀 버퍼에서 부드러운 전환을 만들면 두 표면을 시각적으로 연결할 수 있습니다. 더불어 영역에서 높은 평활도 값을 사용하면 스페큘러 하이라이트가 두 머티리얼 사이에 나타나서 티어라인 영역을 촉촉하게 표현합니다.

티어라인 추가 전후의 셰이딩 결과

블러링 효과를 줄 영역을 표시하기 위해서는 간단히 특정 사용자 레이어에 마스킹 데칼을 사용하고, 디버깅 때를 제외하고는 스크린에 어떤 컬러도 렌더링하지 않았습니다. 특정 사용자 레이어에 데칼을 배치하면 주로 HDRP 사용자 스텐실 비트 중 하나를 설정하는 커스텀 패스에서 데칼을 더 쉽게 필터링 및 렌더링할 수 있습니다. 모든 마스킹 데칼이 스텐실에 들어오게 되면 블러를 수행할 수 있는 스크린 공간 마스크가 생깁니다. 이 마스크를 사용하면 마스크 경계 부위에서 블러 커널의 너비를 동적으로 줄여 원하는 블러 영역의 경계를 벗어나 블러링하는 것을 방지할 수 있습니다.

티어라인 마스킹 데칼을 나타내는 디버그 오버레이가웨인의 티어라인은 마스킹 데칼을 각 눈마다 제작하여 중립 상태의 얼굴 포즈에서 눈꺼풀과 안구를 시각적으로 오버랩한 후 부착 시스템을 사용하여 피부에 연결합니다. 또한 4D 데이터에서 확인한 안구와 눈꺼풀 사이의 작은 틈은 지오메트리를 살짝 늘려 안구와의 오버랩이 더 안쪽으로 향하도록 했습니다.

치아

치아 셰이더는 클리어 코트 마스크 및 피하 산란을 포함한 Lit 마스터 노드의 많은 기능을 사용합니다. Lit의 기존 기능 외에도, 셰이더는 벌어진 입의 현재 크기를 바탕으로 입안을 살짝 어둡게 하는 커스텀 유형의 감쇠(attenuation)를 추가로 사용합니다.

치아 셰이더를 위한 셰이더 그래프

벌어진 입의 현재 크기를 대략적으로 계산하려면, 여섯 개의 마커를 입의 입구에 배치하여 입술 내부 윤곽의 근삿값을 계산하는 폴리곤을 형성해야 합니다. 가웨인의 경우 피부 부착 시스템을 사용하여 얼굴 메시가 애니메이션화되는 방식에 관계없이 마커가 입술을 따라가도록 구현했습니다.

렌더링하는 동안 폴리곤을 셰이더로 전달한 다음, 셰이더에서 구형 폴리곤을 확보하기 위해 현재 프래그먼트 주위의 단위 반구에 폴리곤을 투영하였습니다. 이 구형 폴리곤은 현재 프래그먼트를 기준으로 열린 입을 통해 외면이 얼마나 보이는지 직관적으로 보여줍니다.

안의 구체를 통해 구형 폴리곤 시각화

입 내부를 어둡게 하기 위해 비물리적 감쇠항(코사인 제외)으로 단위 반구의 영역에 구형 폴리곤의 영역을 사용합니다. 기존의 앰비언트, 스페큘러 오클루전 팩터, 코트 마스크 및 알베도를 그래프의 Lit 마스터 노드로 이동시키기 이전에 감쇠시킵니다.

커스텀 감쇠 적용 전과 후

피부 및 눈 그래프와 마찬가지로, 치아 그래프 또한 그래프에서 입력이 보이지 않는 커스텀 함수 노드를 포함합니다. 치아 그래프의 경우, 패키지에서 TeethRenderer 컴포넌트가 숨겨진 입력을 제공하며 이 컴포넌트는 셰이더를 이용하는 렌더러와 동일한 게임 오브젝트에 추가되어야 합니다.

마무리

이번 포스팅을 통해 가웨인의 얼굴을 제작하는 방법과 기술적 해결책을 이해하는 데 도움이 되셨길 바랍니다.

프로젝트에 사용된 툴은 GitHub에서 라이브러리를 다운로드하여 활용하실 수 있습니다. 이 툴을 활용해 작품을 제작한다면 공유해 주세요.

이 프로젝트의 제작 과정에 대한 보다 자세한 내용은 더 헤러틱 페이지에서 확인하실 수 있습니다.

 

6 replies on “더 헤러틱 제작기: 디지털 휴먼 테크 패키지”

Unity has just released the Digital Human character and technology stack used in the production of their CG animated short, The Heretic. Created by Unitys Demo Team and released this past January, the film showcases the groups first realistic digital human; it demonstrates every aspect of Unitys High Definition Rendering Pipeline, and features advanced effects created with the VFX Graph.

This is amazing, but sadly it also confirms how much difficult it is to obtain realistic looking avatars in Unity. You need a lot of data, work an effort to achieve such quality of results.

Comments are closed.