티스토리 뷰
이 글에서는 다음의 개념들에 대해 다룬다.
- OpenGL의 개념과 특징
- GLFW의 개념
- GLEW의 개념
1. OpenGL 개요
코드를 다소 사용해보기 전까지는 OpenGL에 대해 라이브러리라고 생각하고 있었다.
그러나 OpenGL은 구체적인 하나의 라이브러리가 아니다.
어떤 규격으로 어떻게 동작해야 하는지를 정해놓은 규격서, 사양에 가깝다.
즉, 함수 시그니처와 작동 방식 등을 설명한 API 규격서로 생각할 수 있다.
OpenGL의 라이브러리를 실제로 개발하는 주체는 일반적으로 그래픽카드 제조 업체다.
AMD, Apple, NVidia 등 다양한 그래픽 제조 업체가 이를 개발하고 있고 따라서 OpenGL의 구현도 하나가 아니다. 이렇게 구현된 게 그래픽 카드에 포함되어 있다.
2. State Machine
OpenGL 자체는 큰 State Machine으로 볼 수 있다.
즉, OpenGL이 어떻게 동작하는 지에 대한 변수(상태)의 모음이다.
예를 들어 “이제 삼각형 대신 선을 그리고 싶어!” 라고 OpenGL에 말할 때 OpenGL은 현재 그리는 방법을 설정하는 일부 context 변수를 변경하는 방식으로 작동한다.
이렇게 상태가 변경되면 다음 명령으로 삼각형 대신 선을 그리게 된다.
이 작동 방식을 개념적으로 이해하는 것이 중요하다.
3. Object
Opengl의 Object에 대한 정의를 살펴보면 “OpenGL State의 subset을 나타내는 옵션들의 모음”이라고 나와있다.
다소 어려운 문장이므로 우선 “몇 가지 상태를 갖고 있는 구조”라고 이해하자.
예를 들어, 그림을 그리는 window의 설정을 나타내는 object를 가질 수 있다.
그것을 통해 크기, 지원 색상 등을 설정할 수 있다.
다음과 같은 방식으로 시각화 해볼 수 있다.
struct object_name {
float option1;
int option2;
char[] name;
}
OpenGL의 사용 Flow 자체가 어떻게 이 Object를 제어할 것인가에 초점이 맞춰져있다.
Object를 사용하고 싶을 때 주로 다음과 같은 방식으로 접근하게 된다.
// The State of OpenGL
struct OpenGL_Context {
...
object_name* object_Window_Target;
...
};
// object 생성 및 ID에 대한 참조 저장.
unsigned int objectId = 0;
glGenObject(1, &objectId);
// context에 object를 bind/assign.
glBindObject(GL_WINDOW_TARGET, objectId);
// GL_WINDOW_TARGET에 현재 bound 된 object의 option들을 설정.
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// context target을 기본으로 되돌림.
glBindObject(GL_WINDOW_TARGET, 0);
이 코드가 실제로 opengl 코드를 다루며 자주 볼 수 있는 work-flow인데 다음과 같이 진행되고 있다.
- Object 생성 및 ID에 대한 참조 저장
- Object를 Context의 target location에 Binding(이 경우 target location은 GL_WINDOW_TARGET)
- GL_WINDOW_TARGET의 옵션을 설정.
- GL_WINDOW_TARGET의 id를 0으로 설정하며 object를 unbind.
이렇게 설정된 옵션은 objectId에 의해 참조된 object에 저장되고 object를 GL_WINDOW_TARGET에 바인딩할 때 다시 복원된다.
대충 이런 구조다. 아까 얘기했듯이 Object가 상태를 담고 있는 구조라는 말에 맞는 형태다.
이렇게 여러 옵션을 담은 Object를 만들어두면 객체 바인딩만 변경하며 OpenGL의 상태를 바꾸는 데 용이할 것이다.
예를 들어 특정 모델을 그리는 데 이것저것 모든 옵션을 다시 설정하지 않고도 object만 변경하면 될 것이다.
다소 생소한 work-flow이므로 기본 구조를 잘 알아두는 것이 중요할 것 같다.
4. Core-profile vs Immediate mode
OpenGL을 사용하여 개발할 때 2가지 모드 중 하나로 개발할 수 있다.
예전에는 opengl을 사용하여 개발할 때 immediate mode(a.k.a. fidxed function pipeline)으로 주로 개발했다고 한다.
추상화가 잘 되어있어 사용하기는 간단하지만 opengl 기능의 대부분이 라이브러리 내부에 숨겨져 있었고 opengl 계산 방식 제어가 어려웠다고 한다.
따라서 OpenGL을 더 유연하게 사용하기 위해 Core-profile 모드를 사용하게 되었다.
이 모드로 개발하면 조금 더 low-level을 다뤄야 하며 opengl의 작동 방식에 대해 잘 이해하고 있어야 한다.
애초에 이제는 더 이상 immediate mode를 사용하지 않는다고 한다.
5. Extension
OpenGL의 가장 큰 특징 중 하나로 확장 기능을 사용하기 용이하다는 점이 있다.
종종 그래픽 카드 드라이버 개발자들이 새로운 기술/최적화를 추가할 때가 있다.
개발자는 그게 OpenGL 표준 사양에 추가되지 않더라도 미리 사용할 수 있다.
단, 이 경우 아래와 같이 실행 환경에서 해당 확장 프로그램을 사용할 수 있는 지 체크해주어야 한다.
if(GL_ARB_extension_name)
{
// Do cool new and modern stuff supported by hardware
}
else
{
// Extension not supported: do it the old way
}
6. GLFW(Graphics Library Framework)
GLFW는 OpenGL과 함께 사용하는 유틸리티 라이브러리다.
GLFW를 이용하여 window 생성 및 제어, 키 입력과 이벤트 생성, OpenGL context를 생성 및 관리하는 등의 작업을 할 수 있다.
OpenGL은 키 입력을 받거나 윈도우를 생성하는 작업 등은 못 하는 그래픽스 API이기 때문에 이런 유틸 라이브러리를 함께 이용하게 된다.
비슷한 목적의 다른 라이브러리가 많지만 GLFW를 주로 사용한다.
혹은 SDL/SDL2를 사용하면 GLFW보다 더 많은 기능들(오디오나 텍스트 삽입 등)을
근데 그럴거면 그냥 게임 엔진을 써서 개발하는 것이 정신 건강에 좋을 것 같다.
홈페이지: https://www.glfw.org/
7. GLEW(OpenGL Extension Wrangler)
GLEW는 플랫폼 별로 사용 방법이 다르고 복잡한 OpenGL을 쉽게 사용하도록 해주는 확장 라이브러리다.
애초에 OpenGL은 구현체가 있는 라이브러리도 아니고 그래픽 카드 및 사용 환경마다 배리에이션이 크다.
따라서 쉽게 쓸 수 있는 방법이 필요한데, GLEW가 복잡한 OpenGL의 기본 + 확장 기능을 모두 사용할 수 있게 만들어주는 역할을 한다.
Refs
https://learnopengl.com/Getting-started/OpenGL
'그래픽스' 카테고리의 다른 글
[그래픽스]Hello Triangle - OpenGL에서 삼각형 띄워보기 (0) | 2025.02.12 |
---|---|
[그래픽스] Rendering Pipeline 개요 (2) | 2025.02.09 |
[그래픽스] Hello Window - GLEW/GLFW 이용하여 창 띄우기 (0) | 2025.02.06 |
[그래픽스] C++에서 OpenGL(GLEW/GLFW) 개발 환경 구축 (0) | 2025.02.01 |
- Total
- Today
- Yesterday
- 사진구조
- 신경망
- gradient descent
- Logistic Regression
- 밑바닥부터 시작하는 딥러닝
- 이미지
- 영상처리
- 신호 및 시스템
- Neural Network
- 매트랩
- 매트랩 함수
- 딥러닝
- rnn
- 컴퓨터과학
- RGB이미지
- 머신 러닝
- 이미지처리
- 이산 신호
- 머신러닝
- Andrew ng
- CS
- CNN
- 영상구조
- 자연어 처리
- 컴퓨터 과학
- 순환 신경망
- ML
- 연속 신호
- 인덱스 이미지
- NLP
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |