床井研究室

GLUT の現状

OpenGL は「プラットフォームに依存しないグラフィックス API」ですが、これと稼働するプラットフォームとのインタフェースの部分はやはりプラットフォームごとに異なっていて、そのあたりの実装はそれなりにめんどくさいものです。そのために、そこをうまくラップするツールキットがいくつも提案されています。中でも GLUT は、OpenGL を作ったところの人が作った、使いやすいツールキットです。また GLUT はマルチプラットフォームに対応しているため、これを使ったソースプログラムは Unix / Linux, Windows, Mac OS X の間で共通にすることができます。GLUT は OpenGL の初期に作られたものですが、OpenGL の学習や OpenGL を使った簡単なプログラムの作成を手軽に始めることができるため、今でも有用なツールキットです。

しかし、オリジナルの GLUT は (バグがあるにもかかわらず) もう長い間メンテナンスされていません。また Mac OS X に標準で搭載されている GLUT は OpenGL 2.1 しか使えず、Lion 以降で使用可能になった OpenGL 3.2 Core Profile を (公式には) 使用することができません。

gl3w というツールを使えば、GLUT でも OpenGL 3/4 の Core Profile を使うことができます。

また、オリジナルの GLUT 互換のツールキットとして freeglut や OpenGLUT が使われていますが、これらは Mac OS X には対応していません。

GLFW

OpenGL に対応していて GLUT のようにマルチプラットフォームで使用できるツールキットには、FLTK や Qt, SDL などがあります。中でも Qt は非常に高機能なツールキットであり、CG 関連のいくつかの主要なアプリケーションがこれを使って開発されていたりします。しかし、OpenGL の学習のためにあれこれ試したり、ちょっとしたプログラムを書いたりするには、Qt などはちょっと大きすぎる気がします。そこで GLUT の代わりになる簡単で小さなツールキットとして、試しに GLFW を使ってみようと思いました。プロジェクトのホームページ (http://www.glfw.org/) には、GLFW はウィンドウを作成し、OpenGL のコンテキストを作って、入力 (デバイス) を管理する、無料の、オープンソースの、マルチプラットフォームのライブラリだと書いてあります。ライセンスは unmodified zlib/libpng license を採用しています。

GLFW の特徴

まだ数日しか使っていないのですが、次のような特徴を持っているようです。

最初からダブルバッファリングになっていることや、マウスやキーボード、ジョイスティックの扱い方を見ると、GLFW は GLUT に比べてゲーム向きになっているように思われます。また GLUT にあって GLFW に無い機能の多くは、もともと OpenGL の Core Profile では使えない機能だと思います。Mac OS X の GLUT が Legacy Profile すなわち OpenGL 2.1 にしか対応していないのは、このような問題があるからかも知れません。あと、GLFW の Reference や User Guide がとても良くできているので、これらを読めばこのブログに書いてあるようなことは必要ないと思います。

GLFW のインストール

Windows (Visual Studio 2008/2010), Mac OS X (Xcode 4), Linux の場合について解説します。

Windows

プロジェクトのダウンロードページ http://www.glfw.org/download.html からバイナリファイル glfw-2.7.6.bin.WIN32.zip (2012 年 9 月 6 日時点) が入手できます。これには MinGW, Visual Studio 2008, Visual Studio 2010 のバイナリが入っています。

Mac OS X

Mac OS X では HomeBrew (http://mxcl.github.com/homebrew/) や Fink (http://www.finkproject.org/) などのパッケージを使うと楽です。

fink install glfw
brew install glfw

なお MacPorts (http://www.macports.org/) には用意されていないようです (2012 年 9 月 6 日時点)。

make cocoa
sudo make cocoa-install

shared library もインストールする場合は、さらに次のコマンドを実行してください。

sudo make cocoa-dist-install

GLFW 2.7.7 の時点では、make cocoa-dist-install も実行しないと、リンクエラーになります(西やんさんありがとうございました)。

Linux

Ubuntu, Fedora, OpenSUSE にはパッケージが用意されていると思います。使用しているディストリビューションのパッケージマネージャで検索してください。Vine Linux には用意されていないようです (2012 年 9 月 6 日時点)。その場合はソースをコンパイルしてください。

make x11
sudo make x11-install

shared library もインストールする場合は、さらに次のコマンドを実行してください。

sudo make x11-dist-install

プログラムの作成

以下に GLFW を使ったプログラムの処理手順を示します。

  1. GLFW の初期処理を行う
  2. ウィンドウを開く
  3. ウィンドウが開いている間描画を行う
  4. ダブルバッファリングのバッファの入れ替えを行う
  5. ウィンドウが閉じたら終了処理を行う

このソースプログラムは次のようになります。

#include <GL/glfw.h>

int main(int argc, char *argv[])
{
  glfwInit();

  glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW);

  while (glfwGetWindowParam(GLFW_OPENED))
  {
    /*
    ** ここで OpenGL による描画を行う
    */

    glfwSwapBuffers();
  }

  glfwTerminate();

  return 0;
}

glfwOpenWindow() の設定に問題がある (ハードウェアが対応していない設定を行ったなど) と、ウィンドウは開かれません。またウィンドウのクローズ動作はイベントとして取得されず、描画の前に glfwGetWindowParam(GLFW_OPENED) によってウィンドウが開いていることを確かめる必要があります。またイベントの取得は glfwSwapBuffers() あるいは glfwPollEvents(), glfwWaitEvents() で行いますので、これらが実行されなければイベントは取得されません (マウスやキーボードの操作を知ることができません)。

コンパイルの仕方

Windows

プログラムの作成は「Win32 コンソールアプリケーション」のプロジェクトを作成して行ってください。その際、作成したプロジェクトの「プロパティ」の「構成プロパティ」「リンカー」「入力」にある「追加の依存ファイル」に、opengl32.lib と GLFW.lib を追加してください。以下に手順の説明を用意しています。

あるいは、ソースプログラム (main() 関数を含むものだけでよい) の冒頭に次の 2 行を置くだけでも構いません。DLL を使う場合は、GLFW.lib の代わりに GLFWDLL.lib を指定してください。

#pragma comment(lib, "GLFW.lib")
#pragma comment(lib, "opengl32.lib")

コンソールウィンドウを開きたくない場合は、次の 1 行をこれに追加してください。

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

なお、この 1 行を追加すると次のような警告が出る場合がありますが、害はないので無視して構いません。

LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使ってください。

この警告を消したい場合は、次の行を追加してください。

#pragma warning(disable:4098)

Mac OS X

コマンドラインでコンパイルする場合は、-framework OpenGL -lglfw オプションを追加してください。

cc main.c -framework OpenGL -lglfw
c++ main.cpp -framework OpenGL -lglfw

Xcode を使ってプログラムを作成する場合は、プロジェクトの新規作成の際に Application の Command Line Tool のテンプレートを指定してください。その際、”Product Name” には作成するプログラムの名前、”Organization Name” には作成者の名前、”Company Identifier” には、Apple に開発者として登録しているなら Apple から取得した開発者 ID を指定しますが、開発者 ID を持っていなければ適当な文字列を設定してください。あと “Type” には使用するプログラミング言語を指定してください。

プロジェクトが作成されると、中に main.c あるいは main.cpp, main.m などといったファイルができています。これに main() 関数が定義されています。このほかに “プロジェクト名.1” というファイルも作られていますが、これは man 形式のオンラインマニュアルなので、マニュアルを書かないなら削除して構いません。次に、左のペインの「プロダクト名」を選んでから、その右の TARGETS のところの「プロダクト名」を選んで、中央の Build Settings を選んでください。そして、その下にある All を選んだのち、Other Linker Flags という項目を探し (右側に検索ボックスがあります) そこに -framework OpenGL -L/usr/local/lib -lglfw を設定してください。同様に Header Search Path という項目を探して、そこに /usr/local/include を設定してください。また Library Search Path という項目を探して、そこに /usr/local/lib を設定してください。なお、fink の場合は /usr/local のところを /sw にしてください。以下に手順の説明を用意しています。

あるいは、Build Phases を選んで OpenGL Framework と /usr/local/lib/libglfw.a を Link Binary With Libraries に追加しても構いません。ターミナルで次のコマンドを実行すればディレクトリ /usr/local/lib の内容が Finder に表示されますので、Drag & Drop でファイルをここに入れることができます。

open /usr/local/lib

たまに “Xcode cannot run using selected destination.” と表示されてビルドが失敗することがあります。その場合は Build Settings で Base SDK という項目を探して、設定内容を一度別のものに変更してから元に戻してみてください。

Linux

cc/c++ コマンドに -lGL -lglfw オプションを追加してください。

cc main.c -lGL -lglfw
c++ main.cpp -lGL -lglfw

たとえば、次のような Makefile を作っておくと便利です (下の例はタブが失われているのでコピペでは使えません)。「プログラム名」は作成するプログラム名に置き換えてください。C 言語を使う時は CXX と CXXFLAGS をそれぞれ CC, CFLAGS に、.cpp を .c にすべて置き換えてください。

CXXFLAGS        = -I/usr/X11R6/include -DX11 -Wall
LDLIBS  = -L/usr/X11R6/lib -lglfw -lGL -lm
OBJECTS = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
TARGET  = プログラム名

.PHONY: clean depend

$(TARGET): $(OBJECTS)
	$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@

clean:
	-$(RM) $(TARGET) *.o *~ .*~ core

depend:
	$(CXX) $(CXXFLAGS) -MM *.cpp > $(TARGET).dep

空のディレクトリにプログラムのソースファイルとこの Makefile を置き、最初に一度だけ make depend を実行してください (ヘッダファイルを追加した場合も実行してください)。以降は make だけでプログラムがコンパイル・リンクされます。

make depend
make

今後の予定

次回以降、GLFW を使って実際にプログラムを作成します。OpenGL 3.2 の Core Profile を使用する予定です。