서브서피스 프로파일 셰이딩 모델

머티리얼에서 사용할 수 있는 서브서피스 프로파일 셰이딩 모델에 대한 설명과 기술적 세부사항입니다.

Windows
MacOS
Linux

언리얼 엔진 4 (UE4) 는 현실적인 피부나 밀랍같은 표면 렌더링 전용 셰이딩 메서드인 Subsurface Profile (서브서피스 프로파일) 셰이딩을 제공합니다. 서브서피스 프로파일 셰이딩 메서드는 Surface (서피스) 메서드와 비슷하나, 렌더링 방식에 근본적인 차이점이 있습니다. 서브서피스 프로파일은 스크린 스페이스 를 기반으로 한다는 점입니다. 왜냐하면 스크린 스페이스 렌더링이 사람 피부에 보이는 미묘한 피하 효과를 나타내는 데 보다 효율적이기 때문입니다. 예를 들면 귀와 같은 곳에 드물게 보이는 배후 산란과 같은 이차 효과를 말합니다. 다음 문서에서는 서브서피스 프로파일이란 무엇인지, 어떻게 사용할 수 있을지에 대해 다뤄봅니다.

Not using SubsurfaceProfile

Using SubsurfaceProfile

이 문서의 완성과 3D 스캔 헤드 모델 제공 도움을 주신 Lee Perry-Smith 와 그의 회사 Infinite Realities 에 감사드립니다.

서브서피스 프로파일이란

Subsurface Scattering Profile (서브서피스 스캐터링 프로파일) 데이터란 콘텐츠 브라우저 에서 생성, 공유, 저장할 수 있는 애셋입니다. 아티스트는 이 데이터를 만들어 표면 아래의 빛이 산란하는 거리, 표면 아래 부분의 색, 빛이 물체를 빠져나간 이후 감쇠되는 색을 제어할 수 있습니다. 그 후 이 데이터를 서브서피스 머티리얼에 적용시킬 수 있습니다. 서브서피스 프로파일은 상호작용형 트윅 작업이 가능하여, 머티리얼을 다시 컴파일하지 않아도 수정 결과를 바로 확인할 수 있습니다.

서브서피스 프로파일 활성화, 생성 및 사용

UE4 에서 서브서피스 프로파일을 사용할 수 있는 방법은 여러가지 있습니다. 여기서는 그 각각에 대해 알아보겠습니다.

서브서피스 프로파일 생성

서브서피스 프로파일을 생성하려면, 먼저 콘텐츠 브라우저 안에 우클릭합니다. 머티리얼 & 텍스처 옵션을 선택한 뒤 Subsurface Profile (서브서피스 프로파일) 옵션을 선택합니다. Create SubsurfaceProfile

SubsurfaceProfile 이 지정되지 않으면, 기본값인 Caucasian (백인) 피부를 사용합니다.

서브서피스 프로파일은 콘텐츠 브라우저 에서 마우스 왼쪽 버튼 더블클릭으로 열어 편집할 수 있습니다. 연 이후 키보드로 숫자를 입력하거나 컬러 바를 마우스 왼쪽 버튼 으로 클릭 해서 색 선택 툴을 사용하여 서브서피스 스캐터링 프로파일의 개별 프로퍼티를 조정할 수 있습니다.

서브서피스 프로파일 활성화

머티리얼에 서브서피스 프로파일을 사용하려면, 먼저 머티리얼의 디테일 패널에서 머티리얼 Shading Model (셰이딩 모델)을 Subsurface Profile (서브서피스 프로파일 로 설정해 줘야 합니다. 활성화 이후, 기본 서피스 프로파일을 덮어쓰면 서브서피스 프로파일** 입력의 새로운 입력값에 사용됩니다.

서브서피스 프로파일 기본 세팅은 백인 피부 유형에 가깝습니다. 하지만 이는 현실적인 피부를 얻기 위한 한 가지 성분에 지나지 않습니다. 항상 텍스처의 베이스 컬러가 서브서피스 스캐터링 프로파일에 맞는지 확인하도록 하세요.

Enable SubsurfaceProfile

서브서피스 프로파일 역시 머티리얼 인스턴스에서 덮어쓸 수 있습니다. 그러기 위해서는 먼저 변경하고자 하는 머티리얼 인스턴스를 열어야 합니다. 그런 다음 머티리얼 인스턴스의 디테일 섹션에서, Override Subsurface Profile (서브서피스 프로파일 덮어쓰기)를 켠 다음 Subsurface Profile 입력에 사용하고자 하는 서브서피스 프로파일을 제공해 주면 됩니다.

6.png

전체 계산은 에너지 보존 법칙을 따르므로, 산란을 통해 빛을 만드는 것은 불가능합니다.

머티리얼 입력 채널

'스크린 스페이스 서브서피스' 셰이딩 프로파일은 '릿' 셰이딩 모델과 크게 다르지 않지만, 큰 차이점은 '메탈릭' 입력의 용도가 변경되어 사용할 수 없다는 점입니다.

Base Color Input: 베이스 컬러 입력은 디퓨즈 라이팅에 평소처럼 사용됩니다. 스크린 스페이스 서브서피스 스캐터링은 색이나 밝기의 변화 없이 라이팅을 주변 픽셀에 재배포할 뿐이기에, 별도의 서브서피스 스캐터링 컬러는 없습니다. 즉 머티리얼이 특정한 색으로 산란해야 한다면, 베이스 컬러의 일부로 표현해 줘야 합니다. 베이스 컬러는 스캐터링과 디퓨즈 라이팅을 구분할 수 없는 먼 거리에서 봤을 때의 머티리얼 최종 색입니다.

사람 피부는 빛의 색과 양을 일정 부분 막는 얇은 막으로, 그 표면 아래 강렬한 붉은색 살을 덮고 있습니다. 연한 사람 피부색의 가시 산란 거리는 대략 1.2 cm 입니다.

Metallic Input: 메탈릭 입력 채널은 서브서피스 프로파일에는 사용할 수 없습니다. 메탈릭 입력에 대한 GBuffer 공간이 서브서피스 프로파일 데이터를 수용하도록 용도 변경되었기 때문입니다.

Opacity Input: 오파시티 입력 채널은 서브서피스 스캐터링 공헌을 마스킹하는 데 사용됩니다. 0 과 1 사이 값을 통해 서브서피스 스캐터링 강도가 다른 여러 영역 사이를 부드럽게 전환시키는 방식으로 작동하며, 0 은 스캐터링 없음, 1 은 최대 스캐터링입니다.

서브서피스 스캐터링 강약을 더욱 잘 조절하기 위해서는, 마스크 텍스처를 사용하는 것이 좋습니다.
마스크 텍스처의 값이 1 또는 하양에 가까운 곳은 스캐터링 이펙트가 세지고, 0 또는 검정에 가까운 곳은 약해집니다. 서브서피스 컬러를 조절하면 너무 어두워지는 영역을 보정하는 데 도움이 됩니다. 밝은 색을 사용하면 서브서피스 스캐터링이 늘어난다는 점 기억하세요.

여기서는 마스크를 사용하여 하나의 머티리얼로 두 개의 표면 유형을 렌더링한 것을 볼 수 있습니다. 전환이 부드러울 뿐만 아니라 트라이앵글 경계에 제한되지 않은 것이 보입니다.

클릭하면 이미지 원본을 확인합니다.

전해상도 스킨 셰이딩

UE4 는 서브서피스 프로파일 셰이딩 모델에 전해상도 스킨 셰이딩을 지원합니다. 그러면 표면에 땀구멍이나 주름같은 디테일을 위한 하이파이 라이팅을 얻을 수 있습니다.

Checkboard Rendered Skin Layout

Full Resolution Skin

기존에는 피부의 라이팅은 체크무늬 패턴으로 표현되었는데, 픽셀 절반은 디퓨즈 라이팅에만, 나머지 절반은 스페큘러 라이팅에 사용됩니다. 최종 서브서피스 프로파일 풀스크린 패스 도중 라이팅을 재조합했던 것입니다. 이 접근법을 통한 (속성상 저주파인) 서브서피스 라이팅 결과물은 괜찮습니다만, 표면 디테일에는 라이팅 정확도가 떨어질 수 있습니다. 새로운 접근법에는 모든 픽셀에 디퓨즈 및 스페큘러 라이팅 정보가 RGBA 인코딩으로 패킹되어 들어있습니다. 이를 통해 최종 서브서피스 프로파일 풀스크린 패스 도중 전해상도 라이팅을 재구성할 수 있으며, 표면의 디테일도 살아나고 템포럴 안티에일리어싱 작동방식 안정성도 높아집니다.

호환성

전해상도 스킨 셰이딩에는 풀 알파 채널 포함 최소 64 비트 씬 컬러 포맷이 필요합니다. 기본 FloatRGBA 씬 컬러 포맷은 괜찮습니다만, FloatRGB 같은 32 비트 표현은 지원되지 않습니다. 씬 컬러 포맷이 전해상도 피부와 호환되지 않는다면, 예비인 체크무늬 기반 라이팅으로 돌아갑니다.

이 방식은 r.SSS.Checkerboard 콘솔 변수로 덮어쓸 수 있습니다. 여기에 가능한 값은 다음과 같습니다:

프로퍼티 이름

설명

r.SSS.Checkerboard

0

체크무늬 꺼짐

r.SSS.Checkerboard

1

체크무늬 켜짐 (이전 방식)

r.SSS.Checkerboard

2

자동 (기본) - 씬 컬러 픽셀 포맷이 지원하는 경우 전해상도 라이팅을 사용합니다.

한계

전해상도 스킨 셰이딩은 추정치라는 점 언급해 둘 필요가 있습니다. 거의 대부분의 경우 정상 작동합니다만, 인코딩 방식으로 인해 다음과 같은 머티리얼 기능에 문제가 있을 수 있습니다:

  • 메탈릭 머티리얼

  • 이미시브 머티리얼

위의 기능은 작동은 하지만, 패킹된 RGBA 디퓨즈/스페큘러 인코딩 방식으로 인해 체크무늬와 비교했을 때 결과물에 차이가 날 수 있습니다. 몇 가지 문제는 머티리얼을 만들 때 스킨 셰이딩을 입히지 말아야 하는 부분에 오파시티0 으로 설정하여 우회할 수 있습니다. 오파시티가 0 인 픽셀은 셰이딩을 위해서는 기본 라이팅으로 간주됩니다.

이런 식으로 불투명 이외 픽셀을 마스킹하는 것도 퍼포먼스상의 이유로 좋은데, 이러한 픽셀은 서브서피스 포스트프로세스에서 건너뛰기 때문입니다.

퍼포먼스 고려사항

64 비트 씬 컬러 포맷을 쓰는 타이틀이라면, 전해상도 서브서피스 라이팅이 일반 체크무늬보다 텍스처 페치 횟수가 적어 더욱 빠를 것입니다. 하지만 32 비트 씬 컬러를 쓰는 타이틀이라면, (하드웨어에 따라 달라지는 부분이긴 하지만) 텍스처 대역폭 감소에서 오는 퍼포먼스 이득이 그보다 클 것입니다.

테크니컬 디테일

현재 서브서피스 스캐터링 프로파일 셰이딩 모델은 릿(램버트 디퓨즈, 스페큘러에는 GGX, 메탈릭 없음)과 크게 다르지 않습니다. 대부분의 효과는 모든 라이팅 계산 이후의 포스트 프로세스에서 일어납니다.

서브서피스 스캐터링 프로파일은 Jorge Jimenez 의 작업물을 기반으로 합니다. 이 홈페이지에서 3D 이미지를 보다 현실적으로 만드는 데 관련된 유용한 팁을 확인해 보실 수 있습니다.

서브서피스 머티리얼 위에 스페큘러를 지원하기 위해 비 스페큘러 (뷰에 의존하지 않는) 라이팅 공헌을 분할시키고 다운 샘플링하여 퍼포먼스를 높였습니다. 가우시안 블러와 비슷하게 (분리가능 커널을 가정하고) 이미지를 2 패스 포스트 프로세스로 필터링합니다. 필터 커널은 GBuffer 에 저장된 서브서피스 스캐터링 프로파일에 의존합니다 (씬별로 최대 255 개의 활성 프로파일). 커널에는 착색된 웨이트와 지정된 샘플 위치가 있어, (유닛/cm 으로 정의된) 프로파일에서 스케일 조절 가능합니다. 최종 단계로, 산란된 빛 공헌을 최대 해상도 이미지와 다시 합칩니다. 뷰 의존 / 비의존 라이팅을 분리시키기 위해, 씬 컬러 알파 채널에 웨이팅 값을 저장합니다. 이러한 추정법은 64 비트 렌더 타깃을 필요로 하며 (r.SceneColorFormat 참고) 대부분의 경우에 정상 작동합니다.

스페큘러는 성공적으로 잡아내지만, 그 스페큘러 픽셀에 대해서 좀 더 탈색된 뷰 비의존 색을 얻습니다. 이를 모든 라이팅 패스에 대해 두 개의 32 비트 렌더 타깃을 사용하여 개선 가능합니다. 이는 메모리 대역폭은 같지만 일부 하드웨어에서는 더 느릴 수 있습니다. 이 부분은 (추가되는 코드 복잡도로 인해) 바뀔 수도 있는 부분입니다.

이는 블러 적용 전 스페큘러를 제거한 예제입니다. 최종 (가장 오른쪽) 이미지의 스페큘러 리플렉션이 얼마나 산뜻하고 부드러운지 보세요. 바로 원하던 이펙트입니다.

클릭하면 이미지 원본을 확인합니다.

블러 적용 전 스페큘러를 제거하지 않은 예제는 이렇습니다. 최종 (가장 오른쪽) 이미지의 스페큘러 리플렉션이 얼마나 무디고 약간 늘어져 보이는지 보세요. 이 이펙트의 렌더링에 올바른 방식은 아닙니다.

클릭하면 이미지 원본을 확인합니다.

Scalability 및 콘솔 명령

높은 퀄리티의 비주얼과 더 나은 퍼포먼스 사이의 적정선을 찾는 데 도움이 되는 스케일 및 퍼포먼스 콘솔 명령이 몇 가지 있습니다.

r.SSS.Scale: 빠른 실험을 위해 이펙트에 스케일을 적용할 때 사용할 수 있습니다. 이 값을 0 으로 설정하면 이펙트가 꺼집니다. 0 보다 큰 값을 설정하면 아래 이미지 시퀀스에서 볼 수 있듯이 이펙트가 세집니다.

슬라이더를 끌면 r.SSS.Scale 값이 0 에서 10 일 때 무슨 일이 벌어지는지 확인할 수 있습니다.

r.SSS.SampleSet: 사용되는 샘플 수를 설정합니다. 이 값을 줄이면 이펙트 실행 속도가 빨라집니다. 하지만 퀄리티가 낮아지고 렌더링 부작용이 생길 수 있습니다.

r.SSS.SampleSet = 0

r.SSS.SampleSet = 1

다음 이미지는 시스템 내부적인 부분을 약간 더 보여줍니다. ShowFlag.VisualizeSSS 1 명령으로 켤 수 있습니다.

클릭하면 이미지 원본을 확인합니다.

서브서피스 스캐터링 프로파일 셰이딩 모델은 피부 렌더링에 있어 한 단계 발전된 것이지만, 그 기능에 약간의 제한이 있습니다. 참고로 이 시스템이 개선됨에 따라 이 목록은 바뀔 수 있습니다.

  • 이 기능은 디퍼드 렌더링 이외 (모바일) 모드에서는 작동하지 않습니다.

  • 스크린 스캐터 반경을 크게 설정하면 극한의 라이팅 조건에서 띠 부작용이 생깁니다.

  • 현재 빛의 뒷면산란이 없습니다.

  • 현재 SSS 머티리얼이 비 SSS 머티리얼에 가려질 때 회색 윤곽선이 나타납니다.

서브서피스 프로파일 프로퍼티 레퍼런스

Tweak SubsurfaceProfile

프로퍼티 이름

설명

Scatter Radius:

산란 반경 - 월드 스페이스 유닛 단위로 어디까지 산란이 일어날지 입니다.

Subsurface Color:

서브서피스 컬러 - 서브서피스 이펙트의 웨이트로 사용할 수 있습니다. 검정은 서브서피스 스캐터가 없음을, 하양은 모든 빛이 머티리얼에 입사되어 산란됨을 뜻합니다. 그레이스케일 이외의 값은 표면에 입사되는 색 기여 부분을 보다 세밀히 제어할 수 있어, 보다 복잡한 모양새의 셰이딩을 얻을 수 있습니다.

Falloff Color

감쇠 색 - 빛이 머티리얼에 입사된 뒤의 머티리얼 산란 색을 정의합니다. 산란이 보이는 영역에 복잡한 셰이딩 다변화를 주고자 하는 경우 강렬한 색은 사용하지 않는 것이 좋습니다.

크레딧

두상 모델 제공과 도움을 주신 Lee Perry-Smith 와 그의 회사 Infinite Realities 에 특별한 감사 말씀 올립니다. 이 기능에 자신의 작업물을 기반으로 한 구현을 공개해 주신 Jorge Jimenez 께도 매우 각별한 감사 말씀 올립니다.

태그
Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼