おもちゃラボ

Unityで遊びを作ってます

【OpenGLでゲームを作る】GLFWを使ってウインドウを表示する

(2016年10月に追記修正)

早速OpenGLを使ってポリゴンを出したいところですが、まずはウインドウを出すところから始めましょう。といっても、OpenGLにはウインドウを出す機能はないため、その他のライブラリを使用する必要があります。

主なライブラリとしてはGLUTが有名でしたが、2016年現在開発が止まってしまっているため、今はGLFWが主流のようです。今回はこの中でも比較的コンパクトで小回りの効くGLFWを使っていきます。

今回のコンテンツは次のようになります。

GLFWを使ってウインドウを表示する流れ

GLFWを使ってウインドウを表示するまでの流れは次に示すように大きく分けると6つのステップからなります。このステップの3〜5がゲームループと呼ばれ、ゲームプログラムのメインになります。

  1. GLFWの初期化
  2. ウインドウの作成
  3. バッファのクリア
  4. ゲーム画面の描画
  5. ダブルバッファのスワップ
  6. GLFWの終了処理

GLFWでウインドウを表示するプログラム

上で書いた流れをプログラムにすると次のようになります。次のプログラムは「640x480」のサイズの濃灰色のウインドウを表示するだけのプログラムです。
 

#include <GLFW/glfw3.h>
#include <iostream>

const int g_width  = 640;
const int g_height = 480;

int main()
{
    // GLFWの初期化
    if( !glfwInit() ){
        return -1;
    }
    
    // ウインドウの作成
    GLFWwindow* window = glfwCreateWindow(g_width, g_height, "Simple", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);
    
     // ゲームループ
    while (!glfwWindowShouldClose(window)) {
        
        // バッファのクリア
        glClearColor(0.2f, 0.2f, 0.2f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        
        // ダブルバッファのスワップ
        glfwSwapBuffers(window);        
    }
    
    // GLFWの終了処理
    glfwTerminate();
    
    return 0;
}

上記のプログラムをコンパイルして実行すれば、下記のようなウインドウが表示さます。まだまだポリゴンを出す道のりは長いですが、のんびりやっていきましょう〜

f:id:nn_hokuson:20161021210929p:plain

ウインドウ表示プログラムの解説

まずはglfwInitメソッドを使ってGLFWを初期化しています。glfwCreateWindowメソッドでウインドウの作成を行います。第一引数と第二引数にウインドウの幅と高さを渡します。第三引数にはウインドウの上部に表示するウインドウ名を指定します。その他の引数についてはGLFWのリファレンスを参照してください。

GLFW: Reference

glfwSwapIntervalメソッドはダブルバッファ時(というかGLFWにはシングルバッファが無いので・・)のバッファの入れ替えのタイミングを指定しています。とりあえず、基本的にここの引数はデフォルト1にしておいて問題ありません。そうすると、パソコンモニタの書き換えタイミングと、GLFWのバッファの入れ替えタイミングを揃えてくれて綺麗に見えます。0にすると最高速でGLFWのバッファを最高速で入れ替えるのでティアリングが起こってしまいます。ティアリングって何?って方は↓の本に詳しく書かれています。
 

 
ゲームは1秒間に60枚めくるパラパラ漫画のようなものです。パラパラを繰り返すのがwhileのループで、このループをゲームループと呼びます。今後はwhile文のなかにゲームの本体を書いていくので、いままでの初期化処理を書き換えることが殆ど無いと思います。glfwWindowShouldCloseでウインドウが閉じられようとしているかをチェックします。ウインドウの閉じるボタンを押した時、このメソッドはfalseを返すので、ゲームループを抜けます。

f:id:nn_hokuson:20161021221827p:plain

glClearColor()はウインドウを塗りつぶす背景色を指定しています。実際にウインドウを塗りつぶすのはglClearメソッドなので注意して下さい引数はRGBAの順番で指定します。今回は(0.2f, 0.2f, 0.2f, 1.0f)を指定しているので濃灰色になります。glClearColorやglClearはGLFWのAPIではなく、OpenGLのAPIです。OpenGLのメソッドにはglのプレフィックス、GLFWのメソッドにはglfwのプレフィックスが付いています。
 
glfwSwapBuffers()ではダブルバッファの入れ替えを行います。ダブルバッファやスワップのお話はゲームを作る上で非常に重要な考え方なので、次回詳しく説明します。

nn-hokuson.hatenablog.com

ゲームループを抜けた後はGLFWを後始末するためglfwTerminateメソッドを実行しています。

まとめ

さて、これでOpenGLを使ってウインドウを出すためのひと通りの解説が終わりました。非常に長くなってしまいましたね。でも一つ一つのメソッドがやっていることは単純なので、意外とすんなり理解できたのではないでしょうか。次回はOpenGLで画面に点を打つという、ゲーム作りに向けた大きな第一歩を踏み出しましょう(笑)

参考図書

「チュートリアル形式で始めるOpenGL[2D編]」
kindleやiPadで読める電子書籍の参考書です。GUIのライブラリとして、珍しくGLFWが使われているのでとても参考になりました。また、どのチュートリアルにも完全なプログラムが乗っているので、一つ一つ手打ちしたい人にもおすすめです。200円という値段を考えると非常にお得な一冊だと思います!電子書籍の参考書ってどうなの?という人もお試しで買ってみる価値はあると思います。

私の書いたUnityの教科書でも、ゲームループの話をしています。気になる方はぜひ読んでみて下さい!