技術的なやつ

技術的なやつ

OpenGL入門したかった

思うところがあって OpenGL を触ることにしたのでメモを残していくことにした。

環境

Windows8.1、Visual Studio 2015
基本的には以下のページを見ながらやっていった。

qiita.com

Hello World

Visual C++ -> Win32 コンソールアプリケーション -> 空のプロジェクト作成。
NuGet パッケージの管理から nupengl.core をインストールする。OpenGL をいい感じにラップする freeglut、GLFW、GLEW というやつを全部インストールしてくれるらしい*1

「環境」のとこに貼り付けた Qiita の記事中にあったソースコードをペッと貼り付けて実行してみるが、unresolved external symbol __imp__glClear@4 とか言われる。
opengl32.lib をリンクするの忘れていた。Qiita の記事に書いていた。。。。

無事白いウィンドウが出てきてめでたい。

なんのこっちゃ分かってないが、なんだか良い資料が見つかったのでこれを読みながらぼちぼち理解しているところ。
とりあえず3.2.7節まで読んだ。
以下は白いウィンドウを出すプログラムに自分の理解コメントを加えたもの。

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

// コンソールウィンドウを開きたくない場合、以下のコメントアウトを外してください。
// #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

int main()
{
    // GLFW の初期化
    if (glfwInit() == GL_FALSE) {
        std::cerr << "GLFW の初期化に失敗しました。" << std::endl;
        return 1;
    }

    // ウィンドウの作成。レンダリングコンテキストの取得。
    // constでポインタの書き換えを禁止している(http://qiita.com/go_astrayer/items/63e8a059ae20a5d5e000)
    GLFWwindow* const window(glfwCreateWindow(640, 480, "Hello World", NULL, NULL));
    if (window == NULL) {
        std::cerr << "ウィンドウを作成できませんでした。" << std::endl;
        // GLFW の終了処理
        glfwTerminate();
        return 1;
    }

    // OpenGL の処理対象ウィンドウを設定する。
    glfwMakeContextCurrent(window);

    // 背景(クリア)色(RGBA)を指定する。OpenGL の API。
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

    // メインループ。ウィンドウが開いている間繰り返す。
    while (glfwWindowShouldClose(window) == GL_FALSE) {
        // 背景色でウィンドウをクリア。
        // カラーバッファ(画像表示)のみ指定。ウィンドウには他にデプスバッファ(隠面消去)、
        // ステンシルバッファ(型抜き)などがある。
        glClear(GL_COLOR_BUFFER_BIT);

        // 
        // ここで描画処理を行う
        // 

        // カラーバッファを入れ替える。裏画面と表画面の反転みたいな。
        glfwSwapBuffers(window);

        // マウス操作等のイベントを取り出して記録。プログラムの実行を停止させない。
        // glfwWaitEvents() はイベントの発生までプログラムを停止させる。
        glfwPollEvents();
    }

    // GLFW の終了処理
    glfwTerminate();

    return 0;
}