Quick Comparison
2D 배열의 레이어는 서로 다른 이미지이고, 3D 텍스처의 깊이 방향은 필터링할 공간입니다. 같은 TexImage3D 계열로 할당할 수 있어도 의미가 같지 않습니다.
| 자료 | target·sampler | 좌표 의미 |
|---|---|---|
| 환경의 여섯 방향 | CUBE_MAP / samplerCube | 방향 vec3 |
| 같은 크기 이미지 묶음 | TEXTURE_2D_ARRAY / sampler2DArray | UV와 레이어 |
| 연속한 부피 | TEXTURE_3D / sampler3D | 연속 XYZ |
저장 구조
큐브맵은 +X·-X·+Y·-Y·+Z·-Z 면을 사용합니다. 각 레벨의 면은 정사각형이며 호환되는 크기·형식을 갖춰야 합니다. 사진 파일의 면 방향·상하 방향을 OpenGL의 큐브 좌표 규약에 맞추지 않으면 이음새나 회전 문제가 생깁니다.
2D 배열은 모든 레이어가 같은 크기·형식과 레벨 구조를 공유합니다. mipmap을 내려가도 레이어 개수는 유지됩니다. 3D 텍스처는 mipmap을 내려가면서 폭·높이뿐 아니라 깊이도 줄어듭니다.
// GL 3.3 Core, arrayTexture는 생성·바인딩할 2D 배열 객체입니다.
glBindTexture(GL_TEXTURE_2D_ARRAY, arrayTexture);
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 64, 64, 8, 0,
GL_RGBA, GL_UNSIGNED_BYTE, nullptr);이 코드는 레이어 8개의 레벨 0 저장소만 만듭니다. 내용은 아직 정의되지 않았으며 각 레이어를 SubImage3D로 채우고 필터·레벨을 설정해야 샘플링 의미가 생깁니다. 2D 배열의 세 번째 좌표를 정규화된 깊이 0~1로 사용하지 않습니다.
레이어 업로드와 샘플링
위 64×64×8 배열에서 레이어 3만 채우는 GL 3.3 구간입니다. pixels는 RGBA8 64 * 64 * 4바이트 배열이고, 기본 unpack 행 길이·skip 상태와 PBO 미바인딩을 전제로 합니다.
glBindTexture(GL_TEXTURE_2D_ARRAY, arrayTexture);
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 3, 64, 64, 1,
GL_RGBA, GL_UNSIGNED_BYTE, pixels);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);아래 세 식은 각각의 셰이더에서 사용할 대안입니다. 같은 프로그램에 함께 선언하면 서로 다른 sampler 타입을 서로 다른 유닛에 연결합니다. 방향은 0벡터가 아니고, uv·uvw는 의도한 좌표 범위로 준비합니다.
// GLSL 330 core의 선언과 main 안에서 사용할 식
uniform samplerCube environmentMap;
uniform sampler2DArray layers;
uniform sampler3D volume;
// vec4 a = texture(environmentMap, direction); // direction: vec3 방향
// vec4 b = texture(layers, vec3(uv, 3.0)); // 8개 중 레이어 3
// vec4 c = texture(volume, uvw); // 연속 3D 좌표배열의 레이어 방향은 3D 볼륨처럼 선형 보간하지 않습니다. 3.0은 레이어 번호이며 0~1 정규화 깊이가 아닙니다. 처음 정의한 배열의 다른 레이어는 위 업로드로 채워지지 않으므로 미정의 내용을 읽지 않습니다.
선택과 한도
| 대상 | 별도 확인 | 잘못 선택한 비용 |
|---|---|---|
| 큐브맵 | 최대 면 크기·면 완전성·seamless 상태 | 여섯 장을 일반 UV 이미지처럼 해석 |
| 2D 배열 | 최대 레이어 수·동일 크기 | 크기가 제각각인 원본에 패딩·재조정 필요 |
| 3D | 최대 3D 크기·전체 용량 | 단순 이미지 목록에도 깊이 필터링 발생 |
| 아틀라스 | 타일 UV·여백·밉 번짐 | 한 이미지 안 이웃 타일이 섞임 |
텍스처 배열은 아틀라스의 이웃 타일 번짐을 줄일 수 있지만 무제한의 서로 다른 이미지를 담는 목록은 아닙니다. 텍스처 target과 셰이더 sampler 선언을 맞추고, 유닛에는 해당 target의 객체를 연결합니다.
버전과 View
3D 텍스처는 1.2, 큐브맵은 1.3, 배열 텍스처는 3.0에 코어로 들어왔습니다. 큐브맵 배열은 4.0 경로를 따로 확인합니다. 3.3 기본 예제에서 큐브맵 배열을 일반 큐브맵과 같은 기능으로 취급하지 않습니다.
4.3 texture view는 호환되는 불변 저장소의 일부 레벨·레이어를 다른 view로 볼 수 있게 하지만 데이터를 자동 복사하지 않습니다. 원본 저장소·허용 target·형식 호환성·수명을 확인해야 합니다. FBO 첨부에서 레이어를 출력 대상으로 연결하는 조건과 구분합니다.
참고 링크
3 sources