본문 바로가기

Library/Computer Graphics

Using OpenGL 3.x Implementations

OpenGL 3.2 스펙은 2009.8.3에 발표되었다. 당연히, 각 그래픽 하드웨어 벤더들은 OpenGL 3.2 extention 형태로 제공하기 시작했다. NVIDIA의 경우, ForceWare 190.18 이상에서 OpenGL 3.1 / 3.2 구현을 제공하며, ATI는 Catalyst 9.2 이상에서 해당 OpenGL 구현을 제공한다.

OpenGL을 사용하여 프로그래밍을 하고자 할 때, 가장 먼저 해야 할 일은 원하는 OpenGL 스펙을 만족하는 라이브러리를 찾는 것이다. OpenGL 1.4 버전은 대부분의 플랫폼에서 지원되며, 2.0 이상의 스펙을 원할 때는 Mesa3D와 같은 공개 구현물을 사용하면 된다. 그러나, 3.0 이상을 완전하게 구현하는 정적 라이브러리를 구하기 힘든데, 해당 라이브러리를 구하지 못했다고 하더라도 이를 사용할 수 있는 방법이 있다.

위에서도 말했지만, 각 벤더들은 dll과 같은 OpenGL extention을 제공한다. 따라서, 정적으로 링크되는 OpenGL 라이브러리가 1.4 버전이라고 하더라도 extention에서 제공하는 함수를 사용하여 외부 OpenGL 구현에 접근할 수 있다. 예를 들어, 윈도우 플랫폼이라면 위글(WGL) 함수를 사용하여 원하는 함수의 함수 포인터를 얻어낼 수 있는데, 이렇게 되면 정적으로 링크되는 OpenGL 버전에 상관없이 벤더가 제공하는 최신의, 외부 OpenGL 구현을 사용할 수 있게 된다. 즉, 원하는 OpenGL 구현을 사용하는 방법은 다음과 같이 정리할 수 있다.

첫째, 전통적인 방식대로 해당 OpenGL 스펙을 구현한 라이브러리를 구하고, 헤더와 라이브러리를 링크하여 빌드한다.

둘째, 그게 아니라면, 정적으로 링크되는 라이브러리에서 지원하는, OpenGL extention에 접근하는 함수를 사용하여 extention 구현을 얻고(이 extention에서 OpenGL Core에 대한 지원도 포함할 수 있다), 이를 사용하여 원하는 기능을 구현한다. NVIDIA나 ATI가 구현한 OpenGL 3.2를 사용하려면 이 방법을 사용해야 한다.

여기서 문제가 되는 것은, 한 코드에서 동적으로 원하는 OpenGL 버전을 선택할 수 없다는 것인데, 이것은 OpenGL이 COM과 같은 접근 방식을 택하지 않았기 때문에 어쩔 수 없는 일이다.


Reference
http://www.opengl.org/registry/
http://sites.google.com/site/opengltutorialsbyaks/introduction-to-opengl-3-2---tutorial-01