Demo

대장장이의 링클 맵

TORBJORN LAEDRE / UNITY TECHNOLOGIESContributor
May 28, 2015|3 분
챌린저 링클 배너
이 웹페이지는 이해를 돕기 위해 기계 번역으로 제공됩니다. 기계 번역으로 제공되는 콘텐츠에 대한 정확도나 신뢰도는 보장되지 않습니다. 번역된 콘텐츠의 정확도에 관해 의문이 있는 경우 웹페이지의 공식 영어 원문을 참고해 주시기 바랍니다.

계획할 때 블랙스미스 단편 영화를 기획할 때 커스텀 스킨 셰이더를 현실적인 작업으로 채택할 수 있을 정도로 우선순위를 높인 적은 없었습니다. 하지만 챌린저의 표정에 조금 더 생동감을 더할 수 있는 간단한 방법이 없을까 고민했습니다. 간단한 브레인스토밍을 거쳐 프로젝트에 블렌드 셰이프 기반 링클 맵을 추가하기로 결정했습니다.

표현에 디테일과 깊이를 더하기 위해 주름이 노멀과 오클루전에 모두 영향을 미치도록 하면 표준 셰이더가 최고의 효과를 낼 수 있다고 판단했습니다. 또한 특정 표정의 영향을 얼굴의 특정 부분으로 제한할 수 있는 방법을 원했습니다.

링클 맵 드라이버 입력

애니메이터가 메시의 블렌드 셰이프당 하나의 레이어씩 주름 레이어를 정의할 수 있는 컴포넌트를 만들었습니다. 레이어 정의에는 텍스처 매핑과 강도 수정자, 그리고 얼굴 부분 마스킹 텍스처와 일치하는 마스킹 가중치 세트가 포함되어 있습니다. 마스킹 가중치를 사용하면 특정 주름 레이어가 마스킹된 얼굴 부분 중 1~4개에 각각 다른 영향을 미칠 수 있습니다.

검사관의 챌린저 안면 마스크

한 번에 최대 4개의 서로 다른 표현을 블렌딩할 수 있어야 했기 때문에 블렌딩에만 모든 기능이 활성화된 11개의 텍스처 샘플러(베이스 텍스처 2개, 디테일 텍스처 8개, 마스킹 텍스처 1개)가 필요했습니다. 이를 위한 유일한 현실적인 옵션은 오프스크린 프리렌더 패스에서 블렌딩된 링클 맵을 구성하는 것이었습니다. 10비트 채널 중 두 개에 노멀을 패킹하고 나머지 하나는 오클루전을 수신할 수 있는 ARGB2101010 렌더 텍스처 포맷이 가장 적합하다는 것을 알게 되었습니다. 각 프레임에서 링클 맵 컴포넌트는 가장 영향력 있는 네 가지 블렌드 셰이프를 찾고 그에 따라 레이어 렌더링 가중치를 할당합니다.

챌린저 화면 공간

화면 공간에 모든 주름 데이터를 구성한 후 남은 작업은 얼굴 렌더링에 사용하던 표준 셰이더의 노멀 및 오클루전 데이터 입력을 리디렉션하는 것뿐이었습니다. 실제로는 서피스 셰이더 메인 함수에 몇 개의 선을 추가하는 것을 의미했습니다.

// Sample occlusion and normals from screen-space buffer when wrinkle maps are active
#ifdef WRINKLE_MAPS
float3 normalOcclusion =
tex2D(_NormalAndOcclusion, IN.screenPos.xy / IN.screenPos.w).rgb;
o.Occlusion = normalOcclusion.r;
#ifdef _NORMALMAP
o.Normal.xy = normalOcclusion.gb * 2.f - 1.f;
o.Normal.z = sqrt(saturate(1.f - dot(o.Normal.xy, o.Normal.xy)));
#endif
#endif

최종 결과

베이스 헤드를 최대 무게로 과장된 화난 블렌드 모양과 비교하면 블렌딩된 주름 맵이 추가한 디테일을 확인할 수 있습니다:

주름 없는 챌린저
챌린저 주름

또한 완전히 블렌딩된 오클루전 및 노멀 맵을 쉽게 시각화할 수 있는 다양한 디버그 출력 모드를 추가했습니다. 이는 최종 결과물에서 어떤 구성 요소가 무엇에 기여했는지 정확히 파악하는 데 매우 유용했습니다.

챌린저 디버그 보기

이 기능을 에셋 스토어에서 다운로드할 수 있는 예제 프로젝트로 분리했습니다. 기본적으로 대장장이에서 사용한 표현 몇 가지가 추가된 챌린저의 머리에 불과하지만, 여러분의 프로젝트에서 이 시스템을 실행하는 데 유용한 출발점이 될 것입니다.