Back to top

LearnOpenGL(00) 소개

작성날짜 2022/06/18

다음글: LearnOpenGL(01) 창 만들기


OpenGL


OpenGL은 종종 그래픽과 이미지를 다루는 다양한 기능들을 제공하는 API로 간주되지만, 사실 OpenGL은 그 자체로 API는 아니고 크로노스 그룹에서 개발 및 유지하는 사양의 명세일뿐이다. OpenGL의 사양은 각 함수의 결과 또는 출력이 어떠해야 하는지는 명세해 놓았지만 그 함수들이 어떻게 동작할지는 이를 구현하는 개발자에게 달려있다. 이러한 OpenGL 라이브러리를 실제로 개발하는 사람들은 그래픽카드 제조업체들이다. 우리는 OpenGL 3.3 버전을 사용할 것이며 여기에서 자세한 사양을 확인할 수 있다.

Core-profile vs Immediate mode


예전에  OpenGL은 Immediate mode만을 지원했다. Immediate mode는 쉽고 빠르게 개발을 할 수 있도록 해줬지만 라이브러리들이 숨겨져 있어서 개발자들이 더 직접적으로 OpenGL을 제어하지 못 했다. 개발자들은 더 유연한 제어 방법을 원했고 이는 3.2버전부터 Core-profile을 통해 가능하게 되었다.

Core-profile은 더 유연하고 효율적인만큼  배우기 어렵지만 OpenGL이 실제로 어떻게 작동하는지 파악하기에는 더 좋다.

따라서 우리는 Core-profile OpenGL 3.3 버전을 사용할 것이다.

현재 OpenGL은 4.6 버전이 나와있는데 3.3 버전을 배우는 이유는 최신 버전에 많은 기능들이 추가되었긴 하지만 3.3 버전의 핵심 기능들에는 변함이 없습니다.


확장


OpenGL의 강력한 기능 중 하나는 확장을 지원하는 것입니다. 그래픽 회사가 제시한 새로운 기술이나 대규모의 렌더링 최적화는 드라이버에 구현된 확장에서 발견되곤 합니다.


상태머신


OpenGL은 그 자체로 하나의 거대한 상태 머신입니다. 즉, 현재의 OpenGL을 어떻게 구동할지  정의하는 변수의 집합입니다. OpenGL의 상태를 보통 OpenGL context라고 합니다. OpenGL을 사용할 때, 옵션을 설정하고 버퍼를 조작하여 상태를 변경한 후 current context를 사용하여 렌더합니다.


객체


OpenGL 라이브러리는 C로 쓰여졌으며 다른 언어로의 파생을 허용하지만 코어 부분은 여전히 C 라이브러리입니다. C의 언어 구조는 다른 고급 언어로 번역되기 어렵기 때문에 OpenGL은 몇가지 추상화를 염두에 두고 개발되었습니다. 그 중 하나는 객체입니다.


OpenGl에서의 객체는 OpenGl의 상태를 나타내는 옵션들의 콜렉션입니다. 예를 들어, 창을 그리는 옵션을 나타내는 객체를 가질 수 있습니다.  창의 크기를 정하고, 얼마나 많은 색을 지원할지 등을 정할 수 있습니다. C 스타일의 구조체로 나타내면 아래와 같습니다.

struct object_name {
    float  option1;
    int    option2;
    char[] name;
};

앞으로 사용할게 될 객체는 이렇게 생겼습니다.

// The State of OpenGL
struct OpenGL_Context {
  	...
  	object_name* object_Window_Target;
  	...  	
};

// create object unsigned int objectId = 0; glGenObject(1, &objectId); // bind/assign object to context glBindObject(GL_WINDOW_TARGET, objectId); // set options of object currently bound to GL_WINDOW_TARGET glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800); glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600); // set context target back to default glBindObject(GL_WINDOW_TARGET, 0);

이런 작은 코드 조각들이 하나의 워크플로우이며 OpenGL을 다루면서 자주 보게 될 겁니다. 위의 코드에선 먼저 객체를 만들고 그 객체를 참조하는 id를 저장했습니다(진짜 객체의 데이터는 씬 뒤에 저장되었습니다). 그런 다음 객체를 목표 지점의 context에 바인드했습니다.


참고: https://learnopengl.com/Getting-started/OpenGL


An unhandled error has occurred. Reload 🗙