Quick Syntax
// GL 3.3 Core, texture는 완전한 2D 텍스처, program은 링크 완료입니다.
glActiveTexture(GL_TEXTURE0 + 2);
glBindTexture(GL_TEXTURE_2D, texture);
glUseProgram(program);
glUniform1i(glGetUniformLocation(program, "albedo"), 2);texture는 객체 이름, GL_TEXTURE0 + 2는 활성 유닛 선택, uniform 값 2는 유닛 인덱스입니다. 셰이더의 uniform sampler2D albedo가 그 유닛의 2D 텍스처를 읽습니다.
연결 인벤토리
| 요소 | 기본·가능한 값 | 바꾸는 이유와 실패 |
|---|---|---|
| active texture | 초기 유닛 0 | 이후 target 기반 bind·parameter 호출의 대상 유닛 |
| target binding | 유닛마다 target별 연결, 초기 이름 0 | 2D·cube를 잘못 연결하면 다른 자원 읽음 |
| sampler uniform | 초기값 지정이 없으면 0 | 읽을 유닛을 지정; 객체 이름을 넣지 않음 |
| sampler object | 유닛별 초기 0 | 0이면 텍스처 파라미터, 객체 연결 시 샘플링 상태 사용 |
| 유닛 한도 | 단계별·전체 한도 조회 | 활성 sampler 수와 배치 제한 확인 |
텍스처 유닛은 GPU 메모리 저장소가 아닙니다. 하나의 텍스처를 여러 유닛에 연결할 수 있고, 같은 텍스처에 다른 sampler object를 조합할 수도 있습니다. glActiveTexture만 호출했다고 텍스처 객체가 바뀌지는 않습니다.
두 이미지를 함께 읽기
각 이미지를 서로 다른 유닛에 바인딩하고 두 sampler uniform에 해당 인덱스를 설정합니다. 두 번째 텍스처를 같은 유닛의 같은 target에 바인딩하면 첫 연결을 덮어씁니다. 프로그램을 바꿔도 컨텍스트의 텍스처 바인딩은 자동 초기화되지 않으므로 draw가 필요한 조합을 명시합니다.
서로 다른 sampler 타입이 같은 유닛을 잘못 공유하면 프로그램 사용에 오류가 생길 수 있습니다. 정수 텍스처에는 isampler/usampler, 깊이 비교에는 비교 상태와 shadow sampler를 맞춥니다. 단순히 화면에 색이 나왔다는 이유로 타입 조합이 올바르다고 판단하지 않습니다.
고정 기능과 현대 방식
1.1의 텍스처 객체, 1.3의 다중 텍스처 유닛, 2.0의 GLSL sampler는 서로 다른 변화입니다. 구형 고정 기능 코드의 target enable과 texture environment 결합식은 현대 셰이더의 texture 호출·색 계산으로 옮깁니다. Core에서 glEnable(GL_TEXTURE_2D)를 추가해 샘플링을 켜려 하지 않습니다.
3.3은 sampler object를 제공합니다. 4.4의 multibind, 4.5의 glBindTextureUnit은 여러 연결 또는 직접 유닛 연결을 단순하게 만들지만 uniform의 유닛 의미를 바꾸지는 않습니다. glBindTextureUnit(2, texture)의 첫 인수는 GL_TEXTURE2 상수가 아니라 정수 2입니다.
검은 텍스처의 원인
바인딩 외에도 밉맵 완전성, 필터, UV, format과 sampler 타입을 확인합니다. 업로드는 텍스처 형식, 샘플링 상태는 필터·랩에 있습니다. 정리할 때 sampler와 texture는 별개 객체로 삭제합니다.
참고 링크
4 sources