본문으로 건너뛰기

PBR 텍스처 검사기 · 이름·크기·누락 맵 점검

텍스처 랩 점검 단계에 초점을 맞춘 화면입니다. 보통 가져온 뒤에야 알게 되는 문제를 파일별로, 그것을 찾아낸 측정값과 함께 보고합니다.

PBR 검사기는 가져오기 전에 텍스처 세트를 점검합니다. 맵마다 역할이 있는지, 모든 맵의 크기가 같은지, 고른 워크플로의 필수·권장 맵이 있는지, 크기가 2의 거듭제곱인지, 회색 맵이 정말 회색인지, 노멀맵이 정말 단위 벡터로 디코딩되는지 확인합니다. 머티리얼 하나의 맵을 넣으면 파일 이름(_basecolor, _normal, _roughness, _ORM 등)으로 역할을 정하고, 워크플로를 고르면 문제마다 파일과 측정값이 나옵니다. JSON 보고서에 측정값이 남으며 파일 이름이나 내용은 바꾸지 않습니다.

텍스처 맵을 끌어다 놓으세요(PNG는 채널 바이트를 그대로 유지)
브라우저에서 처리하며 파일은 업로드되지 않습니다.
텍스처 랩: CC0 텍스처로 만든 노멀맵과 OpenGL/DirectX 규약 표시
CC0 에셋(ambientCG)을 연 실제 텍스처 랩 화면입니다.
출력
  • Channel PNGs측정 확인· numpy
  • Normal map측정 확인· numpy
  • Packed mask / ORM측정 확인· Pillow
  • Engine import미검증

무엇을 어떤 기준으로 점검하나

이름으로 정하는 역할. 파일 이름을 소문자로 바꾸고 구분자를 _로 통일한 뒤, 더 구체적인 것부터 처음 맞는 토큰을 씁니다. 패킹(orm·arm·rma·mra·maskmap·mask), 알베도(albedo·basecolor·diffuse·color 등), 노멀(normalgl·normaldx·normal·nrm·n), 러프니스, 스무스니스(gloss), 메탈릭, AO(ao·occlusion·ambientocclusion), 하이트(height·displacement·bump), 에미션, 불투명도, 스페큘러 순입니다. 한두 글자 토큰(_n·_m·_r)은 신뢰도 낮음으로 봅니다. 역할은 모두 선택 상자라서 파일 이름을 바꾸지 않고 잘못된 추측을 고치면 됩니다.

누락은 워크플로가 정합니다. 개별 맵(glTF·공통): 알베도 필수, 노멀·러프니스·메탈릭 권장. Unity HDRP: 알베도와 마스크 맵 필수, 노멀 권장. Unity URP: 알베도 필수, 노멀·메탈릭 권장. Godot ORM·Unreal ORM: 알베도 필수, 노멀과 ORM 텍스처 권장이며, 러프니스와 메탈릭은 있는데 ORM이 없으면 그냥 "누락" 대신 "패킹 가능"이 나옵니다. 러프니스 맵은 스무스니스를, 스무스니스 맵은 러프니스를 대신합니다.

추측이 아니라 측정. 단일 채널 역할(러프니스·메탈릭·AO·하이트·불투명도)이 RGB로 저장돼 있을 때, 어느 텍셀도 채널 차이가 2를 넘지 않으면 "RGB로 저장된 회색", 넘으면 "채널이 서로 다름"(패킹된 것일 가능성)으로 보고합니다. 노멀맵은 텍셀마다 디코딩해, 길이가 1에서 0.12보다 멀면 단위 밖 샘플로 셉니다. 단위 밖이 1% 이하이고 파랑이 128 미만(표면 안쪽을 향하는 벡터)인 곳이 없어야 통과입니다. 다른 역할로 지정됐는데 노멀맵 시험(단위 밖 5% 이하, 음의 파랑 0.1% 이하)을 통과하면 "노멀맵처럼 보임"으로 알립니다.

2의 거듭제곱은 오류가 아니라 경고입니다. glTF 2.0은 샘플러가 반복하거나 밉맵을 쓸 때, 지원이 제한된 플랫폼에서는 2의 거듭제곱이 아닌 텍스처의 크기를 바꾸는 것이 좋다(SHOULD)고 하고, Unity 임포터에는 그런 텍스처의 크기를 조정하는 Non Power of 2 옵션이 있습니다. 중요한지는 대상에 따라 다르므로 검사기는 알리기만 하고 판단은 맡깁니다.

워크플로
엔진 머티리얼이 기대하는 맵 구성(패킹 방식 포함).
세트 이름
파일 이름에서 역할 토큰을 뺀 나머지. 한 번에 넣은 파일의 세트 이름이 다르면 "이름 불일치"가 나옵니다.
단위 밖 샘플
디코딩한 노멀의 길이가 1과 0.12보다 더 차이 나는 샘플.
2의 거듭제곱
2ⁿ 픽셀 크기: 256, 512, 1024, 2048 …

예시: Godot 4 ORM으로 점검한 바위 세트

PNG 네 장을 함께 넣고 워크플로를 Godot 4 ORM으로 골랐을 때 검사기가 돌려주는 결과입니다.

rock_basecolor.png   2048 × 2048   albedo
rock_normal.png      2048 × 2048   normal
rock_roughness.png   1000 × 1000   roughness
rock_metallic.png    2048 × 2048   metallic

error  dimension-mismatch    2048x2048 대 1000x1000 (rock_roughness.png)
warn   missing-recommended   orm
info   pack-available        roughness + metallic → Godot 4 ORM 프리셋
warn   not-power-of-two      rock_roughness.png 1000 × 1000

세트 통과: 아니요 (오류 1)

러프니스를 2048 × 2048로 다시 내보내면 오류와 2의 거듭제곱 경고가 함께 사라집니다. 마스크 패커에서 러프니스와 메탈릭(AO가 있으면 AO도)을 패킹하면 "orm 누락"도 사라집니다.

이렇게 작동합니다

  • 워크플로별 필수·권장 맵, "패킹 맵의 구성 요소가 이미 있음".
  • 크기 불일치, 2의 거듭제곱 아님(선택적으로 정사각형 아님), 분류 안 되거나 일관되지 않은 이름.
  • 측정한 사실: 예상 밖 알파, 알파 0 아래의 RGB, RGB로 저장된 회색 맵, RGB가 서로 다른 단일 채널 맵.
  • 텍스처별 측정값이 든 Game Labs 형식 JSON 보고서.

사용 방법

  1. 머티리얼의 맵들을 끌어다 놓습니다.
  2. 워크플로를 고릅니다.
  3. 문제 목록을 읽습니다.
  4. JSON 보고서를 받습니다.

결과 확인

  • 고친 뒤 새 파일을 넣고 같은 워크플로를 유지합니다. 오류와 경고가 없으면 요약에 ✓가 나옵니다.
  • texture-report.json을 받아 issues를 봅니다. 항목마다 id·level·파일·수치(크기, maxDeviation, ratio, minBlue)가 있습니다.
  • 노멀맵은 normalCheck.meanLength가 1에 가깝고 blueNonNegative가 true여야 합니다.

문제 해결

증상유력한 원인확인 방법해결
아는 파일인데 unclassified이름에 아는 토큰이 없거나(rock_03.png) 영어 목록에 없는 토큰역할 칸이 알 수 없음으로 표시됨선택 상자에서 역할을 고르기. 보고서에도 그 선택이 남음
노멀맵에 duplicate-role한 다운로드의 _NormalGL과 _NormalDX를 둘 다 넣음역할이 노멀인 파일이 두 개엔진이 기대하는 쪽만 남기기(Unity·Godot는 GL). 다른 쪽만 있으면 노멀맵 변환기로 변환
러프니스·메탈릭 파일에 gray-channels-differ이름은 단일 맵인데 실제로는 패킹 텍스처(또는 색이 든 미리보기)문제 항목에 가장 큰 채널 차이와 차이 나는 텍셀 비율이 나옴역할을 패킹 맵으로 바꾸거나 채널 분리기로 분리
하이트·범프 파일에 looks-like-normal노멀맵을 _bump로 저장해 이름 규칙이 하이트로 읽음단위 길이와 파랑 시험을 통과함역할을 노멀로 바꾸기
normal-blue-negative나 normal-not-unit탄젠트 공간 노멀맵이 아님(하이트·오브젝트 공간 맵, 또는 색처럼 크기를 바꾼 맵)문제 항목에 minBlue와 단위 밖 비율이 나옴맞는 파일을 쓰거나 노멀맵 생성기로 하이트에서 만들기
러프니스·메탈릭·AO 맵에 unexpected-alpha내보내기 프로그램이 엔진이 읽지 않을 알파를 붙임문제 항목에 가장 낮은 알파와 알파 0 텍셀 수가 나옴알파 없이 다시 내보내기. 알파 0 아래 색은 랩이 유지하지만 대부분의 엔진은 무시함

다른 방법

방법이럴 때 더 낫습니다
텍스처 랩 전체점검에서 나온 문제를 고치는 것까지 필요할 때: 노멀 변환, 채널 분리·패킹, 가장자리 번짐, 크기 변경, 일괄 내보내기.
엔진에서 점검하기머티리얼 하나, 엔진 하나일 때. 가져오기 설정과 빈 슬롯은 머티리얼 인스펙터에서 보이지만, 크기·RGB로 저장된 회색·노멀 유효성은 거기서 측정되지 않습니다.

출력 파일과 검증 방법

"측정 확인"은 내려받은 파일을 페이지 밖에서(Pillow·numpy·별도 파서) 다시 열어 그 속성을 측정했다는 뜻입니다. 게임 엔진에서 불러오는 것은 시험하지 않았습니다.

대상파일검증
Channel PNGs<name>-r/g/b/a.png (8-bit grey)측정 확인 numpy채널마다 바이트가 같고 완전히 투명한 텍셀 아래의 RGB도 유지됩니다.
Normal mapPNG · OpenGL (+Y) or DirectX (−Y)측정 확인 numpy디코딩한 벡터가 단위 길이(최대 오차 0.0002)이고, OpenGL과 DirectX는 초록 채널만 다릅니다.
Packed mask / ORMUnity HDRP mask · URP metallic · ORM (glTF, Godot)측정 확인 Pillow패킹된 바이트 확인: ORM 프리셋, AO 10 / 러프니스 80 / 메탈릭 220 → (10, 80, 220, 255).
Engine importUnity · Unreal · Godot미검증어떤 엔진에서도 불러오지 않았습니다.

검증 근거

채널 분리가 네 채널 모두 바이트 동일(최대 차이 0), 투명 텍셀 2048개가 RGB 유지. 가장자리 번짐은 알파 0인 텍셀 448개만 바꾸고 알파 바이트는 하나도 건드리지 않음. OpenGL ↔ DirectX는 초록(255 − g)만 다름. 변환한 노멀은 단위 벡터.

한계

  • 색 공간은 감지하지 않습니다. ICC 프로필이나 감마를 읽지 않고, 엔진이 역할별로 sRGB와 리니어 중 무엇을 기대하는지와 PNG에 sRGB 청크가 있는지만 알립니다.
  • 노멀맵의 OpenGL·DirectX 규약은 여기서 감지하지 않습니다. 감지기는 Studio 텍스처 작업 공간에 있습니다.
  • 이름 규칙은 영어 토큰만 알며, 파일 이름은 절대 바꾸지 않습니다.
  • 보고서는 일반 JSON이며 엔진이 가져가는 형식이 아닙니다.
  • 정확한 채널 바이트는 PNG에서만 보장됩니다. JPEG·WebP는 브라우저가 디코딩하며 "바이트 동일 아님"으로 표시합니다.
  • 인터레이스 PNG와 16비트 출력은 지원하지 않습니다. 정확 경로는 3,355만 픽셀까지입니다.
  • 노멀맵의 규약은 픽셀로 알아낼 수 없고 변환만 할 수 있습니다.
  • Unity·Unreal·Godot에서 불러오지 않았습니다. 채널 순서는 각 문서와 엔진 소스에 근거합니다.

버전과 출처

점검 보고서는 텍스처 랩에서 확인했습니다(docs/TEXTURE-LAB.md): schemaVersion 1, engineTarget generic, 시험 파일과 같은 alpha.zeroPixels = 2048, exactChannels true. JPEG 입력은 exactChannels: false. 이 페이지의 수치는 src/game/texture-set.js와 src/game/texture-normal.js의 기준값입니다.

참고한 공식 문서

자주 묻는 질문

어떤 워크플로를 지원하나요?

개별 맵의 메탈릭/러프니스와 랩 프리셋의 패킹 배치(Unity HDRP 마스크·URP 메탈릭·Godot·Unreal ORM)입니다. 스페큘러/글로스 워크플로는 없습니다.

파일 이름을 바꿔 주나요?

아니요. 일관되지 않은 이름을 알려 줄 뿐이며 바꾸는 것은 직접 하세요.

무료인가요? 계정이 필요한가요?

이 페이지의 기능은 모두 무료이며 계정 없이 쓸 수 있습니다. 워터마크나 막혀 있는 내보내기가 없습니다.

스프라이트가 업로드되나요?

아니요. Studio는 이 브라우저 탭 안에서 디코딩·패킹·내보내기를 합니다. 프로젝트는 브라우저(IndexedDB)에 자동 저장되며 .nerulio 파일로 저장할 수 있습니다.

Aseprite나 엔진 플러그인을 설치해야 하나요?

아니요. .aseprite 파일은 브라우저에서 읽고 씁니다. 엔진별 번들에는 그 엔진에 필요한 것이 들어 있습니다(Godot는 가져오기 설정과 씬, Unity와 Godot 타일셋은 작은 편집기 스크립트).