SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

VS2017でOpenGLとGLUTを使う手順

OpenGLを使って、簡単にクロスプラットフォームなコードを書くための、GLUTというライブラリがあります。
ちょっと必要に迫られて、久しぶりにGLUTを使う機会があったので、VS2017でGLUTを使うまでの手順をざっとまとめておこうと思います。

GLUT使うのは、5~6年ぶりくらいかな。。。
単純なグラデーションを描いたりしただけですが、とても懐かしい気持ちになりましたw

freeglut

glutはもう随分と長いこと更新されなくなっているので、現在はfreeglutという互換ライブラリが使われることが多いようです。
知らんかった。。。

なので、ここではfreeglutを使ってサンプルコードを書いています。

Nugetパッケージ

このご時世に、必要なdll一式などをWebサイトから自分でダウンロードしてきて用意するのはちょっと面倒ですよね。
ライブラリはパッケージマネージャ経由で管理したいものです。

Nugetで利用できるパッケージがないか探してみると、以下のようなものがありました。 * NupenGL * freeglut

NupenGLがいい感じ!!
NupenGLは、freeglut/GLFW/GLEWの3つのライブラリをまとめてインストールしてくれます。

Nugetパッケージにfreeglutという項目もありますが、
こちらはVS2010/VS2012向けのビルドとなっていて、それ以降の環境ではlibファイルのリンクでエラーになってしまいます。

一応VS2012のコンパイラがあれば、プロジェクトのプラットフォーム・ツールセットをVS2012のものに変更することでVS2017からも利用できます。
ですが、わざわざそんなことするより、NupenGLの方を使った方が何かとトラブルが少ないかと思います。

準備

Windows SDKの準備

OpenGLのヘッダーファイル類は、WindowsSDKに含まれています。

そのため、VS2017インストール時にWindowsSDKも一緒にインストールしておく必要があります。
(未インストールの場合は、VS2017のインストーラを起動し、以下の項目にチェックを入れて追加インストールしておきましょう)
f:id:minami_SC:20170423115452p:plain

プロジェクトの作成

新規プロジェクトでWin32コンソールアプリの空のプロジェクトを作成します。

f:id:minami_SC:20170423115502p:plain
f:id:minami_SC:20170423115507p:plain

Nugetでパッケージのインストール

Nugetパッケージの管理から、「nupengl.core」という項目をインストールします。

f:id:minami_SC:20170423115530p:plain
f:id:minami_SC:20170423115542p:plain

サンプル

以上で準備ができたので、サンプルコードを動かしてみます。

グラデーションのかかった四角形を書くだけの単純なコードです。

f:id:minami_SC:20170423115652p:plain

#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>

void disp(void) {
    glClear(GL_COLOR_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();
    glFlush();
}

int main(int argc, char ** argv) {
    glutInit(&argc, argv);
    glutInitWindowPosition(100, 50);
    glutInitWindowSize(300, 300);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

    glutCreateWindow("Hello GLUT!!");
    glutDisplayFunc(disp);
    glutMainLoop();
    return 0;
}