게임 폰트 SDF 텍스처 아틀라스 AI 자동 생성기 만들기

게임 폰트 제작에서 반복되는 글리프 렌더링과 아틀라스 패킹을 AI와 SDF 파이프라인으로 자동화하는 방법을 설명합니다. Unity·Unreal 적용, 품질 검증, 커널 선택과 실패 원인까지 실무 기준으로 정리합니다.

✓ 복사 완료!
챕터머티리얼 & 텍스처
난이도중급
상태● 검토 완료
대상 엔진
Engine Agnostic
최종 업데이트
게임 폰트 SDF 텍스처 아틀라스 AI 자동 생성기 만들기

핵심 요약

게임 폰트 SDF 텍스처 아틀라스 AI 자동 생성기는 글리프 목록 선정, 폰트 래스터라이징, Signed Distance Field 변환, 아틀라스 패킹, 셰이더 파라미터 생성을 자동화하는 도구입니다. AI는 언어별 글리프 구성과 품질 검사에 활용하고 픽셀 변환과 패킹은 결정론적인 알고리즘으로 처리해야 결과를 재현할 수 있습니다.

핵심 원리는 원본 글리프의 내부와 외부 경계까지의 거리를 텍스처에 저장한 뒤 셰이더에서 임계값과 smoothstep으로 외곽선을 복원하는 것입니다.

게임 폰트 SDF 텍스처 아틀라스는 무엇인가?

일반 비트맵 폰트는 특정 해상도에서 글리프를 픽셀로 굽습니다. 따라서 작은 글자를 확대하면 계단 현상이 생기고 큰 글자를 축소하면 외곽선이 뭉개집니다.

SDF는 각 픽셀이 글리프 경계까지의 거리를 저장하는 방식입니다. 경계 안쪽과 바깥쪽을 서로 다른 부호로 표현하므로 하나의 저해상도 텍스처에서도 비교적 넓은 크기 범위의 글자를 선명하게 렌더링할 수 있습니다.

구성 요소역할
글리프 마스크폰트 파일에서 렌더링한 이진 또는 그레이스케일 이미지
거리장 생성기경계까지의 signed distance 계산
텍스처 아틀라스여러 글리프를 하나 이상의 페이지에 배치
메트릭 데이터베어링, 어드밴스, 평면 영역, UV 정보 저장
폰트 셰이더거리값을 알파와 외곽선으로 변환

SDF의 거리 함수는 다음처럼 정의할 수 있습니다. 여기서 Ω는 글리프 내부 영역이고 ∂Ω는 글리프 경계입니다.

d(p)=s(p)minq∈∂Ω∣∣p−q∣∣d(p)=s(p) min_{q ∈ ∂Ω} ||p-q||

p가 글리프 내부라면 s(p)를 양수로 외부라면 음수로 두는 방식이 일반적입니다. 이 거리를 spread 범위에 맞춰 텍스처 채널의 0부터 1 사이 값으로 변환합니다.

a(p)=clamp(0.5+d(p)/(2R),0,1)a(p)=clamp(0.5+d(p)/(2R),0,1)

여기서 R은 경계 주변에 저장할 거리 범위입니다. 경계 자체는 대체로 0.5에 해당합니다.

폰트 글리프 마스크에서 SDF 텍스처 아틀라스로 변환되는 생성 파이프라인

SDF와 MSDF는 어떻게 다른가?

단순한 SDF는 한 픽셀에 하나의 거리값만 저장합니다. 곡선이나 둥근 모서리에는 강하지만 좁은 각도와 교차하는 선에서는 모서리가 둔해질 수 있습니다.

MSDF는 서로 다른 경계 방향을 RGB 채널에 나눠 저장합니다. 셰이더에서 세 채널의 중간값을 사용하면 작은 글자와 날카로운 모서리를 더 안정적으로 표현할 수 있습니다.

방식저장 채널장점주의점적합한 대상
SDF1채널메모리와 셰이더가 단순함날카로운 모서리 왜곡 가능HUD, 일반 UI, 큰 제목
MSDFRGB 3채널모서리와 작은 글자에 강함생성과 셰이더가 복잡함작은 UI 글자, 로고, 아이콘 폰트
비트맵1채널 또는 RGBA원본 모양을 그대로 재현확대와 축소에 취약함픽셀 아트, 고정 해상도 UI

AI 자동 생성기에서는 글꼴 전체를 무조건 SDF로 처리하기보다 글리프의 각도와 최소 획 두께를 분석해 SDF와 MSDF를 선택하도록 구성하는 편이 좋습니다.

AI 자동 생성기는 어떤 작업을 맡아야 하는가?

AI가 글리프 픽셀을 직접 그리게 하면 같은 입력에서도 결과가 달라지거나 기존 폰트의 형태와 메트릭이 변할 수 있습니다. 게임 폰트에서는 문자 형태의 일관성과 라이선스 준수가 중요하므로 AI는 다음과 같은 보조 작업에 집중하는 것이 안전합니다.

  • 입력 언어와 UI 텍스트 코퍼스에서 필요한 유니코드 글리프 목록 추천
  • 빈도 기반으로 아틀라스 우선순위 계산
  • 글리프 누락, 대체 폰트 사용, 비정상 베어링 탐지
  • SDF와 MSDF 중 적합한 거리장 방식 추천
  • 목표 플랫폼의 텍스처 크기와 페이지 수에 맞춘 패킹 설정 제안
  • 여러 해상도에서 렌더링한 결과의 품질 비교
  • 생성 로그와 재현 가능한 설정 파일 작성

반대로 다음 단계는 결정론적인 코드로 고정해야 합니다.

  • FreeType 2 또는 동등한 폰트 래스터라이저를 사용한 글리프 생성
  • HarfBuzz를 사용한 복합 문자 셰이핑
  • 정확한 Euclidean Distance Transform 또는 GPU Jump Flooding Algorithm
  • MaxRects, Skyline, Guillotine과 같은 아틀라스 패킹
  • 글리프 메트릭과 UV 좌표 저장
  • 텍스처 압축과 색공간 설정

이 구조를 사용하면 AI가 추천한 설정을 사람이 검토할 수 있고 동일한 폰트와 설정으로 언제든 결과를 다시 만들 수 있습니다.

SDF 글리프 아틀라스를 어떻게 생성할까?

1단계: 입력 설정과 글리프 매니페스트를 만든다

생성기는 다음 입력을 받는 것이 좋습니다.

설정예시설명
폰트 파일NotoSansKR-Regular사용 권한이 확인된 원본 폰트
언어ko-KR기본 글리프 범위와 셰이핑 규칙 결정
기준 해상도64 px거리장 생성에 사용할 em 기준 크기
spread8 px경계 주변의 거리 저장 범위
글리프 패딩10 px이웃 글리프와의 거리 확보
최대 아틀라스2048 × 2048플랫폼별 텍스처 제한
채널 모드SDF 또는 MSDF글리프 모양과 목표 크기에 따라 선택

한국어처럼 글리프 수가 많은 언어는 유니코드 전체를 한 번에 넣지 않는 것이 좋습니다. 실제 UI 문자열, 메뉴, 튜토리얼, 오류 메시지를 수집한 뒤 필수 문자와 빈도순 문자를 분리하면 아틀라스 페이지 수를 줄일 수 있습니다.

단, AI가 추천한 글리프 목록은 반드시 폰트의 실제 지원 여부와 Unicode 코드 포인트로 검증해야 합니다. 한국어 음절을 임의로 조합하거나 누락된 문자를 비슷한 모양의 문자로 대체하면 현지화 품질이 떨어집니다.

2단계: 셰이핑 후 글리프를 래스터라이즈한다

라틴 문자는 단순한 코드 포인트 목록으로 처리할 수 있지만 아랍어, 인도계 문자, 일부 동아시아 입력은 문자 순서와 위치에 따라 글리프가 달라집니다. 따라서 먼저 HarfBuzz로 텍스트를 셰이핑하고 결과로 나온 glyph ID를 기준으로 FreeType 래스터라이징을 수행합니다.

manifest = ai_suggest_manifest(language=ko_KR, corpus=ui_texts)
manifest = unicode_validate(manifest, font)
shaped = harfbuzz_shape(manifest, font)

for glyph_id in unique(shaped.glyph_ids):
    mask = freetype_rasterize(font, glyph_id, em_size=64)
    sdf = signed_distance(mask, spread=8)
    atlas.place(sdf, padding=10)

write_metrics(atlas, shaped)

실제 구현에서는 글리프 이미지와 함께 다음 메트릭을 저장해야 합니다.

  • glyphId
  • atlasPage
  • atlasBounds
  • planeBounds
  • advance
  • bearing
  • lineHeight
  • kerning 또는 셰이핑 결과에 필요한 보정값

텍스처만 저장하고 어드밴스와 베어링을 버리면 셰이더는 글자를 표시할 수 있어도 글자 간격과 기준선이 틀어집니다.

3단계: signed distance를 계산하고 정규화한다

거리장 계산에는 CPU 기반 정확한 거리 변환과 GPU 기반 Jump Flooding Algorithm을 사용할 수 있습니다.

방식장점단점
정확한 거리 변환결과 품질과 재현성이 높음많은 글리프 처리 시 CPU 비용 증가
Jump Flooding AlgorithmGPU 병렬 처리에 적합구현과 경계 보정이 필요함
근사 거리 전파빠른 미리보기에 유리작은 모서리에서 오차가 커질 수 있음

게임 에셋 빌드 파이프라인이라면 최종 출력에는 정확한 거리 변환을 사용하고 에디터 미리보기에는 GPU 근사 방식을 사용하는 구성이 실용적입니다.

spread가 너무 작으면 외곽선과 그림자 표현 범위가 부족합니다. 반대로 너무 크면 동일한 아틀라스 크기에 들어가는 글리프 수가 줄고 작은 글자에서 유효한 해상도가 낮아집니다. 초기값으로 기준 해상도 64 px와 spread 8 px를 사용할 수 있지만 프로젝트의 최소 글자 크기와 셰이더 효과 범위에 맞춰 샘플 테스트가 필요합니다.

4단계: 아틀라스를 패킹하고 페이지를 분리한다

패커는 글리프의 실제 이미지 영역뿐 아니라 SDF 패딩까지 고려해야 합니다. MaxRects는 다양한 크기의 글리프를 비교적 효율적으로 배치하기 쉽고 Skyline은 빠른 순차 패킹에 유리합니다.

아틀라스가 가득 차면 무리하게 글리프를 축소하지 말고 여러 페이지로 분리하는 편이 안전합니다. 런타임 폰트 시스템에는 다음과 같은 페이지 조회 정보가 필요합니다.

code point → glyph id → atlas page → UV rectangle → plane metrics

패딩은 최소한 spread와 필터링 여유를 포함해야 합니다. 밉맵을 사용한다면 인접 글리프의 색이 섞이지 않는지 확인하고 페이지 가장자리에 클램프 영역을 추가해야 합니다.

SDF 아틀라스의 글리프 패딩과 UV 메트릭을 확인하는 디버그 뷰

SDF 셰이더는 어떻게 구현할까?

SDF 텍스처에서는 보통 0.5를 경계로 사용합니다. 내부를 양수로 저장했다면 샘플 값이 0.5보다 클 때 글리프가 나타납니다.

float sdf = SAMPLE_TEXTURE2D(_FontAtlas, sampler_FontAtlas, uv).r;
float alpha = smoothstep(_Threshold - _Softness, _Threshold + _Softness, sdf);
return float4(_Color.rgb, _Color.a * alpha);

_Softness는 화면 해상도와 텍스처 미분값을 반영해 동적으로 조정하는 것이 좋습니다. 고정된 값만 사용하면 카메라 확대와 축소에 따라 글자가 지나치게 흐려지거나 깨질 수 있습니다.

외곽선은 두 번째 임계값을 사용해 만들 수 있습니다.

float fill = smoothstep(_FillEdge - _Softness, _FillEdge + _Softness, sdf);
float outline = smoothstep(_OutlineEdge - _Softness, _OutlineEdge + _Softness, sdf);
float3 color = lerp(_OutlineColor.rgb, _Color.rgb, fill);
float finalAlpha = max(fill, outline) * _Color.a;
return float4(color, finalAlpha);

MSDF를 사용할 때는 RGB 세 채널의 중간값을 구한 뒤 동일한 방식으로 임계값을 적용합니다.

float3 sampleValue = SAMPLE_TEXTURE2D(_FontAtlas, sampler_FontAtlas, uv).rgb;
float medianValue = max(min(sampleValue.r, sampleValue.g), min(max(sampleValue.r, sampleValue.g), sampleValue.b));
float alpha = smoothstep(_Threshold - _Softness, _Threshold + _Softness, medianValue);

Unity에서는 TextMeshPro의 SDF 셰이더와 메트릭 구조에 맞추거나 커스텀 UI 셰이더를 만들 수 있습니다. Unreal Engine에서는 Slate 또는 UMG의 폰트 렌더링 방식과 충돌하지 않도록 커스텀 머티리얼에 아틀라스 UV와 글리프 메트릭을 연결해야 합니다. 엔진이 관리하는 폰트 아틀라스를 대체할 때는 런타임 캐시와 폴백 폰트 정책도 함께 확인해야 합니다.

생성 품질은 무엇으로 검증하는가?

AI 자동화에서 가장 중요한 부분은 생성 버튼이 아니라 실패를 발견하는 검증 단계입니다. 다음 검사를 자동화하면 사람이 모든 글리프를 직접 확인할 필요가 줄어듭니다.

  1. 원본 마스크와 SDF를 임계값으로 복원한 결과의 경계 오차를 비교합니다.
  2. 목표 최소 크기, 기준 크기, 최대 크기에서 글리프를 렌더링합니다.
  3. 얇은 획, 점, 받침, 복합 문자, 숫자와 기호를 별도 샘플로 검사합니다.
  4. 아틀라스 경계와 패딩에서 이웃 글리프 색이 번지는지 확인합니다.
  5. 선형 필터링과 밉맵 적용 상태에서 UV 누출을 검사합니다.
  6. 폰트 메트릭을 적용한 실제 문장으로 기준선과 자간을 확인합니다.

검증 결과는 단순한 성공 여부보다 다음 데이터를 남기는 것이 좋습니다.

지표의미
경계 오차복원된 외곽선이 원본 마스크와 얼마나 다른지 나타냄
누락 글리프 수폰트에 없거나 매니페스트에서 처리하지 못한 문자 수
페이지 수런타임 텍스처 바인딩과 메모리 비용에 영향
최소 유효 획 두께작은 크기에서 사라지는 획의 기준
UV 누출 검출 수패딩과 필터링 설정의 문제를 나타냄
렌더링 시간CI 또는 에셋 빌드 파이프라인 비용

AI 비전 모델을 품질 검사에 사용할 수도 있지만 최종 판정은 픽셀 비교, 글리프 메트릭 검증, 허용 오차 기준으로 결정하는 것이 좋습니다. 시각 모델은 누락된 점이나 비정상적인 모양을 우선순위화하는 보조 역할에 적합합니다.

자주 묻는 질문 FAQ

SDF 아틀라스는 모든 게임 폰트에 적합한가?

아닙니다. 픽셀 아트처럼 고정 해상도 표현이 중요한 폰트에는 비트맵이 더 적합할 수 있습니다. 작은 글자와 날카로운 모서리가 중요하면 MSDF를 검토해야 합니다.

AI가 폰트 글리프를 직접 생성해도 되는가?

기존 폰트의 형태와 메트릭을 유지해야 하는 프로젝트라면 권장하지 않습니다. AI는 글리프 목록 추천, 패킹 설정, 이상 탐지에 사용하고 실제 거리장 생성은 결정론적인 알고리즘으로 처리하는 편이 안전합니다.

spread와 패딩은 어떻게 정하는가?

spread는 셰이더에서 필요한 외곽선과 그림자 범위를 기준으로 정합니다. 패딩은 spread보다 충분히 크게 두고 선형 필터링과 밉맵을 적용한 상태에서 인접 글리프 누출을 테스트해야 합니다.

정리

게임 폰트 SDF 텍스처 아틀라스 자동 생성기는 AI가 모든 이미지를 대신 만드는 도구가 아니라 글리프 선택과 품질 관리부터 거리장 생성과 엔진 연결까지 반복 작업을 표준화하는 에셋 파이프라인에 가깝습니다.

가장 안정적인 구조는 AI 추천 및 검사 → Unicode·폰트 검증 → HarfBuzz 셰이핑 → FreeType 래스터라이징 → SDF 또는 MSDF 생성 → 아틀라스 패킹 → 엔진 셰이더 검증의 순서입니다. 이 흐름을 지키면 폰트 품질과 빌드 재현성을 함께 확보할 수 있습니다.