OpenGL_00, What is OpenGL?

김경주·2024년 2월 1일

OpenGL

목록 보기
1/10

출처 - https://learnopengl.com/, https://registry.khronos.org/OpenGL-Refpages/gl4/html/

OpenGL

  • 그래픽과 이미지 조작하기 위해 사용할 수 있는 함수들을 모아둔 하나의 큰 세트를 제공하는 API(Application Programming interface)라고 주로 생각한다.
  • 하지만 OpenGL 그자체는 API가 아니다. 크로노스 그룹이 만들고 유지보수하는 하나의 설명서일 뿐.
  • OpenGL 설명서는 각각의 함수들이 어떻게 작동하고 그 결과나 산출물이 정확히 무엇인지 명시한다.
    • 구현에 관한 세부사항들을 알려주지 않는다.
  • 실제 OpenGL 라이브러리를 개발하는 사람들은 그래픽 카드 회사 사람들이고 각각의 그래픽 카드는 그 그래픽 카드에 맞게 개발된 버전을 제공
  • 크로노스 그룹에서 모든 버전에 관한 설명서들을 관리한다.
    - 크로노스 그룹 홈페이지 : https://www.khronos.org/
  • 거의 모든 구현은 그래픽 카드 제조사들에 의해 설계되어있기 때문에 버그가 발생할 때마다 비디오 카드 드라이버를 업데이트 해주는 것으로 일반적으로 해결이 된다.
    • 그런 드라이버들은 새로운 OpenGL 버전을 포함한다
    • 왜 항상 그래픽 드라이버를 업데이트하라는 이유 중 하나

Core-profile vs Immediate mode

  • 예전에는 OpenGL을 사용하는 것은 Immediate mode에서 개발하는 것을 의미
    • immediate mode == fixed function pipeline
    • 이는 그래픽을 그리기 위한 쉬운 방식
  • OpenGL의 거의 모든 기능은 라이브러리에 숨겨져 있고 개발자들은 OpenGL이 어떻게 계산을 하는지에 관한 제어권을 가지지 않았다.
    • 위 내용에 의해서 개발자들이 좀 더 유연성을 원하게 했고 결국 그래픽에 대한 제어권을 갖게 되었다.
  • Immediate mode는 사용하고 이해하기 정말 쉬웠지만 비효율적이었다.
    • 이런 이유로 3.2 버전 이후로부터 immediate mode 기능들 사용을 반대하기 시작했다.
      • Core-profile mode에서 개발하기를 권장했다.
      • 중요도가 떨어졌던 예전 기능들을 삭제
  • OpenGL의 core-profile을 사용할 때 OpenGL은 현대식으로 사용하게 강요
    • 예전 deprecated 기능들을 사용할때마다 OpenGL은 에러를 띄우거나 그리는 것을 멈춤
  • 현대식으로 접근하는 것을 배우는 장점은 유연하고 효율적이지만 배우기 어려움
  • Immediate mode는 OpenGL이 수행하는 실제 연산들로부터 상당히 많이 추상화했지만 배우기 쉽다, 실제로 OpenGL이 어떻게 작동하는지 파악하기 힘들다.
  • 현대적 접근방식은 OpenGL과 그래픽을 제대로 이해하는 것을 요구하는 반면, 어렵다. 이는 훨씬 효율적이고 유연하고 중요하다. → 더 나은 그래픽 프로그래밍의 이해
  • Learn OpenGL 책에서 core-profile OpenGL version 3.3 기준으로 작성.
    • 3.3 이후로 유용한 기능들이 추가될 뿐 실제 코어 머신은 바뀌지 않았다.
    • 모든 컨셉과 기술들은 똑같다. 3.3 버전으로 완벽히 충분하다.

Extensions

  • OpenGL의 큰 특징은 extensions의 지원이다. 그래픽 회사들이 새로운 기술들이나 렌더링 최적화를 가지고 나올 때마다 드라이버들 안에서 구현된 extension을 찾을 수 있다. 만약 하드웨어가 앞서 말한 extension들을 제공한다면, 개발자들은 그 extension으로부터 제공된 기능들을 사용하여 더 나은 더 효율적인 그래픽스를 사용할 수 있다. 단순하게 그래픽 카드가 지원하는 extension을 확인하는 것으로부터 차후 버전에서의 기능들을 포함하는 OpenGL을 기다려야하는 일 없이 새로운 렌더링 기술을 계속해서 사용할 수 있게 해준다.
  • 개발자들은 이러한 extensions들이 사용되기전에 이용가능한지 물어야한다.
    if(GL_ARB_extension_name)
    {
    // Do cool new and modern stuff supported by hardware
    }
    else
    {
    // Extension not supported: do it the old way
    }

State machine

  • OpenGL은 큰 상태 머신 그 자체 : OpenGL이 현재 어떻게 연산해야하는지 정의하는 변수들의 집합
    • 또한 OpenGL의 상태(state)는 context라고 불린다.
  • OpenGL을 사용할 때, 종종 몇몇 옵션을 세팅하고 버퍼를 조작하고 최신 context를 사용하여 그리는 것으로 그 상태를 변경한다.
  • 예를들어 OpenGL에게 삼각형을 그리는 대신 지금 선분들을 그리길 원한다고 알릴 때마다 OpenGL이 어떻게 그려야하는지 설정하는 context 변수들을 바꿈으로써 OpenGL의 상태를 바꾼다. OpenGL에 선분들을 그려야하는 것을 알리는 것으로 context를 바꾸자마자 다음 그리는 명령어는 삼각형 대신 선분들을 그릴 것
  • OpenGL에서 작업 중 context를 바꾸는 state-changing functions과 OpenGL의 최신 상태를 근거로 연산을 수행하는 state-using functions를 발견할 것.
  • OpenGL이 기본적으로 하나의 큰 상태 머신이라는 것을 명심하기만 하면 대부분의 그 기능들의 의미를 더 이해할 것이다.

Objects

  • OpenGL 라이브러리는 C로 쓰여졌으며 다른 언어들에서 많은 어원을 참작한다. 그러나 그 핵심은 C-library로 남아있다. C언어의 상당수가 다른 고차원 언어로 옮겨지지 않기 때문에 OpenGL은 몇가지 추상화를 유념하여 개발되었다. 그 추상화들 중 하나는 object이다.
  • OpenGL에서 object는 OpenGL의 상태의 부분집합을 표현하는 옵션들의 콜렉션이다. 예를들어 창을 그리는 설정들을 표현하는 object를 가질 수 있다. 그 사이즈, 몇가지 색상 등을 설정할 수 있다.
    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);
    1. Create an object and store a reference to it as an id(실제 데이터는 scene 뒤에 저장) : object 색성과 id로서의 참조자를 저장 - glGenObject()
    2. Bind the object to the target location of the context(GL_WINDOW_TARGET) : context의 타겟 지점에 object를 바인드 - glBindObject()
    3. Set the window options : 창 옵션 세팅
    4. Un-bind the object by setting the current object id of the window target to 0. : window target의 현재 object id 세팅으로 되어있는 object를 언바인드(0으로 바인드)
  • 이러한 objects를 사용하는 것에 관한 중요한 것은 애플리케이션에 하나 이상의 object를 정의할 수 있고, 옵션들을 설정할 수 있고, OpenGL의 상태를 사용하는 연산들을 시작할 때마다 선호하는 설정값으로 objects를 바인드할 수 있다.
  • 여러 object들을 3D 모델 데이터로서 컨테이너 objects들로 역할을 할 수 있고 그 중 하나를 그리기 원할 때마다 그 object를 바인드한다.
profile
Hello everyone

0개의 댓글