지난 포스트에서는 Base Color, Metallic, Roughness 등 언리얼 머티리얼의 기본 입력값을 살펴보았다.
이번 포스트에서는 시간에 따라 변화하는 Material과 메시의 모양을 변형하는 방법을 정리했다.
같은 머티리얼 효과처럼 보여도 UV를 움직이는 방식과 버텍스를 움직이는 방식, 실제 메시를 변형하는 방식은 서로 동작 원리가 다르다.
Material 노드 정리하기
머티리얼의 기능이 늘어나면 노드 사이의 연결선이 길어지고 서로 겹치면서 구조를 파악하기 어려워진다.
간단한 연결은 선을 더블클릭해 일반 Reroute Node를 추가하여 정리할 수 있다.

노드들을 선택하고 Q를 누르면, 선택한 노드 사이의 연결선을 곧게 정리할 수 있다.


멀리 떨어진 노드를 연결해야 할 때는 Named Reroute Declaration Node를 사용할 수 있다.


Declaration Node에 전달할 값을 연결한 다음 이름과 색상을 지정한다.


이후 머티리얼 그래프에서 지정한 이름을 검색하면 같은 값을 불러오는 Named Reroute Usage Node를 배치할 수 있다.


긴 연결선을 그래프 전체에 배치하지 않아도 되기 때문에, 여러 위치에서 반복해서 사용하는 색상이나 마스크 값을 정리할 때 특히 편리하다.
Named Reroute는 렌더링 효과를 추가하는 노드가 아니라 그래프의 가독성을 높이기 위한 기능이다.
전광판 텍스처 움직이기: Panner
전광판처럼 글자가 흐르는 효과를 만들기 위해 도트 형태로 글자가 배치된 텍스처를 준비했다.

머티리얼의 Base Color에는 어두운 회색을 연결하고, 글자 텍스처는 색상값과 곱한 뒤 Emissive Color에 연결했다.
Emissive 값을 1보다 크게 설정하면 글자가 자체적으로 빛나는 것처럼 표현된다.



노드 연결 순서는 다음과 같다.
TexCoord → Panner → Texture Sample의 UVs
Time → Panner의 Time
Texture Sample × 글자 색상 → Emissive Color


Panner는 UV 좌표를 시간에 따라 이동시키는 노드다.
- Speed X: U축 이동 속도
- Speed Y: V축 이동 속도
- 양수와 음수: 이동 방향 전환
- 절댓값: 이동 속도
Panner의 Time 입력에는 일반적으로 Time 노드를 연결하지만 필수는 아니다.
Time을 연결하지 않아도 기본 시간값을 사용해 움직일 수 있다.
별도의 Time을 연결하면 속도를 가공하거나 Blueprint에서 특정 위치를 제어하는 구조로 확장하기 쉽다.

처음 적용했을 때는 텍스처에 들어 있는 글자가 한꺼번에 Plane에 표시되었다.
실제 전광판처럼 일부 영역만 보이게 만들기 위해 레벨의 Plane을 선택하고 Actor - Convert … to Static Mesh를 사용해 새로운 Static Mesh로 변환했다.


이후 UV Editor에서 UV 아일랜드의 크기를 줄였다.


UV 범위를 줄이면 텍스처 전체가 아니라 제한된 일부 영역만 샘플링한다.
이 상태에서 Panner가 UV를 이동시키면 좁은 표시 영역을 글자가 통과하는 것처럼 보인다.
이미지처럼 U와 V를 각각 0.5배로 줄이면 UV 면적은 원래의 1/4이 된다. 한 방향의 표시 범위만 줄이고 싶다면 해당 축만 축소해야 한다.

작업을 반복해서 조절해야 한다면 메시의 UV를 직접 수정하는 대신 머티리얼 내부에서 UV Scale과 Offset을 Parameter로 구성하는 방법도 사용할 수 있다.
Subsurface Scattering 표현하기
Subsurface Scattering, 줄여서 SSS는 빛이 표면에 닿은 뒤 내부로 들어가 산란되어 다시 나오는 현상이다.
피부, 밀랍, 옥, 얇은 플라스틱처럼 빛이 내부에서 퍼지는 재질을 표현할 때 사용한다.
새 머티리얼을 생성하고 Shading Model을 Subsurface로 변경했다.

- Base Color: 물체 표면의 기본 색상
- Subsurface Color: 내부에서 산란되어 보이는 빛의 색
- Opacity: 빛이 산란되는 정도
생성한 머티리얼을 오브젝트에 적용하고 뒤쪽에 Point Light를 배치하면 빛이 내부를 통과해 퍼지는 모습을 확인할 수 있다.


여기서 Opacity는 일반적인 투명도와 의미가 다르다.
값이 0에 가까울수록 많은 빛이 산란하고, 1에 가까울수록 산란이 줄어든다.
따라서 Opacity를 1에서 0.5로 낮추면 뒤쪽의 빛이 더 강하게 드러난다.
Subsurface Color를 Base Color보다 어둡게 설정하면 산란 효과가 줄어들어 차분하게 보일 수 있지만, 반드시 더 어두워야 하는 것은 아니다.
실제 재질 내부에서 퍼질 빛의 색과 밀도를 기준으로 정하는 것이 좋다.


단순히 투명도를 낮춘 것과 달리 표면은 불투명하게 유지되면서 뒤쪽 빛이 퍼져 보인다는 점이 SSS의 특징이다.
Wireframe 머티리얼 만들기
머티리얼의 Details 패널에서 Wireframe을 활성화하면 메시의 삼각형 경계만 렌더링할 수 있다.


빛나는 와이어 형태를 만들기 위해 Value가 높은 색상을 Emissive Color에 연결했다.


Wireframe의 밀도는 머티리얼 값이 아니라 원본 메시의 삼각형 구성에 따라 달라진다.
따라서 폴리곤이 많은 메시일수록 선이 촘촘하게 나타난다.

Emissive 값을 높였는데도 빛이 번지는 느낌이 약하다면 Post Process의 Bloom과 노출 설정도 함께 확인해야 한다.
불투명 유리: Spiral Blur
표면 너머의 배경이 흐릿하게 보이는 불투명 유리를 만들기 위해 SpiralBlur-SceneTexture 머티리얼 함수를 사용했다.
머티리얼의 기본 설정은 다음과 같다.
- Blend Mode: Translucent
- Translucency Lighting Mode: Surface Translucency Volume
- Base Color: 연한 회색
- Roughness: 0.2
- Metallic: 이번 작업에서는 1로 설정
SpiralBlur-SceneTexture의 Result는 Emissive Color에 연결하고, Scene Color Clamp to 0 출력은 Opacity에 연결했다. Distance 입력은 Scalar Parameter로 변환해 Material Instance에서 조절할 수 있게 구성했다.

Distance가 높아질수록 뒤쪽 배경이 더 넓은 범위에서 섞이면서 유리가 흐릿해진다.



이번 작업에서는 Metallic을 1로 설정했지만 실제 유리는 금속이 아닌 유전체이므로 물리 기반 재질에서는 보통 Metallic 0이 더 적절하다.
이번 값은 Spiral Blur와 Emissive를 중심으로 외형을 만드는 표현용 설정으로 이해하는 편이 정확하다.

Spiral Blur는 Scene Color를 여러 번 샘플링하는 방식이므로 넓은 화면을 덮거나 샘플 수를 크게 높일 경우 성능을 확인해야 한다.
Substrate
Substrate는 Default Lit, Clear Coat처럼 고정된 셰이딩 모델을 선택하는 기존 방식에서 벗어나, 재질의 표면과 내부 특성을 BSDF 단위로 조합하는 시스템이다.
금속 위의 코팅이나 유리의 흡수·투과처럼 여러 재질층을 표현하기 좋다.
다만 UE 5.6에서는 Beta 기능이므로 기존 프로젝트에 적용할 때는 별도 테스트와 백업이 필요하다.
점멸하는 비상등 만들기: Sine
비상등의 Base Color에는 짙은 빨간색을 연결하고, Emissive Color에는 Value가 높은 빨간색을 사용했다.
Roughness는 0.3으로 설정했다.


점멸을 만드는 기본 구성은 다음과 같다.
Time × 점멸 속도 → Sine
Sine × Emissive 색상 → Emissive Color


Sine은 시간이 흐르면서 반복되는 파형을 생성한다.
Time과 Sine 사이에 곱하는 값을 높이면 점멸이 빨라지고, 낮추면 느려진다.

Sine의 출력 범위는 -1부터 1이다.
예시처럼 바로 Emissive에 곱하면 음수 구간이 어둡게 처리되어 켜졌다 꺼지는 효과가 나타난다.
밝기가 0부터 1 사이에서 부드럽게 왕복하게 만들고 싶다면 다음과 같이 범위를 변환할 수 있다.
Sine × 0.5 + 0.5
점멸 속도와 Emissive 강도를 각각 Scalar Parameter로 분리해 두면 Material Instance에서 수정하기 편하다.
카드의 앞면과 뒷면 다르게 표현하기
한 장의 Plane에 카드 앞면과 뒷면을 다르게 표시하기 위해 다음 설정을 사용했다.
- Blend Mode: Masked
- Two Sided: 활성화

Masked 머티리얼은 Opacity Mask의 값을 기준으로 픽셀을 완전히 표시하거나 제거한다.
- 흰색: 표시되는 영역
- 검은색: 제거되는 영역
- 회색: Clip Value를 기준으로 둘 중 하나로 결정
따라서 흰색 카드 형태의 마스크를 Opacity Mask에 연결하면 카드 영역만 남고 주변 배경은 렌더링되지 않는다.
Masked는 반투명한 중간 상태를 표현하는 방식이 아니라 0과 1로 잘라내는 방식이다.
앞면과 뒷면 텍스처는 Lerp의 A와 B에 연결한다. TwoSidedSign은 앞면에서 1, 뒷면에서 -1을 출력한다.

이번 실습에서는 TwoSidedSign을 Lerp의 Alpha에 직접 연결했다.
다만 TwoSidedSign은 앞면에서 1, 뒷면에서 -1을 출력하므로, 정확한 0~1 선택값으로 사용하려면 Saturate 또는 Clamp(0~1)를 거치는 편이 안전하다.
TwoSidedSign → Saturate 또는 Clamp(0~1) → Lerp Alpha
이렇게 하면 한쪽 면에서는 A 텍스처, 반대쪽에서는 B 텍스처가 선택된다.
실제 앞뒤가 반대로 나온다면 Lerp의 A와 B를 서로 바꾸면 된다.


Plane의 한쪽 면이 사라지던 문제는 Two Sided를 활성화해 해결하고, TwoSidedSign으로 면의 방향을 판별해 서로 다른 텍스처를 보여주는 구조다.


메시 변형하기: World Position Offset
World Position Offset은 머티리얼이 메시의 기존 버텍스 위치를 월드 공간에서 이동시키는 입력이다.
먼저 Noise 텍스처에 큰 값을 곱해 WPO에 바로 연결했다.
Noise × 100 → World Position Offset


이 경우 흑백 Noise 값이 X·Y·Z에 동일하게 전달되므로 버텍스가 일정한 월드 방향으로 이동한다.
표면의 방향과 관계없이 변형되기 때문에 메시가 한쪽으로 밀리거나 뒤틀린 것처럼 보일 수 있다.
다음으로 Noise에 VertexNormalWS를 곱했다.
Noise × 100 × VertexNormalWS → World Position Offset


VertexNormalWS는 각 버텍스가 향하는 월드 공간 방향을 출력한다.
이를 곱하면 각 버텍스가 자신의 표면 법선 방향으로 이동하므로 표면이 부풀거나 들어가는 것처럼 변한다.
다만 0~1 범위의 Noise를 그대로 사용하면 대부분 바깥쪽으로만 이동한다.
안팎으로 균형 있게 움직이게 만들려면 Noise에서 0.5를 빼 중심을 0으로 맞출 수 있다.
(Noise - 0.5) × Strength × VertexNormalWS
Noise의 UV에는 TexCoord와 Panner를 연결했다.

Panner의 Speed X와 Speed Y를 변경하면 Noise가 표면을 따라 이동하면서 메시가 계속 자글거리게 된다.

WPO는 기존 버텍스만 움직이기 때문에 폴리곤이 많은 메시에서 더 부드럽게 표현된다.
이번 작업에서는 Modeling Mode의 Sphere를 Subdivision 100으로 생성해 결과를 확인했다.


WPO로 크게 변형하면 원래 메시 Bounds를 벗어나 컬링이나 그림자 오류가 생길 수 있다.
또한 렌더링되는 표면만 움직이며 충돌체가 자동으로 같은 모양으로 변하는 것은 아니라는 점도 주의해야 한다.

흔들리는 머티리얼 만들기: SimpleGrassWind
보다 간단하게 흔들리는 효과를 만들 때는 SimpleGrassWind 머티리얼 함수를 사용할 수 있다.
SimpleGrassWind의 출력은 World Position Offset에 연결한다.

- WindIntensity: 흔들림의 강도
- WindSpeed: 흔들리는 속도
- WindWeight: 버텍스별로 바람이 적용되는 정도
- AdditionalWPO: 다른 WPO 계산을 함께 전달하는 입력
이번 작업에서는 WindIntensity, WindWeight, WindSpeed를 Parameter로 변환해 1로 설정하고, AdditionalWPO는 (0, 0, 0)으로 두어 전체 메시가 움직이는 모습을 확인했다.

다만 실제 풀이나 천에 적용할 때는 WindWeight에 흑백 마스크나 Vertex Color를 연결하는 편이 자연스럽다.
예를 들어 아래쪽 버텍스는 검은색, 위쪽은 흰색으로 만들면 바닥은 고정되고 끝부분만 흔들린다.
AdditionalWPO는 다른 변형을 더하지 않는다면 0으로 두어도 된다.

Height Map을 이용한 Displacement
Displacement는 Height Map의 밝기값을 이용해 표면의 실제 위치를 높이거나 낮추는 방식이다.
Fab에서 재질을 가져올 때는 Height 또는 Displacement Map이 포함되어 있는지 먼저 확인해야 한다.
에셋에 따라 높은 품질 옵션에서만 제공될 수 있다.
이번 작업에서는 두 가지 방식으로 Displacement를 적용했다.
Nanite Tessellation 방식
Material Details의 Nanite 항목에서 Enable Tessellation을 활성화하면 메인 노드의 Displacement 입력이 활성화된다.
여기에 Height Map을 연결한 뒤 Magnitude와 Center를 조절했다.
Material Details의 Nanite 항목에서 다음 설정을 적용했다.
- Enable Tessellation: 활성화
- Magnitude: 약 10
- Center: 필요에 따라 조절
- Displacement Fade: 활성화

Magnitude는 Height Map의 0~1 범위가 실제로 얼마나 큰 높이 차이로 변환될지를 결정한다.
Center가 0.5이면 중간 회색을 원래 표면으로 보고 밝은 부분은 바깥쪽, 어두운 부분은 안쪽으로 이동한다.
Displacement Fade는 화면에서 작게 보이는 영역의 변형을 단계적으로 줄여 불필요한 Tessellation 비용을 낮추는 기능이다.
프로젝트에서 기능이 활성화되지 않았다면 설정 파일에 다음 변수가 필요할 수 있다.
r.Nanite.AllowTessellation=1
r.Nanite.Tessellation=1
그다음 Fab에서 가져온 Base Color, ORM, Normal Map을 각각 알맞은 머티리얼 입력에 연결했다.
Height Map은 메인 노드의 Displacement에 연결한다.

Modeling Mode에서 Rectangle을 생성하고 머티리얼을 적용했을 때 Nanite가 꺼져 있으면 평면으로 보이지만, Static Mesh에 Nanite를 활성화하면 표면이 입체적으로 변한다.



Cube에도 같은 방식으로 적용할 수 있지만 모서리나 꼭짓점에서 면이 벌어지는 현상이 발생했다.


각 면의 UV와 버텍스 노멀 방향이 분리되어 있으면 같은 Height Map 값이라도 면마다 다른 방향으로 이동한다.
이로 인해 경계가 서로 맞지 않아 틈이 생길 수 있다.
따라서 이 방식이 반드시 평면에만 적용되는 것은 아니지만, UV와 표면 방향이 연속된 평면형 메시에서 가장 안정적이다.
곡면이나 꺾인 메시에는 경계 처리와 변형량을 별도로 확인해야 한다.
같은 TexCoord를 Base Color, ORM, Normal Map, Height Map에 공통으로 연결해 Tiling을 조절했다.
값을 높이면 패턴과 요철이 더 작고 촘촘해지며, 모든 맵에 같은 Tiling을 적용해야 표면 무늬와 Displacement가 어긋나지 않는다.




Modeling Mode에서 메시를 직접 변형하는 방식
두 번째 방법은 머티리얼이 런타임에 표면을 바꾸는 대신 Modeling Mode에서 메시 자체를 변형하는 방식이다.
- Modeling Mode에서 Rectangle 생성
- Mesh > Remesh로 이동
- Target Triangles를 약 500,000으로 높임
- Deform > Displace 선택
- Displacement Type을 Texture2D Map으로 설정
- Height Map을 지정하고 강도 조절
- 결과를 확인한 뒤 Accept




변형된 Rectangle에는 Fab에서 가져온 Material Instance를 적용했다.

많은 삼각형을 가진 메시가 생성되므로 Nanite를 활성화하는 것이 좋다.
필요하다면 Mesh - Simplify의 Target Percentage를 사용해 삼각형 수를 줄일 수 있다.
너무 많이 줄이면 실루엣과 표면의 굴곡이 손상될 수 있으므로 최종 카메라 거리에서 결과를 확인하면서 조절해야 한다.



세 가지 메시 변형 방식 비교
| 방식 | 변형 시점 | 특징 | 적합한 경우 |
| World Position Offset | 런타임 | 기존 버텍스만 이동 | 바람, 물결, 반복 애니메이션 |
| Nanite Tessellation | 런타임 | 필요한 삼각형을 동적으로 추가 | 고밀도 지면, 움직이는 Displacement |
| Modeling Mode Displacement | 편집 단계 | 메시 자체에 변형을 저장 | 고정된 지형, 결과를 직접 수정해야 할 때 |
Nanite Tessellation은 동적인 표현에 유리하지만 실험적 기능과 플랫폼 지원, 성능을 확인해야 한다.
Modeling Mode 방식은 결과가 고정되는 대신 형태를 직접 확인하고 후처리하기 쉽다는 차이가 있다.
이번 포스트에서는 머티리얼을 단순히 표면 색과 질감을 설정하는 기능이 아니라, 시간·면 방향·버텍스·Height Map에 따라 다양한 변화를 만드는 도구로 활용했다.
Panner와 Sine은 텍스처와 발광을 시간에 따라 바꾸고, TwoSidedSign은 면의 방향을 구분한다.
WPO와 SimpleGrassWind는 기존 버텍스를 움직이며 오브젝트에 애니메이션을 더하는 방식이고, Displacement는 표면의 높낮이를 만들어 메시의 실루엣까지 변화시키는 방식이다.
비슷한 결과가 나오더라도 어느 단계에서 무엇을 변화시키는지 구분하면 효과에 맞는 방법을 선택하기 쉬워진다.
'3D Video Production > Unreal Engine (5.6.1)' 카테고리의 다른 글
| UE 5.6 Material 심화: 이미지 시퀀스 Fog부터 Material Attributes, 눈 쌓임 표현까지 (0) | 2026.08.28 |
|---|---|
| UE 5.6 Material 심화: Decal과 Vertex Paint부터 Dissolve, 유리, 물 재질까지 (1) | 2026.08.27 |
| UE 5.6 Material: PBR 속성부터 Gradient, Noise, Tiling까지 (0) | 2026.08.25 |
| UE 5.6 RealityScan 공간 스캔: C4D 축 정렬과 표면 보정 (0) | 2026.08.24 |
| UE 5.6 RealityScan 포토그래메트리 (0) | 2026.08.21 |