Quick Syntax
// GL 3.3 Core: unit 0의 텍스처에 모든 필요한 밉 레벨이 준비되어 있습니다.
GLuint sampler = 0;
glGenSamplers(1, &sampler);
glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindSampler(0, sampler);
// 마지막 사용 뒤 glBindSampler(0, 0); glDeleteSamplers(1, &sampler);Sampler object는 이미지 저장소를 가지지 않고 읽는 방법을 담습니다. 레벨 0만 있는 텍스처라면 밉맵 필터 대신 NEAREST 또는 LINEAR를 선택하거나 필요한 레벨을 준비합니다.
상태 인벤토리
| 상태 | 기본값 | 가능한 값·변경 기준 |
|---|---|---|
| MIN_FILTER | NEAREST_MIPMAP_LINEAR | NEAREST·LINEAR 또는 두 레벨/레벨 내부 선택의 네 mipmap 조합 |
| MAG_FILTER | LINEAR | NEAREST·LINEAR만 가능 |
| WRAP_S/T/R | REPEAT | REPEAT·MIRRORED_REPEAT·CLAMP_TO_EDGE·CLAMP_TO_BORDER |
| BORDER_COLOR | (0,0,0,0) | 경계색 사용 시 RGBA 또는 깊이 기준값 |
| MIN_LOD / MAX_LOD | -1000 / 1000 | 선택 가능한 세부 레벨 범위 제한 |
| LOD_BIAS | 0 | 샘플링 레벨 편향, 구현 최대 편향 범위 확인 |
| COMPARE_MODE | NONE | 깊이 비교 사용 시 COMPARE_REF_TO_TEXTURE |
| COMPARE_FUNC | LEQUAL | NEVER·LESS·EQUAL·LEQUAL·GREATER·NOTEQUAL·GEQUAL·ALWAYS |
밉맵 MIN_FILTER의 네 조합은 NEAREST_MIPMAP_NEAREST, LINEAR_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_LINEAR입니다. 앞부분은 한 레벨 내부의 필터, 뒷부분은 레벨 사이의 선택·보간입니다. MAG_FILTER에 mipmap 상수를 넣으면 오류입니다.
텍스처와 Sampler의 우선순위
유닛에 sampler object가 연결되어 있으면 해당 샘플링 파라미터를 사용합니다. 텍스처 객체에 glTexParameteri로 필터를 바꿨는데 결과가 달라지지 않는다면 별도 sampler가 덮고 있는지 확인합니다. sampler 0은 텍스처 자체 파라미터를 쓰는 경로입니다.
BASE_LEVEL·MAX_LEVEL은 텍스처 이미지 레벨의 범위이며 sampler의 MIN_LOD·MAX_LOD와 같지 않습니다. 저장소·레벨 범위는 텍스처가, 읽기 필터는 유효한 sampler 상태가 결정합니다. 정수 텍스처에는 선형 필터를 사용할 수 없고, 깊이 비교는 shadow sampler 선언과 COMPARE_MODE를 맞춰야 합니다.
깊이 비교 Sampler
GL 3.3에서 깊이 텍스처를 shadow sampler로 읽을 때는 비교 모드도 함께 켭니다. shadowSampler는 glGenSamplers로 생성한 객체이고 해당 유닛에는 깊이 텍스처를 연결합니다.
glSamplerParameteri(shadowSampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glSamplerParameteri(shadowSampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glSamplerParameteri(shadowSampler, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
glSamplerParameteri(shadowSampler, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glBindSampler(0, shadowSampler);GLSL은 uniform sampler2DShadow shadowMap;을 선언하고 texture(shadowMap, vec3(uv, referenceDepth))로 비교 결과를 읽습니다. CPU에서 shadowMap uniform은 유닛 0으로 지정합니다. 여기서 referenceDepth는 비교할 깊이이며 텍스처 좌표 z의 볼륨 위치가 아닙니다. GL_LEQUAL은 기준 깊이가 저장 깊이 이하일 때 통과하는 관계입니다. 깊이값 자체를 읽고 싶다면 비교 모드를 NONE으로 하고 일반 sampler2D를 쓰는 별도 조합을 선택합니다.
경계와 품질
반복 무늬는 REPEAT, 이미지 가장자리의 번짐을 막으려면 CLAMP_TO_EDGE를 먼저 고려합니다. CLAMP_TO_BORDER는 가장자리 texel 반복과 달리 지정한 border 색을 사용할 수 있습니다. shadow map 밖을 밝게 처리하려는 경우에도 비교식·깊이 규약에 따라 border 값의 의미가 달라집니다.
선형 필터가 모든 앨리어싱을 해결하지는 않습니다. 축소에는 밉맵이 필요할 수 있고, 비스듬한 표면은 비등방성 필터의 지원과 최대값을 확인합니다. 지원하지 않는 확장 열거값을 무조건 설정하지 않습니다.
버전 경계
고정 기능 시절에도 텍스처 파라미터가 있었지만 sampler object는 3.3부터입니다. MIRROR_CLAMP_TO_EDGE는 4.4 코어 또는 대응 확장 경로를 확인합니다. 비등방성 필터도 확장과 코어 편입 조건을 구분합니다. 다중 샘플 텍스처는 일반 2D 필터·wrap API를 그대로 적용하는 대상이 아닙니다.
참고 링크
3 sources