AI 기반 PBR Normal Map·Roughness·Metallic 텍스처 자동 생성 파이프라인

단일 알베도 이미지와 마스크를 입력으로 받아 AI 추정 결과를 검증·보정해 PBR Normal Map, Roughness, Metallic 텍스처를 생성하는 실무 파이프라인을 정리합니다.

✓ 복사 완료!
챕터머티리얼 & 텍스처
난이도중급
상태● 검토 완료
대상 엔진
Engine Agnostic
최종 업데이트
AI 기반 PBR Normal Map·Roughness·Metallic 텍스처 자동 생성 파이프라인

핵심 요약

이 글은 AI 추정 → 규칙 기반 마스크 → DCC/엔진 검수 순서로 재질 후보를 검토하는 설계안이다. 이미지에서 추정한 맵은 실측 재질 값과 구분하고 Normal Map의 좌표계와 Roughness·Metallic의 의미를 확인한다. 제작 시간과 품질 변화는 기존 작업과 비교해 측정한다.

AI PBR 텍스처 자동 생성은 무엇을 해결하는가?

이 글은 Base Color, Normal, Roughness, Metallic을 사용하는 금속성 워크플로를 가정한다. 모든 PBR 에셋이 네 텍스처 파일을 각각 요구하는 것은 아니며 상수 값이나 채널 패킹을 사용할 수도 있다. 각 입력의 의미는 Unreal Engine PBR 문서와 대상 셰이더에서 확인한다.

AI 기반 파이프라인의 목적은 재질 후보를 빠르게 생성하고 사람이 승인 가능한 형태로 좁히는 것이다. 생성 결과를 그대로 빌드에 넣는 것이 아니라 오브젝트 분류와 마스크 규칙으로 의미를 고정한 뒤 렌더링에서 확인한다.

flowchart LR
    A[알베도 또는 참조 이미지] --> B[AI 재질 추정]
    B --> C[Height 및 Normal 후보]
    B --> D[Roughness 후보]
    B --> E[재질 분할 마스크]
    E --> F[Metallic 규칙 적용]
    C --> G[DCC 또는 엔진 검수]
    D --> G
    F --> G
    G --> H[압축 및 임포트]

Normal Map은 AI가 어떻게 생성하며 왜 검수가 필요한가?

일반적인 비압축 Normal Map은 법선 방향을 RGB에 인코딩한다. 일부 런타임 포맷은 두 성분만 저장하고 나머지를 복원하므로 압축 후 해석도 확인한다. 이 파이프라인에서는 AI로 Height 또는 Normal 후보를 생성하되 이미지 속 그림자와 하이라이트가 요철로 남았는지 검사한다. 특정 모델의 오류 발생 빈도를 측정한 주장은 아니다.

Height Map을 국소적인 직교 좌표의 높이장 z=s h(x,y)z=s\,h(x,y)로 해석하면 다음 법선을 유도할 수 있다. x,yx,y의 간격과 높이 단위를 맞추며, 곡면 메시의 접선 공간에 적용할 때는 UV 간격·늘어남과 베이크 규약도 확인한다.

n=(−s∂h∂x,−s∂h∂y,1)∥(−s∂h∂x,−s∂h∂y,1)∥\mathbf{n}=\frac{(-s\frac{\partial h}{\partial x},-s\frac{\partial h}{\partial y},1)}{\left\|(-s\frac{\partial h}{\partial x},-s\frac{\partial h}{\partial y},1)\right\|}

여기서 hh는 높이, ss는 높이 변화의 배율이다. 평면 hh의 미분이 0이면 법선은 (0,0,1)(0,0,1)이다. 양수인 ss를 고정했을 때 기울기의 크기가 커지면 법선이 수직 방향에서 더 기울어진다. 이 법선은 텍스처에 저장할 때 대상 채널 인코딩으로 변환한다.

돌 표면의 Height·Normal과 Y 방향 규약 비교를 표현한 설명용 이미지

이미지는 처리 흐름을 설명하기 위한 자료이며 실제 맵 변환의 수치 검증 결과가 아니다. 법선 방향의 일치 여부는 원본 맵과 대상 셰이더로 따로 확인한다.

OpenGL Normal과 DirectX Normal은 무엇이 다른가?

OpenGL·DirectX Normal이라는 이름은 접선 공간 Normal Map의 Y 성분 방향 규약을 구분할 때 쓰인다. Adobe의 포맷 설명처럼 두 관례 간 변환은 녹색 채널 반전으로 처리할 수 있다. 그래픽 API 이름만으로 모든 셰이더의 규약을 결정하지 말고 베이크·임포트 설정을 대조한다. Y 반전은 Y 방향 성분을 바꾸며 모든 요철의 전체 법선을 반전하는 연산은 아니다.

항목OpenGL 방식DirectX 방식
규약 이름Y+Y-
두 관례 간 변환Green 채널을 1 - G로 반전Green 채널을 1 - G로 반전
흔한 증상엔진 규약 불일치 시 음영 반전엔진 규약 불일치 시 음영 반전

Roughness와 Metallic은 왜 AI 결과를 그대로 쓰면 안 되는가?

Roughness는 표면 미세 거칠기에 따른 반사광 분포를 제어한다. 일반적인 마이크로패싯 모델에서 값이 낮으면 반사 로브가 좁고 높으면 넓어진다. 마스크 텍스처는 색상 감마를 적용하지 않는 데이터로 읽되, 셰이더가 입력 값을 BRDF의 거칠기 파라미터로 다시 제곱하는지 등은 별도로 확인한다. 이미지의 조명 패턴을 마스크에 그대로 옮겼다면 실제 조명에서 얼룩을 점검한다.

Metallic은 연속적인 색상 보정 맵보다 금속과 비금속을 구분하는 재질 플래그에 가깝다. 페인트칠된 철판이라면 페인트 영역은 0, 벗겨져 드러난 철 부분만 1 또는 그에 가까운 값으로 둔다. 녹, 먼지, 그림자 때문에 금속값을 회색으로 넓게 퍼뜨리면 재질 정체성이 흐려진다.

맵권장 생성 방식사람이 확인할 항목
NormalAI Height 추정 후 변환조명 잔상, Y축 방향, 강도
RoughnessAI 후보와 색상·마스크 규칙 결합광택 과장, 오염과 재질의 혼동
Metallic세그멘테이션 마스크와 재질 규칙 우선도장면, 녹, 노출 금속 경계

AI PBR 텍스처 자동 생성 파이프라인은 어떻게 구현할까?

1. 입력 이미지를 재질 단서와 조명 단서로 분리한다

촬영 사진과 조명 성분을 제거한 Base Color 후보를 구분해 보관한다. 강한 그림자와 반사 하이라이트가 포함된 입력에서는 이 패턴이 Height·Roughness 후보에 남는지 비교한다. 특정 모델의 오인 확률을 전제하지 않는다.

이 설계안에서는 다음 마스크를 후처리 입력으로 준비한다.

  • 금속 노출부 마스크
  • 도장면 또는 플라스틱 마스크
  • 먼지·녹·습기 같은 오버레이 마스크
  • 라벨, 데칼, 문자처럼 기하 요철로 만들지 않을 영역

2. AI로 Height·Roughness 후보를 생성한다

AI 출력은 최종 맵이 아닌 후보로 저장한다. Height는 저주파 형태와 고주파 미세 디테일을 분리해 보정하고 Roughness는 재질별 기준값에 작은 변조만 더한다.

예를 들어 도장된 금속은 기본 Roughness를 0.35~0.55 범위에서 시작하고 거친 녹은 더 높은 값으로 제한할 수 있다. 이는 절대 규격이 아니라 아트 방향과 라이팅 환경에 맞춰 조정할 출발점이다.

# NumPy 배열 exposed_metal_mask와 noise_mask가 같은 크기로 준비됐다고 가정한다.
# 전자는 0~1, 후자는 -1~1의 유한한 값을 사용한다.
# 아래 코드는 맵 후보의 배합 조각이며 Height→Normal 변환은 구현하지 않는다.
normal_strength = 2.0
roughness_base = 0.45
roughness_variation = 0.08

# Metallic은 AI 연속값보다 승인된 재질 마스크를 우선한다.
metallic = exposed_metal_mask
roughness = roughness_base + noise_mask * roughness_variation

3. Metallic은 규칙 기반으로 확정하고 엔진에서 검수한다

Metallic 맵은 exposed_metal_mask처럼 의미가 분명한 마스크를 우선 사용한다. AI가 생성한 금속 후보는 마스크 초안이나 검수용 레이어로만 쓰고 최종값은 재질 분류 규칙으로 결정한다.

Unreal Engine에서는 Normal 텍스처의 압축 설정과 녹색 채널 방향을 확인하고 Unity에서는 사용하는 셰이더의 Smoothness/Roughness 규약을 확인한다. 아래 반전은 0~1의 같은 지각적 거칠기 정의를 사용하는 경우에 적용한다. Unity의 공식 셰이더 함수는 지각적 거칠기와 BRDF 거칠기를 구분하므로 이미 제곱된 파라미터를 단순 반전하지 않는다.

Smoothness=1−Roughness\text{Smoothness}=1-\text{Roughness}

품질 검수에서 반드시 확인할 체크리스트

  1. 중립 조명에서 본다. 강한 컬러 라이트나 포스트 프로세싱을 끄고 재질 자체의 결함을 먼저 확인한다.
  2. 반사광을 움직인다. 라이트 또는 환경 반사를 움직여 Roughness의 경계와 가짜 Normal 요철을 찾는다.
  3. 재질 경계를 확대한다. 페인트와 노출 금속의 Metallic 경계가 알베도 경계와 논리적으로 맞는지 확인한다.
  4. 밉 레벨을 확인한다. 원거리에서 고주파 Normal과 Roughness 노이즈가 번쩍이거나 뭉개지지 않는지 본다.
  5. 압축 후 다시 본다. BC5 같은 Normal 전용 압축과 채널 패킹 후의 결과가 원본과 다른지 확인한다.

자주 묻는 질문 (FAQ)

AI가 생성한 Metallic Map을 그대로 사용해도 될까?

권장하지 않는다. Metallic은 금속 여부를 나타내는 의미 정보이므로 AI 결과는 초안으로만 쓰고 재질 마스크와 아트 검수로 확정하는 편이 안전하다.

사진 한 장으로 실제 표면 높이를 복원할 수 있을까?

일반적인 사진 한 장만으로 조명·재질·형상을 유일하게 결정할 수는 없다. Barron·Malik의 연구도 단일 이미지의 모호성을 다루기 위해 형상·반사·조명에 대한 사전 조건을 사용한다. 알려진 촬영 조건과 추가 제약이 있는 복원 문제까지 불가능하다는 뜻은 아니다. 실루엣을 바꿔야 하는 큰 형태는 실제 모델링 또는 디스플레이스먼트 검수로 확인한다.

Roughness를 알베도의 밝기로 만들어도 될까?

알베도 밝기를 초안의 입력으로 사용할 수는 있지만 밝기만으로 Roughness를 결정할 수는 없다. Base Color와 미세 거칠기는 서로 다른 재질 입력이므로 재질 유형과 오염 마스크를 기준으로 별도 조정하고 렌더링에서 확인한다.

정리

이 설계안은 Height와 Roughness 후보를 생성하고 Metallic을 재질 마스크로 검수한 뒤 엔진 라이팅과 압축 결과를 확인하는 절차다. 동일한 테스트 에셋으로 반복 수정 횟수와 제작 시간, 승인 품질을 비교해 적용 범위를 정한다.