Quick Flow
기본 이미지 크기·형식 결정 → 레벨 수 계산·저장소 준비
→ 기본 레벨 업로드 또는 전체 압축 레벨 업로드
→ 밉 생성이 필요한 경우 생성 → 유효 레벨 범위·필터 설정밉맵은 축소한 이미지 계층이고, 압축은 각 이미지의 저장 방식입니다. 압축했다고 밉맵이 생기거나 밉맵을 만들었다고 압축되는 것은 아닙니다.
레벨 구성
2D 텍스처의 다음 레벨은 각 차원을 절반으로 줄이되 1보다 작아지지 않습니다. 완전한 계층의 레벨 수는 floor(log2(max(width, height))) + 1입니다. 기본 레벨 0을 포함한 수이며, 직사각형은 작은 차원이 먼저 1에 도달할 수 있습니다.
// GL 3.3 Core: 현재 2D 텍스처의 레벨 0에 유효한 이미지가 있습니다.
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);밉맵 필터를 쓸 때는 BASE_LEVEL부터 기본 크기·MAX_LEVEL·저장소로 정해지는 유효 마지막 레벨까지 예상 크기와 호환 형식의 이미지가 모두 정의되어야 합니다. 자동 생성은 기존 하위 레벨을 덮을 수 있습니다. 직접 만든 아트용 레벨이나 특수 데이터의 축소 규칙이 필요하면 각 레벨을 직접 업로드합니다. normal map·거칠기·마스크 등은 단순 색 평균이 원하는 의미와 같지 않을 수 있습니다.
파라미터와 압축 데이터
| 항목 | 기본·범위 | 변경 기준과 오류 |
|---|---|---|
| BASE_LEVEL | 초기 0 | 샘플링 시작 이미지 레벨 |
| MAX_LEVEL | 초기 1000 | 허용 최고 레벨; 실제 체인·저장소와 함께 판단 |
| min filter | 초기 NEAREST_MIPMAP_LINEAR | 필요한 레벨이 없으면 불완전 |
| 압축 internal format | 형식별 블록·성분·지원 조건 | 파일 확장자만으로 GPU 형식 결정 불가 |
| imageSize | 압축 데이터의 바이트 수 | 비압축 폭×높이×성분수로 계산하지 않음 |
블록 압축은 일정 픽셀 묶음을 고정 크기의 블록으로 저장합니다. 가장자리의 작은 레벨도 형식별 블록 규칙을 따릅니다. 부분 갱신의 x·y·폭·높이 정렬 제약이 있으며, 일반 glTexSubImage2D와 압축 SubImage 호출을 혼동하지 않습니다.
형식 선택과 지원
색 텍스처인지 알파가 필요한지, 정규화·부동소수·sRGB인지에 따라 압축 형식을 고릅니다. 모든 BC·ETC·ASTC 계열이 모든 데스크톱 OpenGL 버전에서 보장되는 것은 아닙니다. 코어·확장 지원과 실제 대상 GPU를 확인하고, 필요한 경우 비압축 대체 자료를 준비하는 정책을 설명합니다.
범용 압축 형식 힌트를 주고 드라이버가 변환하는 경로와 미리 압축한 특정 형식을 업로드하는 경로는 다릅니다. 다운로드 파일 크기, GPU 저장 용량, 업로드 시간은 각각 다른 값입니다.
압축 블록 크기와 업로드
GL_EXT_texture_compression_s3tc가 지원되고 로더에 해당 상수가 포함된 예입니다. BC3/DXT5의 4×4 블록은 16바이트이므로, 7×5 이미지의 레벨 0은 ceil(7/4) * ceil(5/4) * 16 = 64바이트입니다. 전체 밉 체인의 크기는 각 레벨을 별도로 계산해 더합니다.
// boundTexture는 바인딩된 2D 텍스처입니다.
// bc3Level0은 오프라인 인코더가 만든 유효한 64바이트 BC3 블록 배열입니다.
glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
7, 5, 0, 64, bc3Level0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);이 예제는 레벨 0만 올리므로 밉맵 필터를 사용하지 않습니다. API에 RGB 픽셀을 넣는다고 BC3 블록으로 자동 해석되지는 않습니다. 특정 압축 형식으로 미리 인코딩한 데이터가 필요합니다. S3TC 확장은 데스크톱 GL 3.3이라는 버전 숫자만으로 보장하지 않습니다.
버전별 할당
명시적 밉 이미지 정의는 구형 OpenGL에도 있었지만 glGenerateMipmap의 코어 경로는 3.0입니다. 구형 자동 생성 상태·GLU 유틸리티와 구분합니다. 압축 텍스처 API는 1.3부터의 경로이고 개별 압축 형식은 이후 조건을 따릅니다. 4.2 불변 저장소에서는 레벨 수를 할당 시 정합니다. 이미 불변 저장소를 만든 뒤 TexImage로 레벨을 다시 정의하지 않습니다.
필터의 자세한 선택은 Sampler 상태, 비압축 입력의 정렬은 업로드 형식에 있습니다.
참고 링크
5 sources