バージョンとプロファイルの指定
GLFW では、開くウィンドウで使う OpenGL のコンテキストのバージョンやプロファイルを指定できます。これは glfwOpenWindow() でウィンドウを開く前に、glfwOpenWindowHint() で指定します。
...
int main(int argc, const char *argv[])
{
// GLFW を初期化する
if (!glfwInit())
{
// 初期化に失敗した
std::cerr << "Can't initialize GLFW." << std::endl;
exit(EXIT_FAILURE);
}
// OpenGL Version 3.2 Core Profile を選択する
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// GLFW のウィンドウを開く
if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
{
// ウィンドウが開けなかった
std::cerr << "Can't open GLFW window." << std::endl;
exit(EXIT_FAILURE);
}
// 初期設定
init();
// 図形を表示する
while (glfwGetWindowParam(GLFW_OPENED))
{
// 画面消去
glClear(GL_COLOR_BUFFER_BIT);
/*
** ここで OpenGL による描画を行う
*/
glfwSwapBuffers();
}
return EXIT_SUCCESS;
}
void glfwOpenWindowHint(int target, int hint):glfwOpenWindow()によって開くウィンドウの特性を設定します。target には以下のものが指定できます (一部抜粋)。GLFW_OPENGL_VERSION_MAJOR: OpenGL のメジャーバージョン番号を hint に指定します。バージョンが 3.2 ならば 3 です。デフォルトは 1 です。GLFW_OPENGL_VERSION_MINOR: OpenGL のマイナーバージョン番号を hint に指定します。バージョンが 3.2 ならば 2 です。デフォルトは 1 です。GLFW_OPENGL_FORWARD_COMPAT: OpenGL の Forward Compatible Profile (前方互換プロファイル、古い機能が使えない) を使う場合は、hint にGL_TRUEを指定します。デフォルトはGL_FALSEです。GLFW_OPENGL_PROFILE: OpenGL のプロファイルを指定します。Compatible Profile を使う場合は hint にGLFW_OPENGL_COMPAT_PROFILE、Core Profile を使う場合は hint にGLFW_OPENGL_CORE_PROFILEを指定します。デフォルトは 0 で、この場合はシステムの設定に依存します。
設定できる target には、他にも
GLFW_STEREOやGLFW_REFRESH_RATEなどがあります。バージョン / プロファイルの指定や、GLFW_WINDOW_NO_RESIZEやGLFW_FSAA_SAMPLESなんかは GLUT には無かった機能なので、結構嬉しいです。
グラフィックスハードウェアが glfwOpenWindowHint() で指定した OpenGL のバージョンやプロファイルに対応していなければ、glfwOpenWindow() は失敗します。
開いたウィンドウに対する設定
一方、開いたウィンドウに対する設定は、glfwOpenWindow() でウィンドウを開いた後に行います。
...
int main(int argc, const char *argv[])
{
// GLFW を初期化する
if (!glfwInit())
{
// 初期化に失敗した
std::cerr << "Can't initialize GLFW." << std::endl;
exit(EXIT_FAILURE);
}
// OpenGL Version 3.2 Core Profile を選択する
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// GLFW のウィンドウを開く
if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
{
// ウィンドウが開けなかった
std::cerr << "Can't open GLFW window." << std::endl;
exit(EXIT_FAILURE);
}
// 開いたウィンドウに対する設定
glfwSwapInterval(1);
glfwSetWindowTitle("sample");
// 初期設定
init();
// 図形を表示する
while (glfwGetWindowParam(GLFW_OPENED))
{
// 画面消去
glClear(GL_COLOR_BUFFER_BIT);
/*
** ここで OpenGL による描画を行う
*/
glfwSwapBuffers();
}
return EXIT_SUCCESS;
}
void glfwSwapInterval(int interval): ダブルバッファリングにおける、バッファの入れ替えのタイミングを指定します。少なくとも interval に指定した回数だけ、ディスプレイの垂直同期タイミング (V-Sync, 帰線消去期間) を待ってからバッファの入れ替えを行います。普通は 1 を指定します。0 を指定するとディスプレイの垂直同期タイミングを待たなくなるため fps (frame per second) が上昇しますが、画面表示が正常に行われるわけではありません。ベンチマークのときくらいしか使いどころがないと思います。void glfwSetWindowTitle(const char *title): title に開いたウィンドウのタイトルバーに表示する文字列を指定します。文字列の文字コードは ISO 8859-1 (8-bit Latin 1) です。
Swap Interval もプラットフォームごとに設定方法やデフォルト値が違っていたりします。GLUT では結構泥臭いことをしていたので、喜ばしい限りです。