«(2) エラー処理, 初期設定の追加 最新 (4) シェーダの追加»

床井研究室

現在ここに和歌山大学外から連続してアクセスすると,2回目以降にアクセスできなくなる現象が発生しています.その場合はお手数をおかけしますが,ブラウザのキャッシュのクリアをお試しください.


■ 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 で, この場合はシステムの設定に依存します.
設定できる 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 では結構泥臭いことをしていたので, 喜ばしい限りです.


編集 «(2) エラー処理, 初期設定の追加 最新 (4) シェーダの追加»