DDS 텍스처 검사기
브라우저에서 .dds 텍스처를 엽니다. 헤더 플래그, BC1~BC7 픽셀 포맷, 밉 체인 크기와 오프셋, 큐브 면, 그리고 디코딩한 미리보기까지 보여 줍니다.
사용법
- .dds 파일을 상자에 놓으세요. 포토샵, NVIDIA Texture Tools, texconv, Compressonator에서 내보낸 것이든 게임 아카이브에서 꺼낸 것이든 똑같이 읽습니다.
- 픽셀 포맷과 인코딩 카드를 먼저 보세요. DXT5 같은 FourCC는 포맷을 바로 지정하고, "DX10"이면 아래 확장 헤더의 DXGI 번호가 실제 포맷입니다.
- 밉 표에서 레벨별 크기와 바이트 오프셋을 확인하세요. 파일에서 특정 레벨만 잘라낼 때 필요한 값이며, 헤더에서 읽은 것이 아니라 계산한 값입니다.
- 배치 블록에서 표면 합계가 파일 크기와 맞는지 보세요. 모자라면 체인이 잘린 것이고, 남으면 마지막 표면 뒤에 뭔가 덧붙은 것입니다.
- 미리보기로 파일이 생각한 그 텍스처인지 확인하세요. 디코딩하지 않는 포맷이라고 나와도 헤더와 밉 표는 그대로 다 나옵니다.
자세한 설명
펼치기접기
게임 엔진 로더가 하는 것과 같은 방식으로 DirectDraw Surface를 읽습니다. 매직 4바이트, 고정 124바이트 헤더, 그 안의 32바이트 DDS_PIXELFORMAT, 그리고 FourCC가 "DX10"이면 DXGI 포맷·리소스 차원·배열 크기·알파 모드를 담은 20바이트가 더 붙습니다. 그 뒤로는 아무 표시 없는 바이트 열이라, 밉 레벨과 큐브 면과 깊이 슬라이스의 위치를 너비·높이·포맷에서 다시 계산해 찾아야 합니다. 이 계산이 전부이고, DDS 파일이 어긋나는 지점도 바로 여기입니다. 블록 압축은 4×4 블록 단위로만 저장되므로 13×7 BC3 텍스처는 가로 4개 세로 2개 블록이며, 1×1 마지막 레벨도 픽셀 하나가 아니라 16바이트 블록 하나를 통째로 차지합니다. 너비×높이로 계산하는 뷰어는 두 번째 레벨부터 위치가 어긋납니다. 같은 이유로 pitchOrLinearSize는 신뢰하지 않습니다. 잘못 적는 도구가 워낙 많아(Pillow는 블록 압축 파일마다 (너비+3)×4를 씁니다) 쓸 수 없는 필드라서, 계산값을 사용하고 값이 다르면 선언값을 나란히 보여 줍니다. 밉 체인과 +X −X +Y −Y +Z −Z 순서의 큐브 6면, 레벨마다 절반이 되는 볼륨 깊이를 모두 합산해 실제 파일 길이와 비교하므로, 잘린 체인이나 일부만 있는 큐브 맵, 마지막 표면 뒤에 붙은 바이트를 조용히 넘기지 않고 각각 짚어 줍니다. 미리보기를 위해 BC1·BC2·BC3·BC4·BC5를 직접 디코딩하며, 인덱스 3이 투명이 되는 BC1의 3색 블록도 처리하고, 비압축 배치는 채널 마스크로 풀어냅니다. BC6H와 BC7은 정보만 그대로 보여 주고 디코딩하지 않으며, 잘못된 그림을 그리는 대신 그렇다고 분명히 말합니다. 텍스처의 의미까지는 알 수 없습니다. sRGB인지 선형인지, 두 채널짜리 BC5 표면이 셰이더에서 Z를 복원하는 노멀 맵인지, 밉 체인이 실제로 최상위 레벨에서 생성된 것인지는 파일에 적혀 있지 않습니다.
자주 묻는 질문
헤더에 있는 pitchOrLinearSize를 왜 무시하나요?
기록하는 도구마다 값이 제각각이고, Direct3D 자체도 이 값을 믿지 않고 다시 계산하기 때문입니다. 원래는 비압축이면 한 행의 바이트 수, 블록 압축이면 최상위 레벨 전체 크기를 넣어야 하지만 다르게 쓰는 내보내기 도구가 많습니다. 예를 들어 Pillow는 블록 압축 파일마다 (너비+3)×4를 넣어서, 데이터가 128바이트인 16×16 DXT1 파일에 76을 적습니다. 그래도 아무 문제가 없는 이유는 로더가 어차피 너비·높이·포맷으로 배치를 다시 구하기 때문입니다. 이 페이지도 같은 방식을 쓰고 선언값을 계산값 옆에 보여 주므로, 어긋남을 그대로 물려받는 대신 눈으로 확인할 수 있습니다.
압축 텍스처의 1×1 레벨이 왜 픽셀 하나가 아니라 8바이트나 16바이트인가요?
블록 압축 포맷은 4×4 블록보다 작은 단위를 저장하지 않습니다. 1×1, 2×2, 3×3 레벨도 블록 하나를 통째로 차지하며 BC1과 BC4는 8바이트, BC2·BC3·BC5·BC6H·BC7은 16바이트이고, 남는 텍셀은 디코딩할 때 그냥 버립니다. 2의 거듭제곱이 아닌 크기에서도 같은 패딩이 붙습니다. 13×7 표면은 ceil(13/4)×ceil(7/4)=4×2, 즉 픽셀 91개에 블록 8개입니다. 블록 수를 세지 않고 너비×높이×픽셀당 바이트로 계산하면 모든 레벨이 작게 나오고, 레벨이 헤더 없이 이어 붙어 있으니 크기 하나만 틀려도 그 뒤 전부가 어긋납니다.
DX10 헤더는 무엇을 더 담고 있나요?
원래 픽셀 포맷 블록은 네 글자 코드나 채널 마스크로만 포맷을 지정할 수 있고, 텍스처 배열이나 새 블록 포맷을 적을 자리가 없습니다. DDS_HEADER_DXT10은 숫자로 된 DXGI 포맷 열거값(BC7_UNORM은 98, R8G8B8A8_UNORM은 28)과 리소스 차원, 0x4 비트로 큐브 맵을 표시하는 기타 플래그, 배열 크기, 그리고 색이 스트레이트인지 프리멀티플라이드인지 기록하는 알파 모드를 담습니다. 128바이트 헤더와 픽셀 데이터 사이에 들어가므로 이런 파일은 데이터 시작 위치가 148이 됩니다. 128이라고 가정하는 리더는 헤더를 픽셀로 잘못 읽습니다.
BC7이나 BC6H 텍스처는 왜 미리보기가 없나요?
BC7은 파티션 표와 엔드포인트 정밀도, 인덱스 배치가 제각각인 블록 모드가 여덟 가지이고, BC6H는 하프 플로트 HDR 포맷이라 일반 디스플레이에 보이려면 톤 매핑이 먼저 필요합니다. 둘 다 원리상 디코딩할 수 있지만, 구현이 조금만 틀려도 눈에 띄는 오류 대신 그럴듯한 쓰레기 그림이 나옵니다. 그래서 이 페이지는 포맷과 밉 체인과 헤더 전체를 보여 주되 픽셀은 디코딩하지 않는다고 분명히 밝힙니다. 실제로 보려면 texconv나 Compressonator로 변환하거나 블록을 GPU에 넘기는 뷰어로 여세요.
노멀 맵이 파랑 없이 빨강·초록으로만 보입니다. 파일이 깨진 건가요?
거의 확실히 아닙니다. BC5는 정확히 두 채널만 저장하며, 각각 BC3의 알파 블록과 같은 8비트 보간 블록입니다. 노멀 맵을 일부러 그렇게 저장합니다. X와 Y만 두고 Z는 셰이더에서 sqrt(1 − X² − Y²)로 복원하는데, 단위 벡터의 자유도가 둘뿐이기 때문입니다. 빠진 것은 없습니다. 한 채널만 두는 BC4도 마찬가지로 러프니스나 하이트, 앰비언트 오클루전 마스크에 쓰이며, 채널 하나에는 고유한 색이 없으므로 여기서는 회색조로 보여 줍니다.
큐브 맵 파일은 왜 여섯 배로 큰가요? 면이 빠질 수도 있나요?
큐브 맵은 면마다 완전한 밉 체인을 하나씩 갖고 +X, −X, +Y, −Y, +Z, −Z 순서로 구분자 없이 이어 붙습니다. caps2 필드에 0x200 큐브 맵 비트와 면별 비트가 하나씩 들어 있습니다. 16×16 BC1을 전체 체인으로 여섯 면 담으면 표면 데이터가 184바이트가 아니라 1104바이트입니다. 면은 실제로 빠질 수 있습니다. 규격이 어떤 부분집합이든 허용하고 파일에는 비트가 켜진 면만 들어가므로, 여기서도 여섯 면을 가정하지 않고 비트에서 예상 크기를 계산합니다. 비트가 주장하는 면 수를 파일이 담지 못하면 배치 블록에서 부족분으로 드러납니다.
관련 도구
xz(.xz) 스트림 분석기
xz 컨테이너를 읽습니다. 스트림 헤더, 블록 헤더와 필터 체인, 인덱스와 푸터, 그리고 압축을 풀지 않고 알아낸 실제 원본 크기까지.
파일
이메일 헤더 분석
원본 이메일 헤더 붙여넣기 → Received 홉 순서대로·홉간 지연·SPF/DKIM/DMARC 결과 확인.
네트워크
GPX 트랙 분석기 (거리·고도·지도)
GPS 시계·Strava·Garmin·Wahoo·Komoot 등에서 받은 .gpx 파일을 드롭하면 총 거리·누적 상승/하강·소요시간·이동시간·평균/최고 속도와 함께 트랙 미니맵과 고도 프로필을 즉시 보여줍니다.
파일
ZIP 내용 보기
ZIP 파일을 드롭하면 내부 파일을 풀지 않고도 목록·크기·미리보기·개별 내려받기까지 가능합니다.
파일
Git 팩파일 뷰어 (.pack / .idx)
.pack과 .idx를 브라우저에서 읽어 객체마다 종류·크기·오프셋·델타 깊이와 베이스, 종류별 합계와 가장 큰 객체를 보여 줍니다.
파일
Mach-O 바이너리 검사기
macOS·iOS 바이너리를 브라우저에서 확인하세요. 유니버설 파일의 아키텍처, 세그먼트와 섹션, 연결된 dylib, rpath, UUID, 코드 서명까지.
파일
Bech32 / Bech32m 디코더 (segwit 주소)
bech32·bech32m 문자열을 해독합니다. HRP, 데이터 심볼, 위트니스 버전, 프로그램, scriptPubKey와 어느 체크섬으로 검증되는지까지.
개발