언리얼 엔진은 사실적인 피부나 밀랍 표면을 렌더링하기 위해 서브서피스 프로파일(Subsurface Profile) 셰이딩이라는 특정한 셰이딩 메서드를 제공합니다.
서브서피스 프로파일 셰이딩 메서드는 서브서피스 메서드와 비슷하지만, 렌더링 방식에는 근본적인 차이가 있습니다. 서브서피스 프로파일은 스크린 스페이스 에 기반합니다. 이는 스크린 스페이스 렌더링이 사람 피부에 나타나는 미세한 서브서피스 이펙트를 표현하는 데 더 효과적이기 때문입니다. 사람 피부의 경우 후방 산란은 귀와 같은 일부 사례에서만 관찰되는 보조 이펙트입니다. 이 문서에서는 서브서피스 프로파일은 무엇이며 이를 작업에 어떻게 사용할 수 있는지 다룹니다.


이 문서 작성에 도움을 주시고 3D 스캔 헤드 모델도 제공해 주신 리 페리 스미스(Lee Perry-Smith)와 그가 재직 중인 인피니트 리얼리티(Infinite Realities)에 감사의 말을 전합니다.
서브서피스 프로파일이란
서브서피스 스캐터링 프로파일 데이터는 콘텐츠 브라우저(Content Browser) 에서 생성하고, 공유하고, 저장할 수 있는 에셋입니다. 이 데이터는 아티스트가 작성하도록 되어 있으며, 서브서피스의 라이트가 스캐터링되어야 하는 거리, 서브서피스의 컬러, 오브젝트에서 나왔을 때 라이트의 감쇠 컬러를 제어합니다. 그런 다음 이 데이터를 서브서피스 머티리얼에 적용할 수 있습니다. 서브서피스 프로파일 데이터는 또한 인터랙티브하게 미세조정할 수 있으며, 이는 편집 결과를 확인하기 위해 머티리얼을 리컴파일하지 않아도 된다는 것을 의미합니다.
서브서피스 프로파일 활성화, 생성, 사용하기
언리얼 엔진에서 서브서피스 프로파일을 사용하는 방식은 많고 다양합니다. 다음 섹션에서는 이러한 방식들을 하나씩 살펴보겠습니다.
서브서피스 프로파일 생성하기
서브서피스 프로파일을 생성하려면 먼저 콘텐츠 브라우저 안에서 우클릭합니다. 그런 다음 머티리얼 및 텍스처(Materials & Textures) 옵션을 선택한 후 서브서피스 프로파일(Subsurface Profile) 옵션을 선택합니다.

콘텐츠 브라우저 에서 왼쪽 마우스 버튼 으로 더블클릭하여 서브서피스 프로파일을 열고 편집할 수 있습니다. 서브서피스 프로파일이 열리면 키보드로 숫자를 입력하거나, 왼쪽 마우스 버튼 으로 컬러 바를 클릭 하여 색 선택 툴을 여는 방식으로 서브서피스 스캐터링 프로파일의 개별 프로퍼티를 조정할 수 있습니다.
서브서피스 프로파일 활성화하기
머티리얼에 서브서피스 프로파일을 사용하려면 먼저 머티리얼의 디테일(Details) 패널에서 머티리얼 셰이딩 모델(Shading Model) 을 서브서피스 프로파일 로 설정하여 서브서피스 프로파일을 활성화해야 합니다. 활성화되면 서브서피스 프로파일 입력에 새로운 서브서피스 프로파일을 입력하여, 사용되는 디폴트 서브서피스 프로파일을 오버라이드할 수 있습니다.
서브서피스 프로파일의 디폴트 세팅은 백인 피부 타입에 가깝습니다. 이는 사실적으로 보이는 피부를 얻기 위한 하나의 컴포넌트에 불과합니다. 텍스처의 베이스 컬러가 원하는 서브서피스 스캐터링 프로파일에 항상 적합해야 합니다.

머티리얼 인스턴스에서도 서브서피스 프로파일을 오버라이드할 수 있습니다. 이를 위해 머티리얼 인스턴스의 디테일 패널로 이동하여 서브서피스 프로파일 오버라이드(Override Subsurface Profile) 를 활성화합니다. 활성화되면 서브서피스 프로파일 입력에 사용할 서브서피스 프로파일을 제공합니다.

전체 계산은 에너지 보존 법칙을 따르므로, 스캐터링을 통해 추가 라이트를 생성하는 것은 불가능합니다.
Burley 서브서피스 프로파일
Burley 서브서피스 스캐터링은 Burley 알고리즘이 사용된 스크린 스페이스 모델을 사용합니다. 이는 물리적으로 보다 정확하며, 물리 기반 머티리얼 프로퍼티를 사용하여 구성을 단순화하는 한편 스킨 셰이딩 퀄리티를 향상하는 것이 목적입니다. 기존의 분리 가능한 SSS 알고리즘보다 훨씬 고퀄리티의 고급 스킨 렌더링을 목표로 하며, 감쇠가 보다 깔끔하고 정확합니다.


이 서브서피스 스캐터링 모델을 사용하려면 서브서피스 프로파일 에셋에서 벌리 활성화(Enable Burley) 에 체크합니다.
이 메서드가 제대로 표시되려면 템포럴 안티 에일리어싱이 필요합니다.
머티리얼 입력 채널
스크린 스페이스 서브서피스 셰이딩 프로파일은 릿 셰이딩 모델과 크게 다르지 않지만, 메탈릭 입력의 용도가 변경되어 사용할 수 없다는 것이 주된 차이점입니다.
베이스 컬러(Base Color) 입력: 베이스 컬러 입력은 평소처럼 디퓨즈 라이팅에 사용됩니다. 스크린 스페이스 서브서피스 스캐터링은 컬러나 밝기의 변화 없이 가까운 픽셀에 라이팅을 재분포시킬 뿐이므로 여분의 서브서피스 스캐터링 컬러는 존재하지 않습니다. 따라서 머티리얼을 특정 컬러로 스캐터링해야 하는 경우 베이스 컬러의 일부로 표현해야 합니다. 베이스 컬러는 스캐터링과 디퓨즈 라이팅을 구별할 수 없는 원거리에서 머티리얼이 보일 때의 최종 컬러가 되어야 합니다.
사람의 피부는 빛의 양과 색을 일정 부분 차단하는 얇은 막으로, 피하의 선명한 붉은색 살을 덮고 있습니다. 옅은 색 피부의 가시 스캐터링 거리는 약 1.2cm입니다.
메탈릭(Metallic) 입력: 서브서피스 프로파일 사용 시 메탈릭 입력의 GBuffer 공간이 서브서피스 프로파일 데이터를 수용하기 위해 용도가 변경되었으므로, 메탈릭 입력 채널을 사용할 수 없습니다.
오파시티(Opacity) 입력: 오파시티 입력 채널은 서브서피스 스캐터링 기여를 마스킹하는 데 사용됩니다. 0~1 범위의 값으로 작동하여 서브서피스 스캐터링 강도가 다른 여러 영역 사이를 부드럽게 전환하도록 하며, 0은 스캐터링 없음, 1은 최대 스캐터링입니다.
서브서피스 스캐터링의 강약을 잘 제어하려면 마스크 텍스처를 사용하는 것이 가장 좋습니다.
마스크 텍스처 영역의 값이 1 또는 흰색에 가까울수록 서브서피스 스캐터링 이펙트가 강해지는 반면, 0 또는 검은색에 가까울수록 서브서피스 스캐터링 이펙트가 약해집니다.
서브서피스 컬러를 조정하면 영역이 지나치게 어두워지는 경우 이를 보완하는 데 도움이 됩니다. 더 밝은 컬러를 사용할수록 서브서피스 스캐터링이 더 강해진다는 점을 알아 두세요.
여기서는 하나의 머티리얼로 두 표면 타입을 렌더링하기 위해 마스크가 어떻게 사용됐는지 확인할 수 있습니다. 트랜지션이 부드럽고 트라이앵글 경계에 제한되지 않은 모습입니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
전체 해상도 스킨 셰이딩
언리얼 엔진은 서브서피스 프로파일 셰이딩 모델에 전체 해상도 스킨 셰이딩을 지원합니다. 이를 통해 모공, 주름 등의 표면 디테일에 높은 충실도의 라이팅을 제공합니다.


이전에는 스킨 라이팅이 체커보드 패턴으로 표현되었으며, 픽셀의 절반은 디퓨즈 라이팅만, 나머지 절반은 스페큘러 라이팅만 사용했습니다. 라이팅은 최종 서브서피스 프로파일 풀스크린 패스 중에 재결합되었습니다. 이러한 접근법은 본래 저주파인 서브서피스 라이팅에 좋은 결과를 제공했지만, 표면 디테일의 라이팅 충실도는 떨어질 수 있었습니다. 새로운 접근법의 경우 픽셀마다 디퓨즈 및 스페큘러 라이팅 정보가 포함되어 있으며, 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 참조) 대부분의 경우 유효합니다.
스페큘러를 성공적으로 잡아내지만, 해당 스페큘러 픽셀에 대한 뷰 종속 컬러의 채도는 감소합니다. 이는 모든 라이팅 패스에 2개의 32비트 렌더 타깃을 사용하여 개선할 수 있습니다. 이 방식은 메모리 대역폭이 동일하지만 일부 하드웨어에서는 더 느릴 수 있으며, 코드 복잡도로 인해 변경될 수도 있습니다.
다음은 블러 적용 전 스페큘러를 제거한 예시입니다. 맨 오른쪽 최종 이미지의 스페큘러 리플렉션이 산뜻하고 매끄러우며, 이것이 구현하고자 했던 이펙트입니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
다음은 블러 적용 전 스페큘러를 제거하지 않은 예시입니다. 맨 오른쪽 최종 이미지의 스페큘러 리플렉션이 흐릿하고 살짝 늘어나 보입니다. 이는 이 이펙트를 렌더링하는 올바른 방식이 아닙니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
확장성 및 콘솔 명령
고퀄리티 비주얼과 더 나은 퍼포먼스 사이에서 적절한 균형을 찾는 데 도움이 되는 몇 가지 스케일링 및 퍼포먼스 콘솔 명령이 있습니다.
r.SSS.Scale: 빠른 실험을 위해 이펙트의 스케일을 조절하는 데 사용할 수 있습니다. 이 값을 0으로 설정하면 이펙트가 비활성화됩니다. 0보다 큰 숫자로 설정하면 아래 이미지 시퀀스에서 볼 수 있듯이 이펙트가 강해집니다.











슬라이더를 드래그하면 r.SSS.Scale 값을 0에서 10까지 설정할 때 어떻게 달라지는지 확인할 수 있습니다.
r.SSS.SampleSet: 사용되는 샘플 수를 설정합니다. 이 값을 줄이면 이펙트가 더 빨리 실행됩니다. 하지만 이펙트의 퀄리티가 낮아지고 렌더링 아티팩트가 발생할 수 있습니다.


다음 이미지는 시스템 내부를 조금 더 자세히 보여줍니다. ShowFlag.VisualizeSSS 1 을 사용하여 이 뷰를 활성화할 수 있습니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
서브서피스 스캐터링 프로파일 셰이딩 모델은 피부 렌더링에 있어 한 단계 발전했지만, 기능에 약간의 제한 사항도 따릅니다. 이 시스템이 점점 더 개선됨에 따라 이 목록은 변경될 수 있습니다.
- 이 기능은 비디퍼드 (모바일) 렌더링 모드에서는 작동하지 않습니다.
- 스크린 스캐터 반경을 크게 설정하면 극단적인 라이팅 조건에서 밴딩 아티팩트가 발생합니다.
- 현재 라이트의 후방 산란이 없습니다.
- 현재 비SSS 머티리얼이 SSS 머티리얼을 가릴 때 회색 외곽선이 나타납니다.
서브서피스 프로파일 프로퍼티 레퍼런스

프로퍼티 이름 | 설명 |
---|---|
Burley 정규화됨 | |
표면 알베도(Surface Albedo) | 해당 머티리얼의 베이스 컬러에 최대한 가깝게 매칭되도록 설정해야 합니다. |
평균 자유 경로 색(Mean Free Path Color) | 레드, 그린, 블루 채널의 서브서피스에 라이트가 얼마만큼 들어가는지를 제어합니다. 평균 자유 경로 거리 에 의해 스케일 조절됩니다. |
평균 자유 경로 거리(Mean Free Path Distance) | 평균 자유 경로 색 이 서브서피스에 들어가는 거리를 제어합니다. |
월드 유닛 스케일(World Unit Scale) | 월드/언리얼 유닛(cm)의 스케일을 제어합니다. |
벌리 활성화(Enable Burley) | cmd에서 벌리 서브서피스 스캐터링이 활성화된 경우에만 유효합니다. |
서브서피스 프로파일 | |
스캐터 반경(Scatter Radius) | 스캐터를 수행하기 위한 월드 스페이스 유닛의 거리입니다. |
서브서피스 컬러(Subsurface Color) | 서브서피스 컬러는 서브서피스 이펙트의 가중치로 사용할 수 있습니다. 검은색이면 서브서피스 스캐터링이 없다는 뜻이며, 흰색이면 모든 라이팅이 머티리얼에 입사 및 스캐터링된다는 뜻입니다. 비그레이스케일 값으로 표면에 어떤 컬러 기여가 입사되는지 세밀하게 제어하여 보다 복잡해 보이는 셰이딩을 얻을 수 있습니다. |
감쇠 컬러(Falloff Color) | 감쇠 컬러는 라이트가 머티리얼에 입사되었을 때 머티리얼 스캐터링 컬러를 정의합니다. 스캐터링이 보이는 영역에 보다 복잡한 셰이딩 베리에이션을 구현하고자 하는 경우 선명한 색은 사용하지 않아야 합니다. |
바운더리 컬러 블리드(Boundary Color Bleed) | 한 서브서피스 머티리얼이 다른 서브서피스 머티리얼과 블렌딩되는 방식을 제어합니다. |
투과 | |
소멸 스케일(Extinction Scale) | 흡수 스케일을 제어합니다. |
노멀 스케일(Normal Scale) | 투과에 대한 노멀 기여를 제어합니다. |
스캐터링 분포(Scattering Distribution) | 투과 결과에 대한 스캐터링 분포를 제어합니다. |
IOR | 투과 결과에 리프랙션 인덱스를 설정합니다. |
투과 색조 컬러(Transmission Tint Color) | 투과 결과에서 곱하는 방식으로 투과 색조를 제어합니다. Burley 정규화됨 카테고리의 벌리 활성화(Enable Burley) 박스가 활성화되어 있어야 합니다. |
듀얼 스페큘러 | |
러프니스 0(Roughness 0) | 더 부드러운 로브의 러프니스를 제어합니다. |
러프니스 1(Roughness 1) | 더 조밀한 로브의 러프니스를 제어합니다. |
로브 믹스(Lobe Mix) | 최종 결과를 위해 결합된 2개의 별도 로브에 대한 러프니스 값을 제어합니다. 결합되면, 자연스러운 룩을 위해 피부에 적절한 서브픽셀 마이크로 주파수를 제공합니다. 러프니스 0 및 러프니스 1 을 사용하여 듀얼 스페큘러에 대한 별도의 로브를 제어합니다. |