■ 2012年09月08日 [OpenGL][GLFW] (3) OpenGL のバージョンとプロファイルの指定
2012年09月18日 14:59更新
バージョンとプロファイルの指定
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 で, この場合はシステムの設定に依存します.
 
 
グラフィックスハードウェアが 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 では結構泥臭いことをしていたので, 喜ばしい限りです.
[コメントを投稿する]