WindowsかMac OS XでOpenGL事始め

OpenGLフレームワークであるGLFWと、OpenGL拡張APIの使用をサポートするGLEWと、OpenGL向け算術関数ライブラリであるGLM(今回はダウンロードだけ)を使い、Visual Studio 2013 ExpressとXcode 5.0でOpenGLでプログラムを書くまでの手順です。

自分向けのメモです。初めにWindowsでの手順を書き、次にMacでの手順を書きます。WindowsではVisual Studioの使い方は省略しています(調べればすぐ分かると思います)。

—–

【GLFW】

wglCreateContext()とかwglMakeCurrent()とかプラットフォーム固有の面倒な初期化処理をラップして扱うために、GLFWは非常に便利です。昔はGLUTが有名でした。

公式の安定版ダウンロードはここです。Visual Studio 2010 / 2012用はこれを使えばよいです。しかし、現時点でVisual Studio 2013用のバイナリがないので、自分でビルドします。ビルドにはCMakeが必要です。

GitHubのリポジトリはここです。安定版であるGLFW 3.0.3のタグはここです。Visual Studio 2013からGitをサポートした(らしい)のですが、CMakeでビルドするまでVisualStudioでは開けない(はず)なので気を付けてください。面倒な人は画面右下の”Download ZIP”を押せばソースコードがzipで降ってきます。

ソースコードを置く場所を決めて展開・移動させ、CMakeを開き、Configure & Generateします。対象のコンパイラは”Visual Studio 12″です。オプションで、DLLを作ったり、WGLの代わりにEGLを使ったりすることができます。

CMakeでビルドしたフォルダにある”GLFW.sln”を開き、DebugとReleaseの構成でビルドします。”0 失敗”なら成功です。試しにx64でビルドしたら失敗しました。ライブラリが”src/(Debug|Release)/glfw3.lib”にあります。動作確認のための実行ファイルも”tests”や”examples”っフォルダにあるので、必要に応じて試します。

GLFWはzlibライセンスです。ソースコードの配布も、ライセンス表示も不要です。

■Xcodeでは

CMakeでビルドするところまでの手順は同じです。

CMakeビルド後、”GLFW.xcodeproj”を開き、DebugとReleaseの構成でビルドします(構成の変更はcommand+shift+<キーを押し、Build Configurationを変更します)。ライブラリが”src/(Debug/Release)/libglfw3.a”にあります。動作確認のための実行ファイルも”tests”や”examples”っフォルダにあるので、必要に応じて試します。

また、Schemeを”ALL_BUILD”から”install”に変更し、同様にビルドすると、/usr/localディレクトリにインストールされます。アンインストールはSchemeを”uninstall”に変更します。

【GLEW】

Window SDKにはOpenGL 1.x(1.1とか1.3とか1.5とか聞くけど正解がどれか知らない)までのAPI定義しかなく、それ以降はwglGetProcAddress()で一つ一つ関数ポインタを取得する必要がありますが、GLEWはOpenGL 4.4を含む最新のOpenGLのAPIとグラフィックスドライバ固有のAPIをC/C++から簡単に呼び出せる形にしてくれます。

公式の安定版ダウンロードはここです。Visual C++6 / Visual Studio 2010用はこれを使えばよいです。しかし、現時点でVisual Studio 2013用のバイナリがないので、自分でビルドします。

GitHubのリポジトリはここです。安定版であるGLEW 1.10のタグはここです。…しかし、GNU MakeやPerlがないとglew.cが生成されないようで、ビルドが通りません(OpenGL拡張のtxtから動的にヘッダを生成しているのでしょうか)。MSYSを使うこともできますが、面倒なので代わりに公式サイトトップにソースコードが置いてあるので、そちらを使います。

ソースコードを置く場所を決めて展開・移動させ、”build/vc10/glew.sln”を開き、C++コンパイラとライブラリをアップデートします。ビルド構成にある”Debug MX”と”Release MX”は、マルチスレッド対応版です(今回は使わない)。

普通にビルドすると”error RC2102: string literal too long”でリソースコンパイルに失敗します。そこで、リソースファイルを編集します。”build/glew.rc”を開き、”Mesa 3-D graphics”の直前にダブルクオート(「”」←これ)を2つ挿入し、さらにその2つのダブルクオートの間に改行を入れてから保存します。これでビルドできます。ライブラリが”lib/(Debug|Release)/Win32/glew32**.lib”に、DLLが”bin/(Debug|Release)/Win32/glew*.dll”にあります。

スタティックリンクライブラリを使うには注意が必要です。この状態ではGLEWの関数が一切利用できません。これは、glew.hで関数に__declspec(dllimport)修飾子がついてしまうためです。修正するには、GLEWを利用するプロジェクトのソースコードでglew.hをインクルードする前に”#define GLEW_STATIC”を定義するか、プロジェクトのプリプロセッサの定義にGLFW_STATICを追加します。[参考文献1]

GLEWは修正BSDライセンスなので、ソース・バイナリの配布時にライセンスを記したファイルを同梱してください。

■XCodeでは

ダウンロードするところまでの手順は同じです。XcodeのCommand Line Toolをあらかじめインストールしておいてください。

ターミナルでglewディレクトリ内のMakefileがある場所に移動し、”make all”コマンドを実行します。デフォルトでRelease(というか-O2)でビルドされるようで、静的ライブラリと共有ライブラリが、シングルスレッド版とマルチスレッド版両方それぞれ出力されます。

“sudo make install”で/usrにインストールされますが、なぜかglew.hもlibGLEW.aもnot foundになってしまいます。原因はよく分かりませんが、stackoverflowによると、/usr/localにインストールすると正しくビルドできるそうです。”sudo make install GLEW_DEST=/usr/local”とすることで、正しくビルドできるようになりました(sudoは必要ないかもしれません)。

他のmakeオプションは公式サイトに書かれています。

—–

【GLM】

DirectX MathのOpenGL版です。SIMDにも対応し、CUDAからも読み込めます。

公式の安定版ダウンロードはここです。GitHubのリポジトリはここです。testはCMakeでのビルドが必要ですが、利用するためのAPIはヘッダファイルのみで構成されており、ビルドは必要ありません。単にインクルードパスを指定するか、自分のプロジェクトに同梱するだけで使えます。

GLMはMITライセンスなので、ソース・バイナリの配布時にライセンスを記したファイルを同梱してください。

—–

【動かしてみる】

ちょうどいいタイミングでもんしょの巣穴さんがGLFWのサンプルを書かれていたので[参考文献2]、アレンジを入れつつGLEW込みで使えるよう改変しました。

多々手抜きがあるのはご愛嬌。とりあえず青いウィンドウが出ればOKです。無理矢理GLEWを使うために、glBeginQuery/glEndQuery()を呼び出しています。OpenGL 3.2以降を使うときは、コメントアウトされているプロファイルを指定してください。

// OpenGL test
#define GLEW_STATIC

#include <stdio.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>

#ifdef _WIN32
#pragma comment( lib, "glfw3.lib" )
#pragma comment( lib, "opengl32.lib" )
#ifdef NDEBUG
#	pragma comment( lib, "glew32s.lib" )
#else
#	pragma comment( lib, "glew32sd.lib" )
#endif
#endif // _WIN32

#define SCREEN_WIDTH (800)
#define SCREEN_HEIGHT (600)

static void error_callback(int error, const char* description)
{
	fputs(description, stderr);
}

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
	if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
	{
		glfwSetWindowShouldClose(window, GL_TRUE);
	}
}

static void init()
{
}

static void paint()
{
	glClearColor(0.0f, 0.0f, 0.5f, 1.0f);
	glClearDepth(1.0f);
	glClearStencil(0);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

	glEnable(GL_CULL_FACE);
	glCullFace(GL_BACK);

	glBeginQuery(GL_TIME_ELAPSED, 1);
	glEndQuery(GL_TIME_ELAPSED);
}

int main(int argc, char* argv[])
{
	glfwSetErrorCallback(error_callback);
	if (!glfwInit())
	{
		return -1;
	}

	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
	glfwWindowHint(GLFW_RED_BITS, 8);
	glfwWindowHint(GLFW_GREEN_BITS, 8);
	glfwWindowHint(GLFW_BLUE_BITS, 8);
	glfwWindowHint(GLFW_ALPHA_BITS, 8);
	glfwWindowHint(GLFW_DEPTH_BITS, 24);
	glfwWindowHint(GLFW_STENCIL_BITS, 0);
	//glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	//glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);
	glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
	GLFWwindow* window = glfwCreateWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "GL Sample", NULL, NULL);
	if (!window)
	{
		glfwTerminate();
		return -1;
	}

	glfwMakeContextCurrent(window);
	glfwSetKeyCallback(window, key_callback);
	glfwSwapInterval(1);

	auto glewErr = glewInit();
	if (glewErr != GLEW_OK)
	{
		puts((const char*)glewGetErrorString(glewErr));
		return 1;
	}

	init();

	while (!glfwWindowShouldClose(window))
	{
		paint();
		glfwSwapBuffers(window);
		glfwPollEvents();
	}

	glfwDestroyWindow(window);
	glfwTerminate();
	return 0;
}

Visual Studioでは、インクルードパスとライブラリのディレクトリを指定してくださ(動的リンクのときは”#define GLEW_STATIC”をコメントアウトし、DLLにパスを通す)。

■Xcodeでは

プロジェクトの”Build Settings”の”All”を押し、”Search Paths”の”Header Search Paths”に”/usr/local/include”を追加し(入力欄ダブルクリックして+を押す)、”Library Search Paths”に”/usr/local/lib”を追加します。

次に、”Build Phases”に切り替え、”Link Binary With Libraries”に”CoreVideo.framework”、”IOKit.framework”、”Cocoa.framework”、”OpenGL.framwework”を追加します。そして、ファインダーで”/usr/local/lib”に移動し(ターミナルを開いて”open /usr/local/lib”と入力するのが楽[参考文献3])、”libGLEW.a”と”libglfw3.a”をドラッグ&ドロップします。

——

【まとめ】

OpenGLでプログラムを作るまでの準備を行いました。

TODO: GLMを使ったモデル表示、GLEWの完全自前ビルド

——

【補足:Mac OS XでOpeGL 3.2以降を利用するには】

glfwCreateWindow()の前に次の指定が必要です(この指定がなければ、OpenGL 2.1以前しか利用できません。床井先生様様です)。


glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

Intel HD Graphics 4000 + Mac OS X Mavericks(10.9)の環境で、OpenGL 4.1が使えることを確認しました。ちなみに、MacでのGPU別の利用可能APIの一覧はAppleのDeveloperサイトにあります。

——

【参考文献】

  1. GLEWのスタティックリンク(静的リンク)ライブラリの使用方法、Xeo Notes
  2. WindowsでOpenGLを使うために、もんしょの巣穴
  3. ゲームグラフィックス特論 第1回 講義ノート、Kohe Tokoi
広告

WindowsかMac OS XでOpenGL事始め」への2件のフィードバック

  1. XcodeでBuildPhase内のLink Binary with Libraries内で 自動的にglfwのライブラリを探せるようにするにはどのようにすれば良いでしょうか?
    ご存知でしからばご教授下さい

    • 残念ながら、私もわかりません。申し訳ありません。
      VisualStudioでいうプロパティシートのような機能があればなんとかなるかもしれませんが…

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中