« ^ »

GLFWを使う

所要時間: 約 6分

コンピュータの表示周りは本当に複雑で、知識が追い付かず良くわからない事も多い。私がコンピュータを触り始めた頃のは、Direct XもOpenGLも既にあった(はず)。最初にアサインされたプロジェクトは、OpenGLを組み込んだMFCアプリケーションの開発のお手伝いだった。それもよく分からないままアサインされて、いろんな人の助けを借りながら仕事をしていた。今だにグラフィックス関連には少し苦手意識があるし、よく分かっていない。普段やっている仕事であれば特に意識する必要もない事が多く、その存在すら忘れている。ただ、たまに、ふとした瞬間に、グラフィックス関連に起因する問題に触れる事がある。そういう時は、まず途方に暮れてみて、次に散歩してみて、そしてお酒を飲んで問題を忘れようとする。でも結局対処する必要に迫られ、Webの検索結果にヒットした、著者が誰なのかよく分からないような記事を見て、問題の回避方法を見つけてお茶を濁している。本当にこんな事で良いのかと考えると良い訳がない。だから今回は、少しだけOpenGLについて学んでみようと思う。

OpenGL関連のライブラリはいくつかあって、これが本当によくわからないのだが、ちゃんと読めばその違いは何となくわかる。

名称雑な説明
OpenGLコンピュータグラフィックスライブラリの一つ
GLU失われし技術
GLEWOpenGLの拡張機能を使い易くする為のライブラリ
GLFW目的はGLUTと同様だが、より軽量化する事を重要視している
GLUTOpenGLを利用する際の周辺のコードをマルチプラットフォーム化する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をどのように読み込んでいるのかについても確認したい。そのためパッケージマネージャは使用せず、事前ビルド済みバイナリのアーカイブをダウンロードし、手動で展開した。

curl -o glfw-3.3.8.bin.MACOS.zip  https://github.com/glfw/glfw/releases/download/3.3.8/glfw-3.3.8.bin.MACOS.zip
glfw-3.3.8の事前ビルド済みバイナリのアーカイブをダウンロードする
unzip glfw-3.3.8.bin.MACOS.zip
ダウンロードしたアーカイブを展開する

アーカイブを展開すると 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

https://res.cloudinary.com/symdon/image/upload/v1680414715/blog.symdon.info/1680326114/opengl-glfw.png

OpenGLに実装は含まない

OpenGLとはAPI仕様の事であり、その実装について言っていない。OpenPGPとGNU Privacy Guardの関係に似ている。OpenPGPは公開し規定されたPGPの仕様であり、その実装としてGNU Privacy Guardがある。OpenGLは公開し規定された仕様であり、その実装として各種ベンダーがライブラリを提供している。またその実装の1つとして、Mesaがある。

memo

https://kamino.hatenablog.com/entry/opengl-prior-knowledge