언어:
페이지 정보
엔진 버전:
언리얼 엔진

포토리얼리스틱 캐릭터

언리얼 엔진

포토리얼리스틱 캐릭터 예제는 에픽게임즈 런처학습 탭에 있는 디지털 휴먼 프로젝트 예제에서 다운로드할 수 있습니다.

이 쇼케이스의 목적은 에픽의 모바 게임 파라곤의 캐릭터에 사용된 것과 비슷한 하이 퀄리티 캐릭터 셰이더 기법을 선보이는 것입니다. 이 쇼케이스를 확인하려면, 프로젝트를 열고 에디터에서 플레이 버튼을 눌러 캐릭터 주위를 도는 시네마틱을 확인하면 됩니다.

이 캐릭터 제작에 사용된 기법 관련 상세 정보는, Unreal Engine Livestream - Tech & Techniques Behind Creating the Characters for Paragon 비디오를 확인해 주시기 바랍니다.

스킨 셰이딩

캐릭터의 스킨은 UE4 의 Subsurface Profile 셰이딩 모델 을 사용하여 만들었습니다.

Skin.png

머티리얼 함수 를 사용하여 스킨 머티리얼 바탕을 구성하고 있습니다. 이 작업은 파라곤의 머티리얼 제작을 재사용 가능한 방식으로 하기 위한 것이었습니다. 이런 식으로 아티스트는 특정 표면 유형을 생성하기 위한 접근법을 표준화시킬 수 있는데, 커다란 변화 작업이라 할지라도 하나의 함수만 업데이트하면 그 함수가 사용된 모든 인스턴스가 업데이트되기 때문입니다.

스킨 셰이더 텍스처

캐릭터의 피부에 사용된 텍스처는 모두 4K 해상도이며, 본래 실제 배우의 피부를 본떠서 만든 것입니다. 그런 다음 그 텍스처를 에픽의 아티스트가 정리하고 미세 조정한 것입니다. 이 피부는 총 다섯 개의 텍스처 맵을 활용하여 구성되었습니다: 디퓨즈, 러프니스, 스페큘러, 스캐터, 노멀.

텍스처

이름

설명

SkinDiffuse.png

Diffuse

디퓨즈 - 디퓨즈 맵은 머티리얼의 베이스 컬러를 제공해 줍니다. 4K 에서는 피부 바로 밑에 매우 얇은 모세 혈관을 볼 수 있습니다. 주름을 어둡게 하면 노멀 맵에 제공되는 텍스처가 두드러집니다. (UE4_Demo_Head_D)

SkinRough.png

Roughness

러프니스 - 러프니스 맵은 디퓨즈 텍스처의 알파 채널에 저장됩니다. 사용중인 텍스처 양을 최소화시킬 때 자주 쓰는 기법입니다. 모공과 주름 안에는 러프니스가 높은 것이 보입니다. 그러면 그 부분의 광택이 죽고, 디퓨즈와 노멀 맵에 제공되는 깊이감이 강조됩니다. 또 머리의 헤어 텍스처를 보면 풀 러프 (1.0) 상태인 것이 보이는데, 두피에서 벗어난 스페큘러 하이라이트를 방지하여, 헤어에 훨씬 더 깊은 깊이감을 줍니다. (UE4_Demo_Head_D)

SkinSpec.png

Specular

스페큘러 - 스페큘러 맵은 피부 표면에 걸쳐 보이는 스페큘러 하이라이트 양을 조절합니다. 한 가지 중요한 점은, 스페큘러 기본값은 0.5 라는 점입니다. 이 맵은 피부가 약간 탱탱해 보이는 곳에는 스페큘러 값을 증폭시키고, 리플렉션을 감추려는 곳, 이를테면 모공 중앙이나 주름 안쪽에는 감소시키고 있습니다. (CH2_exp04_merged_spec_f_FC_FINAL)

SkinScatter.png

Scatter

스캐터 - 스캐터 맵은 빛을 피부 표면에 얼마나 퍼뜨릴지를 조절합니다. 볼처럼 어두운 부분은 스캐터 부분이 매우 조금 보이는 반면, 코나 귀처럼 밝은 부분은 스캐터로 인지되는 양이 더 많을 것입니다. 스캐터의 컬러는 서브서피스 프로파일 애셋 으로 관리됩니다. (UE4_Demo_Head_BackScatter)

SkinNormal.png

Normal

노멀 - 노멀 맵은 전형적인 머티리얼 구성에서의 예상대로 작동합니다. 표면의 픽셀 노멀을 동요시켜 텍스처에 촉감을 살려주는 것입니다. 이 예제에서는 구성상 일반적인 방식과 별반 다를 것이 없습니다. (UE4_Demo_Head__normals)

헤어 셰이딩

헤어 셰이딩은 UE4 의 Hair 셰이더 모델이 처리합니다. 이 셰이더는 물리 기반 셰이딩 모델로, Eugene d'Eon, Steve Marschner and Johannes Hanika 를 기반으로 하며, 현재 Weta Digital 에 사용됩니다. 셰이더는 어나이소트로픽 스페큘러로 헤어 표면에서의 라이트 리플렉션과, 헤어를 통과할 때의 굴절 및 여러 가닥에 걸친 산란을 추정해냅니다.

UE4 헤어 셰이더 활용을 위해서는, Shading Model 프로퍼티를 Hair 로 설정하면 됩니다.

HairSM.png

헤어와 스페큘러

현실에서 헤어는 스페큘러 하이라이트가 여럿 있습니다: 하나는 라이트의 색을 나타내고, 다른 하나는 헤어의 색과 라이트의 색을 합한 것입니다. 여기서는 전자를 일차, 후자를 이차 스페큘러 하이라이트라 합니다. 헤어 셰이더는 동일한 효과를 높은 사실적 결과물로 추정해냅니다.

TwinblastHair_Specs_Diagram.png

  1. 연한 색 헤어는 일차 스페큘러 하이라이트를 나타냅니다. 2. 밝은 색 헤어는 이차 스페큘러 하이라이트를 나타냅니다.

UE4 헤어 셰이더에 사용된 추정 알고리즘은 현실에서와 비슷한 방식으로 그러한 효과를 냅니다. 빛이 헤어 모낭 표면에 닿으면, 그냥 단순하게 튕겨나가지 않습니다. 헤어는 반투명이라, 일부는 투과 시켜, 그 안을 약간 튕겨다니다가 빠져나갑니다. 헤어 셰이더는 빛이 헤어에 닿으면서 벌어질 수 있는 세 가지 경로를 추정하여, 아래 애니메이션 GIF 와 같이 표현합니다:

HairDiagram.gif

하나의 헤어 모낭이 겹친 부분을 보면 헤어 셰이더가 빛과의 상호작용을 어떻게 추정해내는지, 세 가지 주요 빛 경로를 보여줍니다. 이 프로세스 각 부분에 대한 설명은 아래 표를 참고하십시오.

번호

설명

0.

헤어 모낭의 성장 (뿌리에서 끝) 방향입니다.

1.

리플렉션 전용 경로로, 헤어 표면에서 튕겨져 나오는 빛을 포함합니다. 일차 스페큘러 하이라이트를 만듭니다.

2.

투과-투과 경로로, 빛이 헤어 모낭속으로 들어간 뒤 반대편으로 나옵니다. 이런 식으로 헤어 볼륨 안에서 빛이 퍼집니다.

3.

투과-리플렉션-투과 경로로, 빛이 헤어 모낭에 들어와 표면 내부 경계에서 반사된 뒤 빠져나갑니다. 이를 통해 이차 스페큘러 라이트가 생성됩니다.

위 그림에서 보듯이, 헤어 한 가닥은 완벽한 원통형 또는 튜브형이 아닙니다. 헤어는 사실상 서로 겹쳐 놓은 원뿔처럼 보입니다. 즉 헤어 표면을 튕겨져 나가는 빛은, 헤어가 완전 부드러울 때와는 완전히 다른 방식으로 산란된다는 뜻입니다. 게다가, 각 머리칼은 일반적으로 다른 방향을 가리키고 있기 때문에 스페큘러 하이라이트에는 통일성이 없지만, 헤어가 가리키는 방향에 따라 독립적으로 배치됩니다. 이런 것을 흔히 anisotropic (어나이소트로픽, 비등방성) 스페큘러라 합니다. 이 역시도 UE4 헤어 셰이더에 지원되고 있습니다.

헤어와 반투명

헤어 셰이더는 반투명이 아닌 Masked 블렌드 모드를 사용합니다. 하지만 Masked 반투명은 이진 결과값을 냅니다 - 완전 불투명하거나 완전 투명한 표면만 가능한 것입니다. 노이즈가 낀 디더링 패턴을 지속적으로 표면에 걸쳐 이동시켜, 속이 꽉 찬 영역은 보다 빽빽하게 만듭니다. 마스크드 반투명을 블렌딩하는 방법으로는 디더링이 사용되나, 템포럴 AA 활성화 상태에서만 작동합니다.

템포럴 AA 없음

템포럴 AA 있음

템포럴 AA 포함 애니메이션 디더링은 블렌딩 비용이 몇 프레임 필요합니다. 이는 헤어가 움직이고 있을 때는 부작용이 생길 수 있습니다. 이는 이 기법에 예상되는 부작용입니다.

에지 마스킹

EdgeMaskGraph.png

딱히 셰이더 자체의 일부는 아니지만, 에픽의 게임 파라곤 의 다른 캐릭터 뿐만 아니라 예제 캐릭터의 헤어에 사용된 머티리얼은 "Edge Mask" (에지 마스크)라는 기법을 사용하여 카메라 가장자리에 걸리는 헤어를 페이드 아웃시키고 있습니다. 헤어는 일련의 면으로 렌더링되기에 (아래 헤어 지오메트리 참고) 특정 카메라 각도에서는 각 시트의 에지가 보여 헤어의 느낌이 깨질 수 있습니다.

이러한 문제 경감을 위해, 머티리얼은 카메라의 버텍스 노멀에 대한 벡터를 계산하여 표면이 카메라에서 수직 방향으로 멀어지도록 합니다. 완벽한 투명으로 페이드 아웃 시키기도 합니다. 그러나 이 접근법의 다른 측면이 있다면, 그렇게 하는 데 있어 헤어 셰이더에 두피가 더 많이 보일 수 있다는 점입니다. 그래서 두꺼운 헤어의 머리를 지닌 캐릭터 다수가 아래 그림처럼 두피에 헤어 텍스처가 칠해진 것처럼 보이는 이유입니다.

HairPaint.png

이 효과는 Quality Switch 노드에도 묶여 있어서, 저사양 플랫폼에서는 이 옵션을 꺼서 쉽게 셰이더 퍼포먼스를 높일 수 있도록 했다는 점도 짚어둬야 하겠습니다. 언제나처럼, 타겟 플랫폼에서 테스트를 하는 것이 가장 좋습니다.

헤어 제작

이 쇼케이스에 선보인 기법을 사용하여 헤어를 만드는 데는, 에픽에서 캐릭터의 헤어를 어떻게 만들었는지에 대한 이해가 약간 필요합니다.

헤어 지오메트리

UE4 의 헤어 셰이더를 이용한 헤어 지오메트리는 보통 평면이 아닌 시트 시리즈를 사용하여 구성되는데, 이는 다수의 실시간 헤어 솔루션에 흔히 사용되는 접근법입니다. 이는 사용하시는 DCC 앱으로 제작 가능합니다.

헤어 지오메트리의 디테일 관련 엄격하고 확고한 규칙이 있는 것은 아니지만, 이 캐릭터는 약 800 개의 헤어 시트, 총 18,000 개 정도의 트라이앵글을 사용하고 있습니다. 또 한 가지, 헤어 머티리얼은 메인 머티리얼 노드의 프로퍼티에서 양면으로 설정되어 있습니다.

HairSheets.png

헤어 텍스처

여기서 UE4 헤어 셰이더를 사용하여 만들어낸 최종 결과물은 디퓨즈, 알파, 루트, 뎁스, 그리고 가닥 별 고유한 ID 텍스처, 총 다섯 개의 주요 텍스처로 구동되고 있습니다. 에픽에서 이러한 텍스처는 보통 3ds Max 의 헤어 시스템을 사용하여 생성되는데, 시뮬레이션된 헤어 결과물을 지오메트리 조각에 투영시키는 방법입니다. 하지만 그와 비슷한 결과를 얻기 위해 사용할 수 있는 옵션이 여럿 있습니다.

텍스처

이름

설명

Diffuse.png

Diffuse

디퓨즈 텍스처는 대부분 예상하듯이 헤어 자체의 주요 디퓨즈 또는 바탕 색을 내는 바로 그것입니다. 가깜은 이 텍스처 색은 놔두고 파라미터를 통해 구동시키는 것이 바람직한데, 캐릭터의 헤어 색이 여러가지 색을 띨 때는 특히나 그렇습니다. (UE4_Demo_Hair_D)

Alpha.png

Alpha

알파 텍스처는 헤어의 불투명도를 제공하는 것으로, 머리가닥 몸체 외부의 지오메트리를 숨겨줍니다. (UE4_Demo_Hair_A)

Root.png

Root

루트 텍스처는 헤어의 뿌리에서 끝부분까지 색을 변화시키는 데 사용되는 마스크를 제공해줍니다. 헤어 길이에 따라 색을 밝게 또는 어둡게 하는 데 좋습니다. (UE4_Demo_Hair_Roots)

Depth.png

Depth

뎁스 텍스처는 픽셀 뎁스 오프셋으로 헤어를 그 볼륨속에 깊이 밀어넣는 느낌을 주는 데 사용됩니다. 여러 깊이 상태에서의 헤어 컬러나 셰이딩 값을 변경하기 위한 기반으로, 이를테면 헤어가 두피쪽으로 깊이 떨어지면서 전체적인 스페큘러를 감소시키는 데 사용할 수 있습니다. (UE4_Demo_Hair_Depth)

ID.png

Unique ID

고유 ID 텍스처는 단순히 헤어 지오메트리의 주어진 위치에서 헤어 각 가닥의 0 에서 1 (검정 에서 하양) 고유 값을 제공해 줍니다. 헤어 자체 내에서의 미묘한 베리에이션을 주는 데 사용됩니다. (UE4_Demo_Hair_ID)

헤어 셰이더 프로퍼티

헤어 셰이더를 사용할 때 메인 머티리얼 노드에 새로운 프로퍼티가 몇 개 보이는데, Scatter, Tangent, Backlit 입니다.

HairProperties.png

이 글 작성 시점에서(4.13), Backlit 프로퍼티는 셰이더 초기 버전의 일부로만 존재합니다. 연결해도 헤어 셰이더 내부적으로 사용되지는 않으므로, 이 프로퍼티는 무시해도 됩니다.

Scatter

헤어 셰이더를 시뮬레이션 이 아닌 추정 이라 하는 주요 이유 중 하나는, 모든 헤어 가닥을 실제 시뮬레이션하는 것도 아니고, 완벽히 정확한 라이팅 동작을 시뮬레이션하는 것도 아니기 때문입니다. 현실에서 빛이 헤어 모낭에 반사 및 투과될 때, 종종 다른 헤어 가닥을 만나며 같은 프로세스를 연속해서 여러 번 반복해야 할 것입니다. 이 때 그러한 시뮬레이션 효과를 실시간으로 정확히 계산해 낼 수 있는 시스템은 없습니다.

그럼에도 빛이 헤어 본체를 통해 산란되는 방식은 그 헤어의 사실적 느낌에 여전히 매우 중요하며, 현실과 비슷한 느낌을 주는 게임이라면 두말할 것도 없습니다. 이에 대한 제어를 위해, 헤어 셰이더에는 Scatter (스캐터) 프로퍼티가 제공되는데, 주요 셰이더 노드의 메탈릭 값을 대체시켜 0.0 과 1.0 사이의 값으로 제한시키는 것입니다. 스캐터는 캐릭터의 헤어 전체 바디에 얼마만큼의 빛을 통과시킬지 제어합니다.

스캐터 관련 중요한 점 한 가지는, 보통 밝은 색 헤어에는 값이 높고, 어두운 색에는 낮은 경향이 있다는 것입니다. 이는 어두운 색 헤어가 보다 많은 빛을 흡수하는 경향을 띠는 현실 세계의 물리 법칙을 따르는 것입니다. 실질적으로 금발 캐릭터를 만들려는 경우, 디퓨트 텍스처나 컬러를 바꾸는 것으로는 충분치 않고, 스캐터 값도 같이 올려줘야 할 것입니다.

스캐터 값 0.0

스캐터 값 1.0

이 예제에서 Root (뿌리) 부분과 Tip (끝) 부분의 색은 연한 금색으로, Random Variation (무작위 다변화)는 0.0 으로 설정되었습니다. 거기에 스캐터를 사용하여 헤어에 얼마만큼의 빛을 통과시킬지 조절했습니다. 스캐터 값만 바꿔도 다양한 헤어 톤을 낼 수 있다는 것을 보여줍니다.

Tangent

Tangent (탄젠트) 프로퍼티는 헤어 셰이더를 노멀 프로퍼티를 대체합니다. 탄젠트는 각 헤어 가닥과 평행이면서 뿌리쪽을 향하는 벡터로 계산합니다. Tangent (탄젠트) 프로퍼티의 용도는 비등방성(anisotropic) 스페큘러를 제대로 내기 위함입니다.

AnisoVsNonAniso.png

왼쪽의 구체는 비등방성 셰이딩을 입힌 반면, 오른쪽의 것은 그렇지 않습니다. 비등방성 스페큘러 하이라이트가 표면에 어떻게 늘어지는지 보세요.

탄젠트 프로퍼티는 주로 그 비등방성 하이라이트가 늘어지는 방향을 제어하기 위한 벡터로 사용됩니다.

HairTangent.png

이 그림에서 노랑 선은 헤어 가닥을 따라서 뿌리쪽을 향하는 탄젠트를 나타냅니다.

예제 캐릭터의 헤어 셰이더에서, 이 벡터에는 고유 ID 텍스처를 사용하여, Z 축으로 0.3 에서 -0.3 까지 무작위 오프셋을 주고 있습니다. 그러면 원호 내 방향이 무작위인 벡터가 나오는데, 실제 헤어의 일정 부분에서 보이는 비등방성 스페큘러 하이라이트를 다변화시키는 데 도움이 됩니다.

탄젠트는 자동 방식 또는 플로우 맵의 지원 방식 중 하나로 매핑 가능합니다. 자동 방식은 단순히 헤어 각 시트의 텍스처가 루트는 위로 끝부분은 아래로 향하도록 방향을 잡아주기만 하면 됩니다. 헤어 길이가 짧기만 하다면야, 접히거나 너무 꼬이는 시트가 없어서 이러한 접근법이 적당합니다. 그래서 예제 캐릭터의 헤어에 사용되었습니다.

탄젠트용 플로우 맵

다른 방식은 플로우 맵을 만들어야 합니다. 캐릭터 헤어가 길고 굽어지면서 실제 지오메트리보다 꼬불꼬불해 보일 필요가 있을 때, 또는 헤어의 개별 텍스처 부분이 각기 다른 방향을 하고 있을 (위 설명대로 하향식이 아닐) 때 좋습니다. 플로우 맵은 헤어의 이동 방향을 탄젠트 스페이스로, 또는 표면을 따라서 나타냅니다. 포토리얼리스틱 캐릭터 프로젝트 안에 보면 T_Hair_Flow 라는 미사용 플로우 맵을 찾을 수 있습니다. 아래는 그 플로우 맵과 스페큘러의 결과를 비교한 것입니다.

최종 결과

플로우 맵 텍스처

여기서 스패로우의 헤어 표면을 따라 플로우 맵 텍스처를 어떻게 입혔나 확인할 수 있습니다. 참고로 플로우 맵은 일부 헤어 시트에만 사용되며, 전체 헤어 통에는 사용되지 않습니다. 플로우 맵 상의 다양한 값이 헤어의 스페큘러에 어떻게 미묘한 변화를 주는지 확인할 수 있습니다.

헤어 셰이더로 픽셀 뎁스 오프셋 사용

Pixel Depth Offset (PDO, 픽셀 뎁스 오프셋)은 헤어 셰이더 고유 프로퍼티는 아닙니다. 일반적인 용어로, PDO 는 픽셀이 카메라에서 오목하게 떨어져 있는 것처럼 보이게 만들어, 표면에 인공적인 깊이감을 만들어 냅니다. 헤어는 단순한 지오메트리 시트로 이루어져 있기에, 아래 헤어 지오메트리 부분에 설명된 대로, PDO 를 사용하면 헤어 모양 전반적으로 확실한 깊이감을 줄 수 있습니다. 또 아래 그림에서처럼 헤어 지오메트리 면이 두피와 만나는 부분에 교차점을 분해시켜 주기도 합니다.

픽셀 뎁스 오프셋 없음

픽셀 뎁스 오프셋 있음

아이 셰이딩

EyeShading2.png

눈을 종종 "영혼을 보는 창" 이라 합니다. 캐릭터를 보는 사람이 캐릭터가 진짜 사람같구나 하는 인상을 주는 데 눈 만큼 중요한 부위도 없습니다. UE4 의 Eye (눈) 셰이더는 눈 표면을 사실적으로 렌더링할 수 있게끔 디자인되어 있으며, 눈 자체의 생물학적 부분 각각에 대한 미적인 제어 장치가 노출되어 있습니다.

UE4 의 눈 셰이더는 고도로 기술적이며, 셰이더 코드, 머티리얼, 지오메트리 셰이프, 지오메트리 UV 레이아웃 사이에 매우 강한 종속성 을 갖도록 개발되어 왔습니다. 이 셰이더로 눈을 완전 새로 만드는 것은 셰이더 개발 경험이 매우 충분치 않다면 비추천 입니다. 그렇기에 현실적인 인간의 눈을 만들려는 경우, 이 예제에서 눈 지오메트리를 추출한 뒤 머티리얼을 있는 그대로 사용하고, 필요한 텍스처만 용도에 맞게끔 대체하여 사용하시기를 강력히 권합니다.

포토리얼리스틱 캐릭터 프로젝트 안에는 PhotorealEyeGeo 라는 이름의 스태틱 메시가 있습니다. 이를 프로젝트에서 FBX 를 통해 원하는 디지털 콘텐츠 제작 앱으로 익스포트한 뒤 자신의 프로젝트에서 사용할 수 있습니다.

눈 생물학

눈 기능을 제대로 이해하기 위해서는, 눈의 생물학적인 부분을 조금 알아둘 필요가 있습니다. 여기 보이는 각 부분은 예제의 눈 구성에 표현되어 있으며, 그 모든 부분은 예제 캐릭터의 눈에 적용된 머티리얼 인스턴스 내 노출 파라미터를 사용해서 조금씩 변경할 수 있습니다 (MI_EyeRefractive_Bust).

간단히 살펴보면 이렇습니다:

EyeDiagram.png

번호

이름

설명

1

Sclera

공막 - 공막은 "눈 흰자위" 로도 알려져 있습니다. 눈의 이 부분은 일반적으로 매우 습윤하며 약간의 촉각 텍스처가 있습니다.

2

Limbus

각막윤 - 홍채와 공막 사이에 나타나는 고리 모양의 혼탁물입니다. 이 부분이 보다 도드라지는 눈이 있으며, 가장자리에서 보면 희미해지는 경향이 있습니다.

3

Iris

홍채 - 눈동자 주변에 고리 모양으로 색을 띠는 부분입니다. 누군가의 눈이 "녹색" 이라면, 보통 그 홍채가 대개 녹색이기 때문입니다. 실제 눈에서, 홍채는 수축 팽창하는 근육같은 섬유 고리로, 동공에 받는 빛을 조절하는 역할을 합니다. 또 실제 홍채는 원반 또는 원뿔 모양에 가까우며, 눈의 나머지 부분까지 차오르지는 않는다는 점도 언급해 둘 만 합니다.

4

Pupil

동공 - 눈 중심부의 어두운 부분입니다. 이 구멍을 통과한 빛이 망막의 간상체와 추상체에 맺히게 됩니다.

5

Cornea

각막 - 홍채 표면을 덮고 있는 투명하고, 유체로 가득찬 돔 형태의 기관입니다.

눈 내부 굴절 - 이전과 지금

눈알은 유체로 가득차 있기에, 빛이 통과할 때면 굴절하게 마련입니다. 실제로 눈을 여러 각도에서 보면 확인할 수 있습니다. 홍채와 동공은 각막을 통해 보이기에 굴절되어 왜곡돼 보입니다. 게임과 영화에서 보통 이를 해결하는 방법은, 공막과 홍채, 동공을 포함하는 표면 하나, 그 위에 각막과 눈의 전체적인 습윤 부분을 나타내는 표면을 또 하나, 즉 눈 표면을 두 개의 표면으로 만드는 것입니다. 그렇게 하면 아래 놓인 표면이 마치 습윤층을 통해 보는 것과 같은 굴절 표현이 가능했습니다. 이러한 접근법은 에픽의 소년과 연 테크 데모에서 소년의 눈을 표현하는 데 사용된 바 있습니다. 아래 도표는 그 두 표면을 나타냅니다.

KiteBoyEyes.png

그러나 새로운 눈 셰이더를 사용하면, 하나의 표면 으로 보다 현실적인 효과를 낼 수 있습니다. 빛이 각막을 통과할 때의 굴절은 이제 전적으로 셰이더 내에서 처리되어, 지오메트리를 추가로 넣을 필요가 없어졌습니다. MI_EyeRefractive_Bust 머티리얼 인스턴스를 열고 Refraction On/Off (굴절 켜기/끄기) 프로퍼티를 조절하면서 직접 실험해 보실 수 있습니다.

굴절 없음|(굴절 켜기/끄기 0.0)

굴절 있음|(굴절 켜기/끄기 1.0)

눈 셰이더 파라미터

눈 셰이더가 복잡한 것도 있고, 있는 그대로 사용하시라 추천드린 것도 있고 해서, 머티리얼에 내장된 아트 관련 파라미터에 대한 분석을 추가하고자 합니다. MI_EyeRefractive_Bust 머티리얼 인스턴스 콘스턴트 안에서 조정할 수 있는 눈 셰이더 파라미터는 다음과 같습니다. 가능한 경우 파라미터 값 추천 범위도 포함시키도록 하겠습니다.

MI_EyeRefractive_Bust.png

이름

설명

추천 값 범위

스태틱 스위치 파라미터 값

UseEyeBulge

눈 돌출 사용 - 이 프로퍼티는 각막을 물리적으로 모델링한 돌출 부분을 사용하는 눈알 지오메트리 사용 여부에 따라 셰이더의 굴절 프로퍼티를 조절하기 위한 용도입니다.

없음

벡터 파라미터 값

Sclera inner color

공막 내부 색 - 공막이 홍채와 만나는 부분의 색입니다.

없음

Sclera outer color

공막 외부 색 - 눈의 외부 테두리 위치의 공막 색입니다.

없음

SecondaryEnvBalance

이차 배경 밸런스 - 눈 표면에 얼마만큼의 Secondary Environment (이차 배경)을 보이도록 할 것인지를 조절합니다.

0.00 - 0.03

SecondaryEnvRotationAxis

이차 배경 회전 축 - 이차 배경 은 가짜 리플렉션이므로, 눈에 수동으로 회전시켜 줘야 합니다. 이 프로퍼티는 어떤 축으로 회전할 것인지를 결정합니다.

0.0, 0.0, 1.0 Z 축

스칼라 파라미터 값

Depth Scale

뎁스 스케일 - 각막 아래 홍채의 굴절 깊이를 조절합니다.

1.0-1.4

Flatten Normal

노멀 평탄화 - 눈, 특히 공막 부분에서의 노멀 맵을 얼마만큼 평탄화시킬지를 조절하는 값입니다.

0.9 - 1.1

IoR

굴절 지수 - 각막 아래 유체의 굴절 지수입니다. 굴절이 얼마만큼 일어나는지 제어합니다.

1.336

Iris Concavity Power

홍채 오목 세기 - Iris Concavity Scale (홍채 오목 스케일)과 함께 빛이 각막을 통과하면서 홍채 표면에서 계산되는 빛 초선 양과 모양을 조절합니다. 이는 보통 실제 라이팅된 씬에서만 보이며, 머티리얼 인스턴스 에디터 내에서는 시각화시켜 보기 어려울 수 있습니다.

0.2 - 0.3

Iris Concavity Scale

홍채 오목 스케일 - Iris Concavity Power (홍채 오목 세기)와 함께 빛이 각막을 통과하면서 홍채 표면에서 계산되는 빛 초선의 양과 모양을 조절합니다. 이는 보통 실제 라이팅된 씬에서만 보이며, 머티리얼 인스턴스 에디터 안에서는 시각화시켜 보기 어려울 수 있습니다.

0.07 - 0.15

Iris UV Radius

홍채 UV 반경 - 눈알의 전체적인 홍채 크기를 조절합니다.

0.14 - 0.15

Iris Brightness

홍채 밝기 - 홍채의 밝기를 조절합니다.

홍채 색에 따라 다름

Iris Roughness

홍채 러프니스 - 홍채 바로 위의 표면인 각막의 광택을 구동시키는 값입니다.

0.0 - 0.1

Limbus Dark Scale

각막윤부 암도 스케일 - 각막윤부의 어두운 고리부분 크기를 조절합니다.

2.0 - 2.15

Limbus Pow

각막윤부 세기 - 각막윤부의 전반적인 어두운 부분을 제어합니다. 덮어쓴 값이 전반적인 각막 부분을 어둡게 만듭니다.

15.0 - 22.0

Limbus UV Width Color

각막윤부 UV 폭 색상 - 각막윤부의 샘플 크기, 또는 눈 표면의 얼마만큼을 각막윤부에 보이도록 할당할 것인지를 조절합니다. 꽤나 미묘한 세팅이라 주의를 기울여 조절해야 합니다.

0.025 - 0.040

Limbus UV Width Shading

각막윤부 UV 폭 셰이딩 - 빛이 각막윤부의 셰이딩에 영향을 끼치는 양을 조절합니다. 매우 미묘한 세팅으로, 주의를 기울여 조절해야 합니다.

0.040 - 0.050

Normal UV Scale

노멀 UV 스케일 - 눈 표면에 걸쳐 사용되는 노멀 맵 텍스처 스케일을 조절합니다.

1.8 - 2.6

Pupil Scale

동공 스케일 - 동공의 크기를 조절합니다. 눈을 팽창시키는 데 사용되는 세팅입니다.

0.5 - 1.0

Refraction On/Off

굴절 켬/끔 - 셰이더 굴절 버전과 굴절 없는 버전을 블렌딩합니다.

1.0

Scale By Center

중심에서 스케일 - 전체 홍채/동공 영역 중심에서부터의 스케일을 조절합니다.

0.8 - 1.2

Sclera Brightness

공박 밝기 - 공막, 다른 말로 눈의 흰자위 밝기를 조절합니다.

0.9 - 1.3

Sclera Roughness

공막 거칠기 - 공막의 머티리얼 러프니스 값을 제어합니다.

0.0 - 0.1

Secondary Env Rotation

이차 배경 회전 - SecondaryEnvRotationAxis 프로퍼티를 사용하여 정의된 축을 기준으로 이차 배경 큐브맵 을 회전시킵니다.

없음

Shadow Hardness

그림자 선명도 - 공막 내부와 외부가 만나는 지점의 선명도를 조절합니다. Shadow Radius (그림자 반경)과 함께 공막 표면에 걸친 셰이딩을 구동시키는 데 사용되며, 눈꺼풀이 눈알 표면에 걸쳐 드리워지는 피하 산란 그림자 효과를 추정해냅니다.

0.1 - 0.2

Shadow Radius

그림자 반경 - 공막 내부 색과 외부 색이 섞이는 부분의 크기를 조절합니다. Shadow Hardness 와 함께 사용됩니다.

0.5 - 0.85

Specularity Iris

스페큘러 홍채 - 각막(홍채와 동공)에 걸친 스페큘러 레벨을 조절합니다.

0.25 - 0.8

Specularity Sclera

스페큘러 공막 - 공막에 걸친 스페큘러 레벨을 조절합니다.

0.25 - 0.8

Veins

혈관 - Sclera Color Map 에 제공된 눈 혈관 표시여부를 조절합니다.

Sclera Color Map 과 원하는 혈관 양에 따라 다릅니다.

텍스처 파라미터 값

Iris Color

홍채 색 - 아래 눈 텍스처 부분을 참고하세요.

없음

Normal Map

노멀 맵 - 아래 눈 텍스처 부분을 참고하세요.

없음

Sclera Color

아래 눈 텍스처 부분을 참고하세요.

없음

Secondary Env

이차 배경 - 이차 리플렉션 인바이언먼트로 사용되는 큐브맵입니다. 아래 눈 셰이더 이차 배경 부분을 참고하세요.

없음

눈 셰이더 이차 배경

Secondary Environment (이차 배경)은 눈 표면에 가짜 리플렉션 맵을 제공해 주는 눈 셰이더의 일부입니다. 셰이더의 SecondaryEnv ParamCube 를 사용하여 그에 대한 텍스처를 제공해 줄 수 있습니다. 눈을 극적으로 확대해 봤을 때, 순간적인 배경이나 다른 캐릭터와 같은 구체적인 리플렉션이 보이도록 하고자 할 때 좋습니다.

이차 배경 없음|(SecondaryEnvBalance 0.0)

이차 배경 있음|(SecondaryEnvBalance 0.03)

눈 제작

이 단원의 서두에 눈 셰이더 코드, 머티리얼 구성, 눈 메시 지오메트리 사이에 강한 종속성이 있다 경고한 바 있습니다. 다음은 무엇때문에 눈 구성이 그렇게 되었는가 하이 레벨 개요를 살펴보겠습니다. 자신만의 캐릭터를 만들 때 지오메트리를 눈 메시로 대체할 때 도움이 될 것입니다.

자신만의 눈을 만들 때는, 이 예제에 제공된 실제 눈 지오메트리와 머티리얼을 먼저 사용할 것을 강력 추천합니다. 앞으로의 정보 대부분은 그렇게 했다는 것을 가정하고 작성된 것입니다.

포토리얼리스틱 캐릭터 프로젝트 안에는 PhotorealEyeGeo 라는 이름의 스태틱 메시가 있습니다. 이것을 프로젝트에서 FBX 를 통해 원하는 디지털 콘텐츠 제작 프로그램으로 익스포트한 뒤 자신의 프로젝트에서 사용할 수 있습니다.

셰이프와 UV 레이아웃

실제의 인간 눈과 매우 흡사하게, 눈 메시는 완전히 구체로 모델링되어있지 않습니다. 그보다는 각막을 나타내기 위해 앞으로 약간 돌출된 돔 형태입니다. 거의 달걀과 같은 모양의 눈이 됩니다.

EyeGeometry.png

이 그림은 Maya 로 눈 지오메트리를 측면에서 본 것입니다. 앞부분에 각막의 돌출된 부분을 볼 수 있습니다.

눈의 UV 레이아웃 역시 매우 중요한데, 바로 여기서 각 눈 텍스처 부분이 만들어지기 때문입니다. 다행히 눈 셰이더와 궁합이 잘 맞는 UV 레이아웃은 상대적으로 간단합니다. 눈의 전방 축을 따라 평면 투영한 것입니다. 뒷면 포함 여부는 (어차피 눈 뒷부분일 거라) 매우 중요한 부분은 아니며, 예제 캐릭터에서 확인할 수 있습니다.

UV 레이아웃은 이렇게 되어 있습니다:

EyeUVs.png

UV 레이아웃이 0-1 스페이스에 중심이 맞춰져 있고 투영은 바로 각막을 향하고 있습니다.

눈 텍스처

눈에 쓸 텍스처 다수는 홍채 맵을 제외하고 위에 만든 UV 레이아웃을 기반으로 합니다. 주요 편집가능 텍스처는 다음과 같습니다:

텍스처

이름

설명

ScleraMap.png

Sclera Map

공막 맵 - 눈 흰자위 색과 아울러 눈 가장자리에 있는 모세혈관과 조직의 색도 조절합니다. 캐릭터의 눈을 충혈되도록 만들고자 하는 경우, 이 텍스처를 변경하면 됩니다. (UE4_Demo_Eye_Sclera_Color)

DispMap.png

Mid Plane Displacement Map

중간 면 디스플레이스먼트 맵 - 눈 중앙으로 뚫고 들어가는 면을 고정시키기 위해 사용되는 맵으로, 홍채 깊이에 오프셋을 주기 위한 기저로 사용됩니다. (EyeMidPlaneDisplacement_Example)

WetNormal.png

Normal Map

노멀 맵 - 모든 셰이더의 노멀 맵과 똑같은 작업을 하며, 촉각 텍스처에 베리에이션을 줍니다. 예제 캐릭터 눈 구성의 경우, 눈 표면에 자그마한 올록 볼록 모양을 만드는 데 사용됩니다. (T_Eye_Wet_Normal)

Normal.png

Tangent Map

탄젠트 맵 - 표면이 흐르는 방향을 탄젠트 스페이스로 제어하는 데 사용됩니다. 예제 캐릭터 눈 구성의 경우, 각막과 공막이 만나는 부분에서의 방향 변화를 강조시키는 데 사용되었습니다. (EYE_NORMALS.EYE_NORMALS)

IrisTexture.png

Iris Map

홍채 맵 - 홍채 텍스처는 UV 레이아웃이 일치하지 않는다는 점에서 독특합니다. 대신, 텍스처가 해상도 전체를 채웁니다. 전체적인 홍채 크기를 제어하는 데는 UV 와 알파 마스크가 쓰이며, 동공 크기도 마찬가지입니다. 별도의 홍채 맵을 만드는 경우, 동공 크기는 제공된 텍스처 비율에 적당히 가깝도록 유지하시기 바랍니다. (UE4_Demo_Eye_Iris)

참고로 탄젠트 맵 출력은 노멀 맵 입력에 바로 물려주지 않습니다. 그보다는, 별도로 만들어야 하는 Tangent Output 노드에 연결합니다. M_HairSheet_Master2 마스터 머티리얼에서 볼 수 있습니다.

TangentOutput.png

눈 앰비언트 오클루전

예제 캐릭터 눈 구성의 마지막 단계는 반투명 보조 표면을 사용하여 눈 주변에 앰비언트 오클루전 효과를 시뮬레이션하는 것입니다. 현실에서 눈이 눈꺼풀이나 눈물샘과 같은 다른 조직과 만나는 부분마다 매우 부드러운 그림자가 드리워지는 것이 보일 것입니다. 이는 눈 자체가 반투명한데 빛이 관통하면서 벌어지는 현상입니다. 이를 사실적으로 시뮬레이션하기 위해, 눈을 덮는 지오메트리 시트를 배치하고 앰비언트 오클루전을 추정해 넣어, 눈 전체적으로 보다 풍부한 사실감을 만들어 냈습니다.

이 시트에 적용된 머티리얼 이름은 MI_Eye_Occlusion_Bust 이며, 예제 캐릭터 모델의 Element 3 에서 찾을 수 있습니다.

캐릭터 눈에 쓸 콘텐츠를 별도 제작하는 경우, 아마 이러한 지오메트리 조각을 직접 만들어 줘야 할 것입니다. 그런 경우 열린 눈꺼풀 영역에 맞게 만들어야 하며, 그 UV 가 3D 모델링 앱의 0 에서 1 사이 UV 스페이스에 깔끔히 채워져야 한다는 점 참고하시기 바랍니다.

AOSheetMaya.png

이 그림은 Maya에서 앰비언트 오클루전 시트 지오메트리를, 얼굴 지오메트리 없이 본 것입니다. 시트 테두리 에지가 눈커풀 트인 곳을 완벽히 메우고 있습니다.

AO 시트 없음

AO 시트 있음

감사의 말씀

언리얼 엔진 4 헤어 셰이더 일부의 작업 기반이 된 The importance of sampling for physically-based hair fiber models 작업물을 공개해 주신 Eugene d'Eon, Steve Marschner and Johannes Hanika 에게 감사드립니다.