텍스처 좌표와 UV
TexCoord, Panner, Rotator, World Position, Triplanar Projection 등 UV 조작의 모든 것.
UV 좌표 기초
텍스처 매핑의 근본 원리
UV 좌표는 3D 메시의 각 정점에 할당된 2D 좌표로, 텍스처의 어떤 부분이 메시의 어디에 매핑되는지를 결정합니다. U는 수평, V는 수직 축입니다.
// UE5 UV 좌표 체계
(0,0) ────────── (1,0)
│ │
│ 텍스처 영역 │
│ │
(0,1) ────────── (1,1)
// 0~1 범위: 텍스처 1회 매핑
// 0~2 범위: 텍스처 2회 타일링
// UV > 1 또는 < 0: 텍스처의 Wrap 모드에 따라 동작
// Repeat(기본): 타일링
// Clamp: 가장자리 색상으로 고정
TexCoord 노드
| 파라미터 | 설명 | 기본값 |
|---|---|---|
| Coordinate Index | 사용할 UV 채널 (0, 1, 2...) | 0 |
| UTiling | U축 타일링 횟수 | 1.0 |
| VTiling | V축 타일링 횟수 | 1.0 |
UE5 메시는 최대 8개의 UV 채널(0~7)을 가질 수 있습니다. UV0는 텍스처 매핑용, UV1은 라이트맵용이 일반적입니다. UV2 이상은 마스크, 디테일 등 추가 용도로 활용합니다.
UV 애니메이션 노드
Panner, Rotator로 움직이는 텍스처
Panner (이동)
// UV를 시간에 따라 이동 (스크롤)
Panner
Coordinate: TexCoord // 입력 UV
Time: Time // 자동 시간 (생략 가능)
SpeedX: 0.1 // U방향 속도
SpeedY: 0.0 // V방향 속도
// 활용: 흐르는 물, 용암, 컨베이어 벨트, 홀로그램
// 내부 수식:
UV_out = UV_in + float2(SpeedX, SpeedY) * Time
Rotator (회전)
// UV를 중심점 기준으로 회전
Rotator
Coordinate: TexCoord
Time: Time
CenterX: 0.5 // 회전 중심 U
CenterY: 0.5 // 회전 중심 V
Speed: 0.25 // 회전 속도 (1 = 1초에 360도)
// 활용: 회전하는 마법진, 레이더 스캔, 환풍기
서로 다른 속도와 방향의 Panner를 2~3개 겹치면 복잡한 패턴을 만들 수 있습니다. 예: 용암 = 느린 Panner(기본 흐름) + 빠른 Panner(표면 디테일) + Rotator(소용돌이).
World Position 기반 투영
월드 좌표를 UV로 사용하기
메시의 UV가 없거나 적합하지 않을 때, 월드 좌표를 텍스처 좌표로 사용할 수 있습니다. 이 방식은 이음매 없는 텍스처링에 유용합니다.
// 월드 좌표 기반 텍스처 매핑
WorldPosition
→ ComponentMask (XY만 추출)
→ Divide by 512 // 타일링 크기 (cm)
→ TextureSample UVs 입력
// 장점: UV 언래핑 불필요, 오브젝트 간 이음매 없음
// 단점: 하나의 축에서만 투영 → 측면 늘어남
Triplanar Projection
3개 축(XY, XZ, YZ)에서 각각 투영한 뒤 노말 방향 가중치로 블렌딩하여 모든 면에서 자연스러운 결과를 얻습니다.
// Triplanar Projection (Custom Node)
float3 worldPos = GetWorldPosition();
float3 worldNormal = abs(GetWorldNormal());
// 가중치 (노말 방향에 따라)
float3 blend = pow(worldNormal, 4);
blend /= dot(blend, 1.0); // 정규화
// 3축 투영
float4 xProj = Texture2DSample(Tex, TexSampler, worldPos.yz / Scale);
float4 yProj = Texture2DSample(Tex, TexSampler, worldPos.xz / Scale);
float4 zProj = Texture2DSample(Tex, TexSampler, worldPos.xy / Scale);
// 블렌딩
return xProj * blend.x + yProj * blend.y + zProj * blend.z;
UE5는 WorldAlignedTexture, WorldAlignedNormal 머티리얼 함수를 기본 제공합니다. Triplanar 로직이 내장되어 있어 HLSL 작성 없이도 사용할 수 있습니다. 팔레트에서 검색하여 사용하세요.
UV 왜곡과 디스토션
노이즈와 마스크로 UV를 변형
UV에 노이즈를 더하면 텍스처가 왜곡됩니다. 열 아지랑이, 물 굴절, 마법 효과 등에 활용됩니다.
// 기본 UV 디스토션
// 1. 노이즈 텍스처로 왜곡량 생성
Panner (SpeedX: 0.05, SpeedY: 0.03)
→ TextureSample (노이즈 텍스처)
→ Multiply by 0.02 // 왜곡 강도 (작은 값!)
→ DistortionOffset
// 2. 기본 UV에 왜곡 더하기
TexCoord
→ Add (+ DistortionOffset)
→ TextureSample (메인 텍스처)
// 주의: 왜곡 강도는 0.01~0.05 정도가 자연스러움
// 너무 크면 텍스처가 깨져 보임
UV 디스토션은 노이즈 텍스처를 추가로 샘플링합니다. 모바일이나 저사양 환경에서는 텍스처 대신 노이즈 노드(Noise, SimpleNoise)를 사용하거나 버텍스 셰이더에서 UV를 변형하여 비용을 줄일 수 있습니다.
핵심 요약
- UV 좌표는 0~1 범위로 텍스처를 메시에 매핑하며, TexCoord 노드로 타일링과 채널을 제어합니다.
- Panner는 UV를 이동(스크롤), Rotator는 UV를 회전시켜 애니메이션을 만듭니다.
- World Position을 UV로 사용하면 UV 언래핑 없이 이음매 없는 텍스처링이 가능합니다.
- Triplanar Projection은 3축 투영 + 노말 가중치 블렌딩으로 모든 면에서 자연스러운 결과를 제공합니다.
- UV 디스토션은 노이즈로 UV를 왜곡하며, 강도는 0.01~0.05 범위가 자연스럽습니다.
도전 과제
배운 내용을 직접 실습해보세요
TexCoord 노드의 UTiling, VTiling을 변경하여 텍스처 반복 횟수를 조절하세요. Append 노드로 U, V를 개별 제어하고, Panner 노드로 UV 스크롤 애니메이션을 추가하세요.
WorldPosition 노드와 ComponentMask를 활용하여 Tri-Planar 프로젝션을 구현하세요. 오브젝트의 UV에 의존하지 않고 월드 좌표로 텍스처를 매핑하여 이음새 없는 결과를 만드세요.
Sine, Time, Noise 노드를 조합하여 UV를 실시간으로 왜곡하는 물 표면 효과를 만드세요. 두 개의 다른 속도와 스케일의 왜곡을 블렌딩하여 자연스러운 결과를 얻으세요.