コンピュータの表示周りは本当に複雑で、知識が追い付かず良くわからない事も多い。私がコンピュータを触り始めた頃のは、Direct XもOpenGLも既にあった(はず)。最初にアサインされたプロジェクトは、OpenGLを組み込んだMFCアプリケーションの開発のお手伝いだった。それもよく分からないままアサインされて、いろんな人の助けを借りながら仕事をしていた。今だにグラフィックス関連には少し苦手意識があるし、よく分かっていない。普段やっている仕事であれば特に意識する必要もない事が多く、その存在すら忘れている。ただ、たまに、ふとした瞬間に、グラフィックス関連に起因する問題に触れる事がある。そういう時は、まず途方に暮れてみて、次に散歩してみて、そしてお酒を飲んで問題を忘れようとする。でも結局対処する必要に迫られ、Webの検索結果にヒットした、著者が誰なのかよく分からないような記事を見て、問題の回避方法を見つけてお茶を濁している。本当にこんな事で良いのかと考えると良い訳がない。だから今回は、少しだけOpenGLについて学んでみようと思う。
OpenGL関連のライブラリはいくつかあって、これが本当によくわからないのだが、ちゃんと読めばその違いは何となくわかる。
名称 | 雑な説明 |
---|---|
OpenGL | コンピュータグラフィックスライブラリの一つ |
GLU | 失われし技術 |
GLEW | OpenGLの拡張機能を使い易くする為のライブラリ |
GLFW | 目的はGLUTと同様だが、より軽量化する事を重要視している |
GLUT | OpenGLを利用する際の周辺のコードをマルチプラットフォーム化するGUIツールキット |
OpenGLのバージョン
まずはOpenGLのバージョンから確認していく。ホストにはメインマシンとして使用しているmacOSを利用する。このマシンには、グラフィックカードとして Intel Iris Plus Graphics 640
が搭載されている。調べてみると、このグラフィックカードはOpenGL 4.5に対応している12。
macOSには非推奨ではあるがOpenGLが、あらかじめ /System/Library/Frameworks/OpenGL.framework
にインストールされている。 Currentとしてシンボリックリングがあり、そのリンクの先にOpenGL関連のファイルがある。ここに梱包されているファイルからOpenGLのバージョンを確認できなかったが、とりあえず4.5がインストールされていると考え、利用してみる事にする。
なおOpenGLのダウンロード方法は https://www.khronos.org/opengl/wiki/Getting_Started に記載がある。macOSの場合、OS自体に梱包されているため、更新したい場合はOSをアップグレードする必要がある。
GLFWを使う
OpenGLを直接使う事はもちろんできるのだが、その表示をOSが要求する方法で行う為には、そのOS固有の実装をお膳立てする必要がある。例えばmacOSでCocoaフレームワークを使用するのであれば、Cocoaを使用したフレームを用意する等をしなければならない。当然そのためにはCocoaの知識が必要になる。今回はOpenGLを学びたいという事を考えると、本来の目的から大きく逸れてしまう。OpenGLには元々そういった問題意識を持つ人がいて、それらの環境差分を吸収する為のツールキットがいくつか実装されている。それがGLUTであったり、freeGLUTであったり、GLFWだ。GLUTやfreeGLUTは大きな実装で様々な機能が提供されている。それに比べてGLFWは軽量なツールキットとして実装されている。今回は、OpenGLを使う方法を確認したいだけである為、GLFWを使用する。
準備する
GLFWのインストール方法は様々な形で提供されている。それぞれの要求を満たす方法でインストールすれば良い。例えばmacOSでHomebrewを使用している場合、次のようにインストールできる。
brew install glfw
公式のサイトには事前ビルド済みバイナリも配布している3。今回はGLFWをどのように読み込んでいるのかについても確認したい。そのためパッケージマネージャは使用せず、事前ビルド済みバイナリのアーカイブをダウンロードし、手動で展開した。
アーカイブを展開すると glfw-3.3.8.bin.MACOS
というディレクトリの配下に、ファイルが展開される。便宜上このディレクトリへのシンボリックリンクを作成した。
ln -s glfw-3.3.8.bin.MACOS glfw
コードを作成する
ビルドする前に、ビルドする対象のコードを記述する。これは何でも良いのだが、今回はGLFWの公式ドキュメントに掲載されている「Example code」を利用する事にした4。
#include <GLFW/glfw3.h>
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
ビルドする
準備したコードをビルドする。今回はmacOS上で実行しているため、コンパイラにはclangを使用する方が、Cocoaの解決をしやすそうだったため、clangを使用する。clangには -framework
オプションがある。これはmacOSが管理しているフレームワークを利用可能にするオプションだ。例えばCocoaを使う場合は -framework Cocoa
を指定する。GCCを使用する場合は、これらを良い感じに自分で設定しないといけない5。確認するとOpenGL、Cocoa、IOKitが必要だった。更に先程ダウンロードしたGLFWを指定する。
clang -framework OpenGL -framework IOKit -framework Cocoa \
-lglfw3 \
-Lglfw/lib-x86_64 \
simple_glfw.c
出力ファイルを特に指定していない為、a.outという実行可能ファイルが生成される。
実行
生成された実行可能ファイルを実行すると、ウィンドウが開き、黒い画面が表示される。
./a.out
OpenGLに実装は含まない
OpenGLとはAPI仕様の事であり、その実装について言っていない。OpenPGPとGNU Privacy Guardの関係に似ている。OpenPGPは公開し規定されたPGPの仕様であり、その実装としてGNU Privacy Guardがある。OpenGLは公開し規定された仕様であり、その実装として各種ベンダーがライブラリを提供している。またその実装の1つとして、Mesaがある。
memo
https://kamino.hatenablog.com/entry/opengl-prior-knowledge