노멀맵 OpenGL·DirectX 판별 · 초록 채널
볼록한 부분이 오목하게 보이거나 빛이 반대쪽에서 오는 것처럼 보이면, 노멀맵의 초록(G) 채널 규약이 엔진과 다른 경우가 대부분입니다. Godot와 유니티는 OpenGL 방식(Y+), 언리얼은 DirectX 방식(Y−)을 씁니다. 파일 이름이나 눈대중으로는 의외로 자주 틀립니다.

- Godot 4 2D lights검증됨· Godot 4.7.2
- Unity 6 URP 2D검증됨· Unity 6000.5.3f1 (URP 17.5)
- PNG set + JSON일반 파일
이렇게 작동합니다
- 검사 패널은 표면 자체로 규약을 잽니다. OpenGL로 읽었을 때 실제 표면의 기울기는 서로 맞아떨어져야 하고, DirectX 맵은 이를 측정 가능한 방식으로 깨뜨립니다.
- 스프라이트에서는 실루엣으로 독립된 두 번째 검사를 합니다. 가장자리의 노멀은 바깥을 향해야 하며, 두 검사가 일치하면 신뢰도가 올라갑니다.
- 판정마다 신뢰도와 근거를 보여 줍니다. 대각선 굴곡이 없는 평평한 맵은 추측 대신 판정을 내리지 않고, “OpenGL입니다/DirectX입니다”를 누르기 전에는 아무것도 바뀌지 않습니다.
- 스프라이트에서는 뒤집힌 빨강(R) 채널도 찾아 “Flip red (X−)”로 고칩니다. 투명한 가장자리가 없는 텍스처에서는 빨강과 초록을 구분할 수 없으며, 패널이 그렇게 알려 줍니다.
- 두 규약 모두 내보냅니다. PNG 세트에 _n(OpenGL)과 _n_dx(DirectX), 또는 한쪽만 담은 노멀맵 PNG 하나.
사용 방법
- 텍스처 작업 공간에 그림과 그 노멀맵을 넣습니다.
- 노멀 맵 패널에서 소스를 가져온 노멀맵으로 정합니다.
- 검사 패널에서 판정, 신뢰도, 근거를 읽습니다.
- “OpenGL입니다” 또는 “DirectX입니다”를 누르고(표시되면 Flip red도), C로 평면과 조명을 비교합니다.
- 엔진이 읽는 규약으로, 또는 두 가지가 다 든 PNG 세트로 내보냅니다.
엔진별로 쓸 노멀맵
| 엔진·출처 | 초록 규약 | Studio에서 쓸 파일 |
|---|---|---|
| Godot 4 | OpenGL (Y+) | _n.png 또는 Godot 4 번들(CanvasTexture와 조명 씬) |
| 유니티(URP 2D) | OpenGL (Y+) | _n.png 또는 Unity 6 번들(Secondary Texture _NormalMap) |
| 언리얼 엔진 | DirectX (Y−) | _n_dx.png |
| ambientCG 다운로드 | NormalGL = OpenGL, NormalDX = DirectX | Godot·유니티에는 NormalGL |
| 출처를 모르는 맵 | 검사 패널에서 측정 | 판정을 확정한 뒤 원하는 쪽으로 내보내기 |
| 빨강이 반대인 스프라이트 맵 | 빨강 뒤집힘(X−) | Flip red (X−) 후 내보내기 |
엔진별 내보내기와 검증 방법
"검증됨"은 실제 CC0 에셋으로 내보낸 파일을 해당 엔진·도구가 직접 불러와 원본과 비교했다는 뜻입니다. 불러오지 않은 형식은 그렇게 표시합니다.
| 대상 | 파일 | 검증 |
|---|---|---|
| Godot 4 2D lights | _lit.tscn · CanvasTexture .tres · normal / specular PNG | 검증됨 Godot 4.7.2실제 CC0 사례 6개를 Godot(gl_compatibility)가 렌더링했고, 확인한 모든 프레임이 Studio 조명 미리보기와 1/255 이내로 같았습니다. 초록을 뒤집은 같은 렌더는 3.8~37단계 어긋나므로 잘못된 규약을 잡아낼 수 있습니다. |
| Unity 6 URP 2D | PNG · nerulio-texture.json · Editor/NerulioNormalMapImporter.cs | 검증됨 Unity 6000.5.3f1 (URP 17.5)12회 중 12회 통과(사례 6개 × 감마·리니어 색 공간): URP가 적용한 조명이 내보낸 노멀맵과 일치합니다(평균 오차 0.0037~0.0085). 빛의 감쇠는 URP 방식이라 밝기는 미리보기가 아니라 Unity 기준입니다. |
| PNG set + JSON | albedo · _n (OpenGL) · _n_dx (DirectX) · 16-bit height · AO · specular · manifest | 일반 파일어떤 엔진이나 도구에서도 쓰는 일반 파일이며, 엔진 실행 검증은 주장하지 않습니다. |
검증 근거
Godot 4.7.2가 실제 CC0 사례 6개(도트, HD 스프라이트, 반복 텍스처, 가져온 DirectX 맵)를 렌더링했고 확인한 모든 프레임이 Studio 미리보기와 1/255 이내였습니다. Unity 6000.5 URP 2D: 12회 중 12회 통과(사례 6개 × 감마·리니어). 규약을 아는 실제 맵으로 OpenGL/DirectX 판별: 1K 전체 맵 128개 100% 정답, 표본 1,562개 중 틀린 "높음" 판정 0건(초록이 밝으면 OpenGL이라는 단순 규칙은 46%).
한계
- 투명한 가장자리가 없는 그림(반복 텍스처)에서는 빨강이 뒤집힌 것과 DirectX 초록을 구별할 수 없습니다. 점검 패널이 이를 알리고 "빨강 뒤집기"를 제공합니다.
- 시트는 스프라이트 작업 공간에서 프레임을 자르기 전까지 그림 하나로 조명됩니다. 텍스처 작업 공간은 프레임을 자르지 않습니다.
- 림 라이트는 미리보기 전용이며, Unity로는 스페큘러 맵을 내보내지 않습니다(Godot는 내보냄).
- Unity는 자체 빛 감쇠를 씁니다. 내보낸 노멀맵은 Unity에서 검증했지만 밝기 곡선은 Unity 방식입니다.
자주 묻는 질문
Godot, 유니티, 언리얼은 어느 규약인가요?
Godot와 유니티는 OpenGL 방식(Y+), 언리얼은 DirectX 방식(Y−)입니다. Studio의 Godot 4·Unity 6 내보내기는 OpenGL로 쓰며, Godot 4.7.2와 Unity 6000.5.3f1에서 예상대로 조명되는 것을 확인했습니다.
판별은 얼마나 정확한가요?
규약을 아는 실제 맵으로 쟀습니다. 1K 맵 128장 100 %, 256² 조각은 판정을 낸 것 중 100 %(99.2 %에 판정), 64² 조각 99.6 %, 스프라이트 프레임 213장 100 %. 1,562개 표본에서 틀린 “높음” 판정은 0건입니다. “초록이 밝으면 OpenGL” 같은 단순 규칙은 46 %였습니다.
DirectX인 걸 이미 알면 초록만 뒤집으면 되나요?
네. 아래 링크한 기존 텍스처 랩 페이지가 초록을 한 번에 뒤집습니다. 검사 패널은 확신이 없는 파일용이고, 바꾸기 전에 조명 결과부터 보여 줍니다.
빨강이 뒤집혔다고 나오는 이유는?
빨강을 반대로 쓰는 생성기가 있습니다(NormalMap-Online 기본 출력이 그렇습니다). 스프라이트는 실루엣으로 빨강을 따로 재므로, 판정은 초록 기준이고 빨강은 따로 보고하며 신뢰도는 “중간”까지만 냅니다.
무료인가요? 계정이 필요한가요?
이 페이지의 기능은 모두 무료이며 계정 없이 쓸 수 있습니다. 워터마크나 막혀 있는 내보내기가 없습니다.
스프라이트가 업로드되나요?
아니요. Studio는 이 브라우저 탭 안에서 디코딩·패킹·내보내기를 합니다. 프로젝트는 브라우저(IndexedDB)에 자동 저장되며 .nerulio 파일로 저장할 수 있습니다.
Aseprite나 엔진 플러그인을 설치해야 하나요?
아니요. .aseprite 파일은 브라우저에서 읽고 씁니다. 엔진별 번들에는 그 엔진에 필요한 것이 들어 있습니다(Godot는 가져오기 설정과 씬, Unity와 Godot 타일셋은 작은 편집기 스크립트).