きたけんブログ

旅と趣味と

GLFWの導入

OpenGLのGUIやらイベント処理をしてくれるライブラリとして、GLUTが最も有名です。しかし1998年以降開発が行われていないことから、古くさく感じたり、或いはglutMainLoop()関数を呼び出すと、二度と戻ってこれない仕様に泣かされたり、使い勝手が悪い面があります。

そこでこれに代わって「GLFW」というライブラリを導入してみました。勿論クロスフォーマットです。そして、何よりメインループを自分で作れるので、終了処理を色々施せます。ただ日本語のドキュメントがほとんど存在しないので、英語を自分で読まないといけないですorz

※ 実行環境GLFW 2.7.1
Windows 7 Home Premium 64bit SP1 + Visual C++ 2010 Express SP1

  1. 下記サイトから、ソースコードもしくはコンパイル済みのバイナリーをダウンロードしてきます。自分でビルドしたくない場合は、後者をダウンロードし、ステップ2、3をスキップして下さい。
    https://www.glfw.org/
  2. ダウンロードしたやつを解凍し、「\glfw-2.7.1\support\msvc100\glfw.sln」を開きます(その他supportディレクトリにはVC2008用なんかもあるみたいです)。
  3. 何も考えずに「Debug」「Release」それぞれビルドします。「Permisson Deniedなんたら」とエラーが出たら、VCを管理者権限で起動したら解決しました。
  4. 吐き出された、もしくはダウンロードした「GLFW.dll」「GLFW.lib」「GLFWDLL.lib」をリンクして、「include\gl\glfw.h」をインクルードして準備は完了です。わたしは、プログラムファイルを触るのが好きではないので、作成するプログラムと同じディレクトリにコピーしました。うちの環境で、プログラムファイルにコピーするなら下記の通り。
    • 「GLFW.dll」は「C:\Windows\SysWOW64\」にコピー
    • 「GLFW.lib」「GLFWDLL.lib」は「C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\」にコピー
    • 「\include\GL\」にある「glfw.h」を「C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\gl\」にコピー

では実際に動かしてみます。

#include <gl/glfw.h>
#pragma comment(lib , "opengl32.lib")
#pragma comment(lib , "glfw.lib")		//スタティックリンクの場合
#pragma comment(lib , "glfwdll.lib")	//ダイナミックリンクの場合
int main(void)
{
  int running = GL_TRUE;
  //GLFWの初期化
  if(!glfwInit())
    return 0;
  //ウィンドウを開く
  if(!glfwOpenWindow(300, 300, 0, 0, 0, 0, 8, 0, GLFW_WINDOW))
  {
    glfwTerminate();
    return 0;
  }
  //ウィンドウタイトルの設定
  glfwSetWindowTitle("テスト");
  glEnable(GL_DEPTH_TEST);
  while(running)
  {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //描画
    glBegin(GL_POLYGON);
    glColor3d(1.0, 0.0, 0.0);
    glVertex2d(-0.9, -0.9);
    glColor3d(0.0, 1.0, 0.0);
    glVertex2d(0.9, -0.9);
    glColor3d(0.0, 0.0, 1.0);
    glVertex2d(0.9, 0.9);
    glColor3d(1.0, 1.0, 0.0);
    glVertex2d(-0.9, 0.9);
    glEnd();
    //ダブルバッファリングのバッファの交換
    glfwSwapBuffers();
    //ESCキーかXボタンで終了
    running = !glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam(GLFW_OPENED);
  }
  //終了処理
  glfwTerminate();
  return 0;
}

4行目、5行目はお好きな方をどうぞ。ダイナミックリンクの場合は、実行ファイルと同一ディレクトリに「GLFW.dll」を置いておきます。

16行目: glfwOpenWindow(int width = 640, int height = 480, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode)
ウィンドウを開きます。witdthとheightはウィンドウサイズ。redbits、greenbits、bluebits、alphabitsはRGBAそれぞれに何ビット使用するか。depthbitsとstencilbitsは、デプスバッファとステンシルバッファに何ビット使用するか。それぞれ0を設定するとデフォルト値になるようですが、デフォルト値がなんなのかよく分からないですorz modeでウィンドウモードとフルスクリーンモード(GLFW_FULLSCREEN)を選択できます。

47行目の変数runningで終了判定をしています。ここを自由に設定できるのがいいですね-。

そして実行結果です。

ss.png

また機会があれば(元気があれば?)ちゃんと3D描画してみます。