Quick Syntax
// GL 3.3 Core: 새 컨텍스트의 기본 unpack 상태, 로더 준비 후 초기화 구간
const unsigned char pixel[] = {255, 128, 0};
GLuint texture = 0;
glGenTextures(1, &texture);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 1, 1, 0,
GL_RGB, GL_UNSIGNED_BYTE, pixel);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 이 예제의 초기 상태로 복원
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// 사용이 끝나면 유효한 컨텍스트에서 glDeleteTextures(1, &texture);GL_RGB8은 GPU 저장 형식이고, GL_RGB·GL_UNSIGNED_BYTE는 CPU 입력의 성분 순서와 타입입니다. 업로드만으로 draw에 연결되지는 않으며 텍스처 유닛과 sampler uniform도 맞춰야 합니다.
업로드 인벤토리
범위는 비압축 2D 이미지의 할당·부분 갱신입니다. 위 코드는 새 컨텍스트의 UNPACK_ROW_LENGTH·SKIP_PIXELS·SKIP_ROWS가 0이고 unpack PBO가 없는 상태를 전제로 합니다. 기존 렌더러에 넣을 때는 필요한 unpack 상태를 명시하고 호출 전 상태를 보존·복원하거나 패스의 상태 계약으로 관리합니다. 큐브맵·배열·압축 형식 전체를 하나의 호출 예제에 섞지 않습니다.
| 값 | 의미·기본 조건 | 변경과 실패 지점 |
|---|---|---|
target | 여기서는 GL_TEXTURE_2D | 호출은 현재 유닛의 해당 target 객체에 적용 |
level | 0은 기본 이미지, 상위 레벨은 축소 이미지 | 레벨 범위·크기가 일관되지 않으면 샘플링 불완전 |
internalFormat | RGB8, RGBA8, SRGB8_ALPHA8, RGBA16F 등 저장 의미 | 색인지 데이터인지, 정수인지 부동소수인지에 따라 선택 |
width/height | 픽셀 단위, 0 이상·구현 최대 크기 이내 | GL_MAX_TEXTURE_SIZE 조회; 바이트 수와 혼동하지 않음 |
border | 현대 Core에서는 0 | 구형 border 값 복사 금지 |
format/type | CPU 성분 배열·자료형 | RGB/BGR, 8비트/float를 잘못 지정하면 색·크기 해석 오류 |
UNPACK_ALIGNMENT | 기본 4, 가능한 값 1·2·4·8 바이트 | 한 행의 패딩 해석과 일치시킴 |
UNPACK_ROW_LENGTH | 기본 0은 업로드 폭 사용 | 0이 아니면 입력의 행 길이를 픽셀로 지정 |
data | CPU 주소, 또는 unpack PBO가 바인딩된 경우 바이트 오프셋 | 포인터 의미가 현재 상태에 따라 바뀜 |
정수 텍스처는 RGBA8UI·RGBA_INTEGER·usampler2D, 또는 RGBA8I·RGBA_INTEGER·isampler2D 조합처럼 부호까지 맞춥니다. 정규화된 RGBA8은 일반 sampler2D로 읽습니다. RGBA8처럼 정규화된 색 저장과 이름이 비슷하다고 서로 바꾸지 않습니다. 입력 형식·저장 형식·셰이더 읽기 타입을 한 조합으로 확인합니다.
한 픽셀을 화면에 연결
삼각형 예제의 실행 인수 2는 위의 주황색 픽셀을 텍스처로 사용합니다. 외부 파일이나 이미지 디코더가 없어도 업로드·샘플링을 확인할 수 있습니다.
#version 330 core
in vec2 uv;
uniform sampler2D image;
out vec4 color;
void main() {
color = texture(image, uv);
}정점 셰이더는 out vec2 uv에 값을 써야 합니다. 링크 성공 뒤 glUseProgram(program)으로 프로그램을 선택하고 glUniform1i(glGetUniformLocation(program, "image"), 0)으로 유닛 0을 지정합니다. 여기에는 텍스처 객체 이름이나 GL_TEXTURE0 상수를 전달하지 않습니다. 값 0은 유닛 인덱스입니다.
기본 축소 필터는 밉맵을 요구합니다. 위 예제는 레벨 0만 만들었으므로 GL_NEAREST로 바꿉니다. 다른 설정을 쓰는 sampler object가 유닛에 바인딩되어 있으면 실제 샘플링 상태가 그 객체에서 올 수 있습니다. 이 최소 예제는 새 컨텍스트에서 sampler object를 바인딩하지 않습니다.
정렬·부분 갱신·수명
폭 3의 RGB 8비트 이미지는 한 행이 9바이트입니다. 입력이 빈틈없는 배열인데 기본 정렬 4를 그대로 두면 다음 행 시작을 12바이트 경계로 해석할 수 있습니다. 폭 1·높이 1 예제만 성공한 것으로 여러 행 이미지의 정렬까지 검증했다고 판단하지 않습니다.
glTexSubImage2D는 이미 할당된 레벨의 영역을 갱신합니다. 저장소를 먼저 만들고 x·y 오프셋과 폭·높이가 영역을 넘지 않도록 확인합니다. PBO를 사용하지 않는 일반 업로드에서는 호출이 끝난 뒤 입력 CPU 배열을 해제할 수 있습니다. 텍스처 객체는 마지막 사용 후 컨텍스트가 유효할 때 삭제합니다.
파일 이미지의 첫 행이 위쪽이라면 UV 규약과 맞춰 디코딩 단계 또는 좌표 단계에서 한 번만 뒤집습니다. OpenGL이 PNG·JPEG를 직접 읽거나 자동으로 위아래 방향을 판단하지는 않습니다.
가변 할당과 DSA 비교
같은 RGBA8 한 픽셀을 저장하는 두 경로입니다. 호출 전에 GLAD가 해당 버전 API를 포함하고, unpack 상태가 기본값이며 unpack PBO가 없는 환경을 전제로 합니다. rgba 네 바이트는 {255,128,0,255} 같은 CPU 배열입니다.
// GL 3.3 Core: 바인딩한 객체의 이미지를 정의합니다.
GLuint boundTexture = 0;
glGenTextures(1, &boundTexture);
glBindTexture(GL_TEXTURE_2D, boundTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);// GL 4.5 Core: 수정할 객체를 직접 지정합니다.
GLuint directTexture = 0;
glCreateTextures(GL_TEXTURE_2D, 1, &directTexture);
glTextureStorage2D(directTexture, 1, GL_RGBA8, 1, 1);
glTextureSubImage2D(directTexture, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, rgba);
glTextureParameteri(directTexture, GL_TEXTURE_MIN_FILTER, GL_NEAREST);둘 다 저장소를 만든 뒤 샘플링 유닛에 연결해야 합니다. 두 번째 경로의 저장소는 불변이므로 다음 갱신에도 SubImage를 사용합니다. 사용이 끝난 객체는 각각 삭제합니다.
버전별 할당 방식
- 1.0: 텍스처 이미지는 있었지만 이름을 생성·바인딩하는 텍스처 객체 API는 1.1에 추가되었습니다. 위 코드를 1.0 전용 코드라고 표시하지 않습니다.
- 3.3 기본:
glGenTextures·바인딩·glTexImage2D로 가변 저장소를 만듭니다. - 4.2:
glTexStorage2D로 불변 저장소의 형식·레벨을 한 번 정하고 SubImage로 내용을 갱신할 수 있습니다. 불변은 픽셀 내용을 못 바꾼다는 뜻이 아닙니다. - 4.5:
glCreateTextures·glTextureStorage2D·glTextureSubImage2D처럼 객체를 직접 지정하는 DSA 경로를 사용할 수 있습니다. 생성·바인딩 방식만 바뀌고 픽셀 정렬 조건이 사라지는 것은 아닙니다.
참고 링크
3 sources