3D Video Production/Unreal Engine (5.6.1)

UE 5.6 텍스처 작업: glTF·FBX 임포트 및 ORM 채널 패킹

보별 2026. 7. 7. 16:22
반응형

언리얼 엔진에서 외부 에셋을 가져오면 모델은 정상적으로 보이는데, 머티리얼이 비어 있거나 텍스처가 일부만 연결된 상태로 들어오는 경우가 있다.

처음에는 단순히 임포트 오류처럼 느껴질 수 있지만, 실제로는 파일 포맷과 텍스처 구조, 머티리얼 연결 방식, 채널 패킹 방식이 함께 영향을 준다.

이번 포스트에서는 같은 에셋을 glTF와 FBX 두 가지 형식으로 가져와 비교해 보고, FBX 텍스처를 수동으로 연결하는 과정까지 진행했다.
이어서 Seamless 텍스처 타일링, ORM 텍스처, RGB 채널 패킹, Emissive Color 제어까지 정리해 보았다.

 

glTF & FBX

glTFFBX는 모두 3D 에셋을 전달할 수 있는 포맷이지만, 사용 목적과 임포트 결과가 완전히 같지는 않다.

glTF는 실시간 렌더링 환경에서 빠르게 전송하고 로드하는 데 초점을 둔 3D 전달 포맷이다.
Metallic-Roughness 기반의 PBR 머티리얼 구조도 기본으로 지원한다.

반면 FBX는 메시, 스켈레톤, 애니메이션, 모프 타깃, UV 등 다양한 제작 데이터를 DCC 툴과 게임 엔진 사이에서 교환할 때 널리 사용된다.

다만 glTF가 항상 더 편하고, FBX가 항상 더 많은 정보를 보존하는 것은 아니다.
실제 결과는 에셋 제작 방식, 익스포트 옵션, 언리얼 임포트 파이프라인에 따라 달라진다.

glTF와 FBX는 사용 목적이 다른 포맷으로 보는 편이 좋음

이미지의 표현은 개념 이해를 위한 단순화된 비교다.
실제 FBX 호환 결과는 사용하는 DCC 툴, 익스포트 설정, 언리얼 임포트 옵션에 따라 달라질 수 있다.

같은 에셋을 glTF와 FBX로 불러왔을 때 차이

같은 가스통 에셋을 glTF와 FBX로 각각 다운로드해 언리얼 엔진에 Import했다.

이번 작업 환경에서는 glTF 파일을 Import했을 때 Static Mesh, 텍스처, Material Instance가 함께 생성됐고, 레벨에 배치했을 때 재질도 정상적으로 적용돼 있었다.

반면 FBX 파일은 메시와 머티리얼 구조는 들어왔지만, 일부 텍스처가 자동으로 연결되지 않은 상태였다.

언리얼의 FBX Import는 소스 머티리얼과 텍스처를 함께 가져올 수 있다.
다만 에셋 제작 방식이나 익스포트 설정에 따라 일부 PBR 맵이 자동으로 연결되지 않을 수 있으므로, Base Color, Roughness, Metallic, Normal 연결 상태를 직접 확인하는 과정이 필요하다.

FBX 텍스처를 언리얼 머티리얼에 다시 연결하기

FBX 파일 옆에 있던 Texture 폴더도 함께 언리얼 프로젝트에 Import했다.

그다음 FBX에서 생성된 Static Mesh가 사용하는 머티리얼을 열고, 비어 있는 Texture Sample Parameter 2D 노드에 각 텍스처를 지정했다.
새로 추가한 Texture Sample 노드는 Parameter로 변환하고, 기존 머티리얼 구조에 맞게 이름을 정리해 다시 연결했다.

이번 에셋에서는 Base Color Map, Shininess Map, Normal Map을 다시 지정했다.

Shininess Map은 Roughness와 같은 값이 아니라 표면의 광택 정도를 나타내는 정보이며, 이번에 자동 생성된 Master Material에서는 MF_PhongToMetalRoughness 함수가 Phong 계열 정보를 Metallic-Roughness 방식으로 변환하는 과정에서 Shininess Map을 참조하고 있었다.

그러면 FBX 텍스처가 적용된 오브젝트도 아래와 같이 정상적으로 적용되는 것을 확인할 수 있다.

좌측: glTF / 우측: FBX

8비트 & 16비트 텍스처 확인하기

언리얼 Content Browser에서 텍스처에 마우스를 올리면 Source Format 정보를 확인할 수 있다.

이번 작업에서는 TSF_R16F와 TSF_BGRA8 형식을 확인했다.

  • TSF_R16F: R 채널 하나를 16비트 Float로 저장한 형식
  • TSF_BGRA8: B, G, R, A 채널을 각각 8비트로 저장한 형식

16비트 텍스처는 더 넓은 범위나 부드러운 값을 표현하는 데 유리할 수 있다.
하지만 Roughness, Metallic, Ambient Occlusion처럼 0~1 범위의 마스크 데이터는 많은 경우 8비트 PNG만으로도 충분하다.
따라서 텍스처 용도와 필요한 정밀도를 확인한 뒤, 필요할 때만 8비트로 변환하는 편이 좋다.

Photoshop에서는 Image - Mode - 8 Bits/Channel에서 8비트로 변환할 수 있다.
단, 변환 과정에서 일부 데이터가 사라질 수 있으므로 원본 EXR은 별도로 보관하는 편이 안전하다.

이번 작업에서는 16비트 원본을 8비트 PNG로 변환한 뒤 밝기 차이가 나타났다.
변환 과정과 원본 데이터 특성에 따라 화면 결과가 달라질 수 있으므로, 변환 전후에는 같은 머티리얼과 조명 조건에서 결과를 직접 비교하는 편이 안전하다.

좌측: 16비트 / 우측: 8비트

다만 EXR 같은 고정밀 원본을 무조건 8비트로 변환하는 것은 권장되지 않는다.
Height, Displacement, HDR, 부드러운 그라데이션이 중요한 데이터는 정밀도 손실이 눈에 띌 수 있기 때문이다.

 

Seamless 텍스처 & UV 타일링 적용하기

타일링 머티리얼을 만들 때는 이미지가 자연스럽게 반복되는지 먼저 확인해야 한다.

Seamless 텍스처는 좌우, 상하 경계가 반복돼도 티가 나지 않도록 제작된 이미지다.
단순히 패턴처럼 보이는 이미지라도 가장자리가 이어지지 않으면 타일링 시 반복 흔적이 드러난다.

Diffuse 이미지로 Roughness와 Normal Map 만들어 보기

이번 작업에서는 원본 Diffuse 이미지를 바탕으로 간단한 Roughness MapNormal Map도 만들어 보았다.

먼저 Diffuse 이미지를 Photoshop에서 열고, Image - Adjustments - Desaturate를 적용해 흑백 이미지를 만들었다.

이 이미지는 Roughness Map의 임시 초안으로 사용할 수 있다.

다만 색이 밝다고 해서 실제 표면이 거칠다는 뜻은 아니다.
Diffuse에는 조명과 그림자, 반사, 색상이 섞여 있을 수 있기 때문에 완성용 Roughness Map으로 그대로 사용하기에는 한계가 있다.

이번 작업에서는 이미지 기반 Normal Map 생성 도구를 이용해 Diffuse 이미지에서 Normal Map을 만들었다.

생성 과정에서 뒤집기 옵션을 적용한 뒤 PNG로 내보냈다.

다만 뒤집기 옵션은 사용하는 도구의 기본 방향에 따라 달라질 수 있으므로, 언리얼에서 돌출과 음각이 반대로 보일 때 Green Channel 방향을 확인하는 편이 좋다.

위에서 생성한 텍스처 이미지들을 언리얼로 Import했고, 새로운 Material을 생성하여 각 텍스처에 맞게 연결해 줬다.

이전 포스트에서 만든 UV Tile과 Offset 구조를 그대로 사용했다.
같은 UV 값을 Base Color, Roughness, Normal Texture Sample의 UV 입력에 공통으로 연결해, 모든 텍스처가 같은 기준으로 반복되도록 설정했다.

Seamless 텍스처의 반복 품질을 비교하기 위해 AI로 생성한 일반 패턴 이미지와, 반복 사용을 전제로 제작된 Seamless 텍스처를 같은 조건에서 적용해 보았다.

기존 Material을 복제한 뒤 Base Color 텍스처만 다르게 지정해 두 개의 부모 Material을 만들었다.
이후 각 Material에서 Material Instance를 생성하고, 레벨에 배치한 Plane에 각각 적용해 비교했다.

  • 왼쪽: AI로 생성한 패턴 이미지
  • 오른쪽: 반복 사용을 전제로 제작된 Seamless 이미지

Material Instance에서 U Tile과 V Tile 값을 2, 2로 올려 보면 반복 상태를 빠르게 확인할 수 있다.

상하 경계가 맞지 않으면 반복 흔적이 드러남

AI 이미지는 단일 이미지로 볼 때는 자연스러웠지만, 타일링을 적용하자 상하 경계에서 반복 흔적이 드러났다.
반면 Seamless 텍스처는 좌우와 상하 경계가 이어지도록 제작돼 반복 적용해도 비교적 자연스럽게 보였다.

실제로 타일링을 해 보면 이미지 자체가 예쁜지보다, 경계가 이어지는지가 훨씬 더 중요하게 느껴진다.

 

ORM 텍스처 & RGB 채널 이해하기

PBR 텍스처를 받을 때 ORM이라는 이름의 파일을 자주 볼 수 있다.

ORM은 보통 RGB 채널에 서로 다른 흑백 데이터를 넣은 텍스처다.

R 채널: Ambient Occlusion
G 채널: Roughness
B 채널: Metallic
 

ORM 텍스처를 채널별로 확인해 보면, 각 채널에는 서로 다른 흑백 데이터가 저장돼 있는 것을 볼 수 있다.

벽돌처럼 비금속 재질은 Metallic 값이 거의 필요하지 않기 때문에 B 채널이 검은색에 가깝게 보이는 것이다.

머티리얼에서는 Texture Sample의 각 출력 핀을 다음처럼 연결한다.

R → Ambient Occlusion
G → Roughness
B → Metallic
 

RGB 채널은 색이 아니라 저장 공간으로도 사용할 수 있다.

Photoshop Channels 패널을 열면 RGB 채널을 각각 따로 볼 수 있다.

일반 컬러 이미지는 R, G, B 채널의 값이 합쳐져 최종 색으로 보인다.
각 채널에서 흰색에 가까운 부분은 높은 값, 검은색에 가까운 부분은 낮은 값을 의미한다.

다만 ORM이나 ERM처럼 채널 패킹에 사용한 텍스처에서는 R, G, B가 화면의 빨강·초록·파랑 비율을 뜻하지 않는다.
각 채널은 머티리얼에서 독립적으로 읽어가는 흑백 데이터이며, 어떤 Material Input에 연결하느냐에 따라 역할이 달라진다.

 

ERM 텍스처로 로고 재질 만들기

이번 작업에서는 로고를 이용해 Emission, Roughness, Metallic 정보를 한 장의 텍스처에 넣는 ERM 텍스처를 제작했다.

여기서 ERM은 다음 구조로 사용했다.

R 채널: Emission Mask
G 채널: Roughness Mask
B 채널: Metallic Mask
 

ERM은 업계 전체에서 고정된 표준 명칭이라기보다, 이번 작업에서 Red에는 Emission, Green에는 Roughness, Blue에는 Metallic을 넣었다는 뜻으로 사용한 파일명이다.
에셋 제작자나 라이브러리에 따라 채널 순서와 파일명은 달라질 수 있으므로, 항상 채널 구성을 직접 확인해야 한다.

먼저 원본 로고 이미지를 4096×4096 크기로 준비했다.

그다음 로고에서 필요한 부분을 각각 분리했다.

  • 글자 부분: Emission
  • 빵 부분: Roughness
  • 외곽선 부분: Metallic

각 부분을 흰색으로 만들고, 나머지 영역은 검은색으로 처리했다.

마스크 텍스처에서는 흰색이 1에 가까운 값, 검은색이 0에 가까운 값으로 사용된다.
회색은 그 사이의 중간값을 뜻하며, 효과를 부분적으로 적용할 때 활용할 수 있다.

그다음 새 문서에서 RGB 채널을 열고 각 마스크를 원하는 채널에 붙여 넣었다.

Red Channel → 글자 Emission Mask
Green Channel → 빵 Roughness Mask
Blue Channel → 외곽선 Metallic Mask
 

채널 작업이 끝난 뒤에는 반드시 RGB 전체 채널을 다시 선택한 뒤 Layers 패널로 돌아와야 최종 이미지가 정상적으로 보인다.

언리얼에서 ERM 텍스처 연결하기

언리얼에 Diffuse 텍스처와 ERM 텍스처를 Import한 뒤 새 머티리얼을 만들었다.

머티리얼 연결은 아래처럼 구성했다.

Diffuse RGB → Base Color

ERM R × Emission Color → Emissive Color
ERM G → Roughness
ERM B → Metallic
 

레벨에 Cube를 배치하고 위에서 생성한 Material을 적용하면 아래와 같이 각각의 부위별로 수치가 적용된 값이 나오는 걸 확인할 수 있다.

글자에 발광 색상 추가하기

ERM 텍스처의 R 채널에는 글자 부분을 위한 Emission Mask가 들어 있다.
이 값을 Vector Parameter인 Emission Color와 Multiply로 연결하면 글자 부분에 원하는 발광 색상을 적용할 수 있다.

위에서 생성한 Material을 부모로 하는 Material Instance를 생성하고, Material Instance에서 Vector Parameter의 RGB 값을 조절해 발광 색상과 강도를 함께 바꿀 수 있다.
RGB 값이 1보다 커지면 Emissive Color의 밝기도 더 강해진다.

 

이번 작업을 통해 텍스처는 단순한 이미지 파일이 아니라, 머티리얼에 전달되는 데이터라는 점을 다시 확인할 수 있었다.

glTF와 FBX의 차이는 단순히 파일 확장자의 차이가 아니었다.
어떤 텍스처가 자동으로 연결되는지, 어떤 정보가 빠지는지, RGB 채널이 어떤 데이터로 사용되는지까지 함께 확인해야 원하는 결과를 만들 수 있다.

특히 ORM과 ERM 같은 채널 패킹 방식은 여러 마스크 정보를 한 장의 텍스처로 관리할 수 있어, 텍스처 수와 머티리얼 그래프를 정리하는 데 도움이 된다.
다만 채널마다 필요한 해상도나 압축 방식이 다르다면 항상 효율적인 것은 아니므로, 같은 용도와 해상도를 공유하는 마스크끼리 묶는 편이 좋다.