静寂とプログラミング

技術について書いたり、日常について書いたり

OpenGLをmac0S Catalinaで使う

macOS CatalinaでOpenGLをインストールする

環境

OS: macOS Catalina version 10.15.3

macOSでのOpenGLの扱い

macOSでは、OpenGLは非推薦になった。 けど自分の勉強のためや、ちょっと触ってみたいという時にOpenGLを使いたいということもあると思います。
OpenGLmacOSで使うためには、GLUTやGLFWをインストールすることで使うことができます。 これらは何かというと、 OpenGLによって描画するものをWindowを起動してそこに描画したり、キーボードやマウスの入力を受け取るために 使われるものです。

1. GLUT
このライブラリはOpenGLの初期に作られたライブラリだが、GLUTはバグがあるのに、メンテナンスがされていないらしい。また、そこで、OpenGL3.2 CoreProfileは使用することができません。

2. GLFW
これは、LinuxWindowsMacOSXで使うことのできるクラスプラットフォームなライブラリです。これを使うことでGLUTにはなかった多くの機能を使うことができます。 またGLUTでは、OpenGL2.1にしか対応してませんでしたが、GLFWではOpenGL3.2にも対応することができます。

ここら辺のGLUTなのかGLFWなのかの議論は*1*2でなされており、特に*3では、そもそもOpenGLって今から手をつける必要あるかを議論してくれているので、大変勉強になります。

OpenGLのVersionを確認する

OpenGLのバージョンを確認してみましょう。
*4に書かれているようなコードを加えると、自分が使っているOpenGLのバージョンを確認することができます。 私のOpenGLのバージョンはMacの標準バージョンの2.1でした。

GLFWのインストール

brew install glfw でインストールすることができます。ただ、homebrewをインストールしている必要がありますので、他の記事で適宜補ってください。

Exampleを書いてみよう

公式ドキュメントの*5にGLFWのExampleコードがあります。 これをまずは適当なファイルに保存してください。

#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;
}

このプログラムは、windowを立ち上げるだけのプログラムなので何か描画がされるわけではありません。実際にはwhileループ内で描画処理と更新処理を行う必要があります。

コンパイル

では、上のコードをコンパイルしましょう。 *6コンパイルスクリプトが書かれています。

clang++ -std=c++11 -stdlib=libc++ -lglfw3 -framework CoreVideo -framework OpenGL -framework IOKit -framework Cocoa -framework Carbon </path/to/cpp/file>

と書いてありますが、下の方に-lglfw3-lglfwに置き換えてくださいと書いてあるので、

clang++ -std=c++11 -stdlib=libc++ -lglfw -framework CoreVideo -framework OpenGL -framework IOKit -framework Cocoa -framework Carbon </path/to/cpp/file>

と書いてください。これで、コンパイルができるはずです。
あとは最後に、./a.outでwindowを立ち上げることができます。
プログラムを実行すると以下のようなwindowが立ち上がります。

f:id:dayama-daily:20200406232628p:plain
Exampleコードを実行した画面

おわりに

今回はOpenGLとGLFWの簡単なプログラムを実行するところまで書きました。GLUTだとスレッド処理が(おそらく...)書けなくて、困っていました。原因としてはglutMainLoop()という関数でループしており、他の処理が割り込めないためです。GLFWだとここら辺のループを自分で書くことができるので、自由が効いていいですね。他にもTextureの読み込みとかできる関数とかあるので、他の記事で紹介できたらなと思います。それでは。

参考