Quick Comparison
새 예제는 OpenGL 3.3 Core를 기준으로 실행하고, 구형 호출이 포함된 코드는 Compatibility 지원 여부를 별도로 확인합니다. 라이브러리 설치나 헤더 파일만으로 GPU 기능이 생기지는 않습니다.
| 확인할 값 | 의미 | 확인 시점 |
|---|---|---|
| 요청 버전 | 창 생성 전에 지정한 최소 요구 | 컨텍스트 생성 전 |
| 실제 GL 버전 | 드라이버가 생성한 컨텍스트의 기능 범위 | 현재 컨텍스트 설정·함수 로딩 후 |
| 프로파일 | 구형 기능을 포함하는지 결정하는 API 구성 | 3.2 이상에서 조회 |
| GLSL 버전 | 사용할 셰이더 언어와 문법 | 셰이더 작성·컴파일 전 |
| 확장·한도 | 코어 밖 기능과 구현별 자원 제한 | 해당 기능을 사용하기 전 |
컨텍스트의 역할
컨텍스트(context)는 OpenGL 명령이 적용되는 실행 상태입니다. 현재 프로그램, 바인딩한 자원, 깊이·블렌드 상태 등이 여기에 연결됩니다. 창은 화면을 표시하는 운영체제 객체이고, 컨텍스트는 렌더링 명령을 해석할 환경이므로 같은 개념이 아닙니다. GLFW는 둘을 함께 생성하는 인터페이스를 제공합니다.
OpenGL API를 호출하는 스레드에는 현재 컨텍스트가 있어야 합니다. 컨텍스트 생성 → 현재 컨텍스트로 설정 → 함수 로더 초기화 순서를 지킵니다. 셋 중 하나가 빠지면 함수 포인터가 없거나 의도와 다른 컨텍스트에 명령을 보내게 됩니다.
실제 지원 확인
GLAD 2와 GLFW로 초기화를 마친 GL 3.3 Core 환경에서 실행하는 발췌 코드입니다. 초기화 전체는 GLFW·GLAD 초기화에서 확인할 수 있습니다.
GLint major = 0, minor = 0, profile = 0;
glGetIntegerv(GL_MAJOR_VERSION, &major);
glGetIntegerv(GL_MINOR_VERSION, &minor);
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
std::printf("GL %d.%d; GLSL %s; Core %s\n", major, minor,
reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION)),
(profile & GL_CONTEXT_CORE_PROFILE_BIT) ? "yes" : "no");GL_MAJOR_VERSION 조회는 3.0 이상, 프로파일 마스크는 3.2 이상에서 사용합니다. 따라서 3.0 미만에서는 정수 버전 조회를, 3.2 미만에서는 프로파일 마스크 조회를 사용하지 않습니다. 구형 버전은 glGetString(GL_VERSION) 문자열로 확인하고, GLSL 조회도 셰이더 지원 여부를 먼저 확인합니다. GL_RENDERER와 GL_VENDOR를 함께 기록하면 다른 GPU나 소프트웨어 렌더러를 사용한 결과를 구분하기 쉽습니다.
버전이 바꾼 경계
| 구간 | 주요 변화 | 구형 코드 판단 |
|---|---|---|
| 1.0 | 즉시 모드·행렬 스택·고정 기능 처리 | 모든 레거시 API가 1.0에 있던 것은 아님 |
| 1.1~1.5 | 정점 배열·텍스처 객체·버퍼 객체 등이 차례로 추가 | 개별 호출의 도입 버전을 확인 |
| 2.0 | 셰이더 객체와 GLSL 경로가 코어에 포함 | 고정 기능과 셰이더 방식이 공존 |
| 3.0~3.1 | 구형 기능 사용 중단 예고와 다수 기능 제거 | 3.0부터 모두 즉시 사라졌다고 해석하지 않음 |
| 3.2 이상 | Core·Compatibility 프로파일 구분 | 같은 버전 숫자라도 사용할 호출이 다를 수 있음 |
| 4.x | GPU 처리·자원 접근·명령 제출 기능 확장 | 4.x 전체를 같은 기능 집합으로 취급하지 않음 |
#version 330 core는 GLSL 소스의 언어 버전과 프로파일을 지정합니다. 이 한 줄이 실행 컨텍스트를 업그레이드하지는 않습니다. 기본 예제에는 3.3에서 가능한 API만 쓰고, 이후 기능은 해당 예제에 요구 버전을 따로 표시합니다.
실패를 구분하는 기준
- 창 생성 실패: 요청 버전·프로파일·드라이버·디스플레이 환경과 창 라이브러리의 오류를 봅니다.
- 함수 로딩 실패: 컨텍스트 현재화와 로더 생성 옵션을 확인합니다.
- 컴파일 오류: GL 버전뿐 아니라 GLSL 지시문·문법·지원 확장을 확인합니다.
- 구형 호출 오류:
glBegin, 행렬 스택 등을 Core에 섞었는지 확인합니다.
확장은 코어보다 먼저 기능을 제공할 수 있지만, 확장 이름·함수 진입점·한도를 확인해야 합니다. 예제의 최소 버전 숫자만 낮추는 것으로 확장 경로가 완성되지는 않습니다.
참고 링크
3 sources