GLFWを通してOpenGLを使用するには初期化処理が必要です。初期化には以下のソースコードが対応します。
.. code-block:: cpp :linenos:
// OpenGLを初期化する if (glfwInit() == GL_FALSE) { fprintf(stderr, “Initialization failed!\n”); return 1; }
上記のコードの中で glfwInit()
メソッドが初期化処理をします。もし初期化が成功すれば
GL_TRUE
を、失敗すれば GL_FALSE
を返します。
ここでは初期化が失敗し GL_FALSE
が返されたときにエラーメッセージを表示して、プログラムを停止しています。
少し難しくなりますが fprintf
関数の第1引数に stderr
と書くとエラーメッセージとして、
第2引数に渡された文字列である Initialization failed が出力されます。
ウィンドウを作成するには glfwCreateWindow
関数を使います。この関数は、必ず上記の初期化の後で呼び出してください。
対応するソースコードは以下のようになります。
.. code-block:: cpp :linenos:
// Windowの作成 GLFWwindow *window = glfwCreateWindow(WIN_WIDTH, WIN_HEIGHT, WIN_TITLE, NULL, NULL); if (window == NULL) { fprintf(stderr, “Window creation failed!”); glfwTerminate(); return 1; }
実際にウィンドウを作成する関数は glfwCreateWindow
関数です。こちらは5つの引数を取ります。
重要なのは最初の3つで、先頭から順に「ウィンドウの幅」、「ウィンドウの高さ」、「ウィンドウの名前」です。
残りの4つ目の引数はフルスクリーンモードにするときに使用する引数、5つ目の引数は別のウィンドウを描画内容を
共有するときに使う引数なのですが、このコースでは使用しないので、基本は NULL
を渡しておけば大丈夫です。
この glfwCreateWindow
関数はウィンドウを表す GLFWwindow
型のポインタを返します。
ウィンドウの作成に失敗した場合には、このポインタが NULL
になるので、もし NULL
であれば、
エラーメッセージを出力してプログラムを停止します。
この時、 glfwInit
関数を呼び出したあとであれば、必ず glfwTerminate
関数を呼ぶ必要があるので注意してください。
OpenGLでは描画の状態を保存するためにコンテキストと呼ばれるオブジェクトを作る必要があります。 これを今の時点で正確に説明するのは難しいのですが、概ね、OpenGLで扱う描画の状態等を保存するためのものだと思ってください。
このコンテキストを生成するためのコードは以下の行になります。
.. code-block:: cpp :linenos:
// OpenGLの描画対象にWindowを追加 glfwMakeContextCurrent(window);
今回のプログラムでは、背景に色をつけて画面を表示します。
その背景の描画色を決定する関数が glClearColor
関数です。
対応するソースコードは以下の部分です。
.. code-block:: cpp :linenos:
// 背景色の設定 glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClearColor
関数は4つの引数を持ち、それぞれが赤、緑、青、アルファ値に対応します。
各色ちゃんねるの値は0から1までの値を取り、例えば(1, 1, 1, 1)が与えられると白色に、
(1, 0, 0, 0.5)が与えられると透明度が50%の赤色になります。
.. code-block:: cpp :linenos:
// メインループ while (glfwWindowShouldClose(window) == GL_FALSE) { // 描画 drawOpenGL();
// 描画用バッファの切り替え
glfwSwapBuffers(window);
glfwPollEvents(); }
この部分ではウィンドウが表示されている限り続くwhileループが書かれています。
まず、whileの終了判定に使われている glfwWindowShouldClose
関数は、
現在ウィンドウが開かれているのか閉じられているのかを調べます。
閉じられているときには GL_TRUE
が返ってくるので、そうでない場合、
すなわち GL_FALSE
が返ってきている間は描画を継続します。
描画部分は drawOpenGL
関数の中で処理を記述することにします。
現在のこの関数の定義は、このようになっています。
.. code-block:: cpp :linenos:
// ユーザ定義のOpenGL描画 void drawOpenGL() { // 背景色の描画 glClear(GL_COLOR_BUFFER_BIT); }
ここでは、先ほど glClearColor
関数で設定した色を使って画面を塗りつぶす処理を書いています。
その役割を担うのが glClear
関数です。この関数の引数には現在 GL_COLOR_BUFFER_BIT
という
定数が渡されていますが、この定数が渡されているときには glClear
関数により画面の色が塗りつぶされます。
全てのソースコードが上手くかけていれば、以下のような赤一色で塗りつぶされた画面が表示されるはずです。
.. image:: ./figures/001_opengl_window.jpg :width: 250px
glClearColor
に渡されている色を別の色に変更して、変化を調べるglClear
をコメントアウトしたときに背景色がどうなるかを調べる