床井研究室

バージョンとプロファイルの指定

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

グラフィックスハードウェアが 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;
}

Swap Interval もプラットフォームごとに設定方法やデフォルト値が違っていたりします。GLUT では結構泥臭いことをしていたので、喜ばしい限りです。