Quick Syntax
// GL 3.3 Core, GLAD 초기화 후
GLint count = 0;
glGetIntegerv(GL_NUM_EXTENSIONS, &count);
for (GLint i = 0; i < count; ++i) {
std::printf("%s\n", reinterpret_cast<const char*>(glGetStringi(GL_EXTENSIONS, i)));
}
GLint attributes = 0, textureSize = 0;
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &attributes);
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &textureSize);기능 사용 조건은 지원 버전 또는 정확한 확장 지원, 필요한 함수 로딩, 자원 한도 충족입니다. 함수 포인터가 0이 아니거나 헤더에 상수가 있다는 사실만으로 기능 지원을 판정하지 않습니다.
무엇을 조회하는가
| 조회 | 의미·범위 | 사용하는 판단 |
|---|---|---|
GL_VERSION, GL_SHADING_LANGUAGE_VERSION | 구현이 보고한 버전 문자열 | GL과 GLSL 조건 구분 |
GL_CONTEXT_PROFILE_MASK | 3.2 이상 프로파일 비트 | 레거시 호출 허용 여부 |
GL_NUM_EXTENSIONS | 현재 컨텍스트 확장 개수 | 0부터 개수 미만으로 순회 |
GL_MAX_VERTEX_ATTRIBS | 정점 속성 슬롯 개수 | 행렬 속성의 여러 슬롯도 포함 |
GL_MAX_TEXTURE_SIZE | 해당 텍스처 크기 제한의 기준 | 큐브·3D·배열 한도는 별도 조회 |
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS | 단계 전체 유닛 한도 | 단계별 한도도 함께 확인 |
GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT | UBO 범위 시작의 바이트 정렬 | 임의의 구조체 간격으로 범위 바인딩하지 않음 |
한도는 사용자 설정으로 늘리는 값이 아니라 구현 능력입니다. 최소 보장값과 실제 조회값을 구분하고, 목표 자원 크기가 최대값 안이라고 메모리 할당까지 반드시 성공한다고 가정하지 않습니다.
확장 이름을 정확히 비교
GL 3.0 이상에서는 glGetStringi로 확장을 하나씩 읽습니다. 부분 문자열 비교로 비슷한 이름을 잘못 인식하지 않습니다. GLAD에 해당 확장을 생성했다면 지원 불리언을 사용할 수 있고, GLFW의 glfwExtensionSupported도 정확한 확장 이름을 받습니다.
예를 들어 디버그 출력은 4.3 코어의 기능 또는 지원되는 GL_KHR_debug 경로를 판단합니다. GL_ARB_debug_output은 비슷한 목적이지만 인터페이스와 기능 집합이 같다고 가정하지 않습니다. 디버그 메시지에서 사용하는 경로를 고릅니다.
구형 컨텍스트와 조회 오류
3.0 이전에는 확장 목록을 공백으로 구분한 glGetString(GL_EXTENSIONS) 문자열을 사용하는 경로가 있습니다. 현대 Core에 이 방법을 그대로 적용하지 않습니다. glGetStringi 자체도 지원하지 않는 구형 컨텍스트에서 먼저 호출할 수 없습니다.
지원 버전이 정해지지 않은 열거값으로 glGetIntegerv를 호출하면 조회 자체가 오류가 될 수 있습니다. 먼저 기본 버전을 확인하고 그 환경에 있는 항목만 조회합니다. 컨텍스트가 바뀌면 지원 목록도 같은 것으로 캐시하지 않습니다.
대체 경로
필수 기능이 없으면 초기화 단계에서 이유를 보여 주고 종료합니다. 선택 기능이면 더 오래된 구현 경로를 고릅니다. 예를 들어 DSA가 없을 때는 바인딩 기반 수정, 간접 그리기가 없을 때는 CPU의 draw 반복을 사용할 수 있습니다. 결과와 성능이 모두 같다고 약속하지 않고, 기능별 의미 차이를 확인합니다.
참고 링크
3 sources