[Work/Class/OpenGL]

OpenGLを使った3Dグラフィックプログラミング授業資料

概要

OpenGLはマルチプラットフォームの3D描画ライブラリであり,GPUによるハードウェアアクセラレーションが可能で,複雑な図形の高速な描画に対応している.

OpenGLは基本的にはC言語から使うが,C++,Java(やProcessing),Python,Rubyなど主要な言語から使える他,特筆すべきはOpenGL ver.2系以降をベースとしたWebGLによりJavaScript,つまりWebブラウザから実行可能となる.各言語では関数名の頭にクラスを表す接頭辞が付くぐらいで基本的に全く同じ手順でプログラムを書くことができるため,C言語でOpenGLを学べば,ほぼすべてのプラットフォームで利用可能となる.

また本授業では,OpenGL ver.1.x系ではGLUT,ver.2系以降(正確には本授業ではWindows, OSX, macOS共に対応している3.2を扱う)ではGLFWというマルチプラットフォームのウィンドウ&イベントマネージャライブラリを用いる.これによりWindows,OSX,Linux等のOSで本授業のコードは利用可能である.

それに加えver.2系以降では,JavaScriptによるOpenGL実装WebGLを扱う.これによりWebブラウザでOpenGLを扱えるようになるため,Webアプリ制作なども行うことができる.

また,3以降の機能を使うためにGLEWライブラリ(ハードウェア・ドライバ的には対応しているがAPIがOS側のOpenGLライブラリで提供されていないAPI群をまとめたライブラリ)を,OpenGL ver.2系以降の変換用行列を生成・演算するためのglmというC++言語(特にC++11で効果が高い)で記述された行列演算ライブラリを用いる.(WebGLにもglm類似ライブラリが多種あるので,それを用いる)

なお本授業の受講にあたってはProcessingの基礎が既習であることが望ましい.イベント関数などの詳細の説明を省くためである.また,OpenGL ver.2系以降ではC++言語を使用するがglmライブラリを使うための限定的な使用であるので,C++言語を習得している必要はない.

コンテンツ

OpenGL 1.x系

  1. GLUTを使いWindowを作り,イベントをアサインする
  2. OpenGL 1.x系の平行・垂直投影 - 3次元座標系の中での2次元グラフィック描画とアニメーション
  3. OpenGL 1.x系の透視投影 - 3Dグラフィックのプリミティブなオブジェクトの表示とカメラの設定・移動
  4. 3Dグラフィックの座標系と変換・視点の移動

OpenGL 2系以降(本授業資料中のコードはver.3.2を対象とする)

  1. GLUTに代わりGLFWを使う
  2. glmによる変換行列生成と頂点シェーダ
  3. WebGLで書いて実行してみる
  4. フラグメントシェーダとライティング(Phongシェーディング)
  5. モデリングしたオブジェクトのWebGLでの読み込みと表示

授業の下準備

Windowsの場合

まっさらな状態からのMSYS2+GCCでWindows上にC言語とC++の環境を整えるの通りにコンパイラ環境を整える.

その後「MSYS2 MSYS」ショートカットで起動する端末エミュレータから,

$ pacman -S mingw64/mingw-w64-x86_64-freeglut
$ pacman -S mingw64/mingw-w64-x86_64-glfw
$ pacman -S mingw64/mingw-w64-x64_64-glew
$ pacman -S mingw64/mingw-w64-x86_64-glm

の四つのパッケージをインストールしておく.

コンパイルは「MSYS2 MinGW 64-bit」ショートカットで起動する端末エミュレータから,

#GLUTを使ってOpenGL1.x系をコンパイルする
$ /mingw64/bin/x86_64-w64-mingw32-gcc GLプログラムのファイル名.c -o 実行ファイルのファイル名.exe \
    -lopengl32 -lglu32 -lfreeglut -static -static-libgcc -static-libstdc++
#GLFW, GLEW, glmを使ってOpenGL2系以降をコンパイルする
$ /mingw64/bin/x86_64-w64-mingw32-g++ GLプログラムのファイル名.cpp -o 実行ファイルのファイル名.exe \
    -lopengl32 -lglew32 -lglfw3 --std=c++11 -static -static-libgcc -static-libstdc++

とする.(glmはヘッダファイルのみ)

MSYS2の端末エミュレータ外から実行するとき(例えばExplorerからダブルクリックで実行するとき)は,MSYSをインストールした場所\mingw64\binからlibfreeglut.dllglfw3.dllをプログラムを実行する場所にコピーしておく.

OSX, macOSの場合

授業は基本的にWindowsで行うが,プログラムコード自体はOSX, macOSでも動作するようなプログラムを作成する.

標準状態ではGLFWライブラリとglmライブラリ, GLEWライブラリが入っていないので,以下に簡単に手順をまとめる.(ただしOSXの場合自分のコンピュータにのみインストールを行うこと.学校のマシンには入れてはいけない.)

GLFW,GLEW,glmはHomebrew等OSX用パッケージマネージャで入らないわけではないのだが,2017年1月現在は収録されているバージョンが非常に古く本授業資料のコードがコンパイルできないことがあるため,ソースコードから入れる必要がある.

  1. XCodeをインストールした後,(必要があれば)CommandLineToolsをインストールする(El Capitan+XCode8系は必要ない).
  2. GLFW3をダウンロードし,解凍する.
  3. 解凍したディレクトリ内で$ cmake .
  4. $ make
  5. $ sudo make install
  6. glmをダウンロードし,GLFW3と同様に解凍したディレクトリ内で$ cmake .し,$ make$ sudo make installする.
  7. GLEWのページからダウンロードし解凍したディレクトリ内で,$ make GLEW_DEST=/usr/local$ sudo make GLEW_DEST=/usr/local installする.

と,すると,/usr/local/lib/にライブラリが,/usr/local/includeにヘッダファイルが入る.コンパイルは「Terminal.app」から,

#GLUTを使ってOpenGL1.x系のプログラムをコンパイルする
$ clang GLプログラムのファイル名.c -o 実行ファイルのファイル名 \
    -framework OpenGL -framework GLUT -mmacosx-version-min=10.8 
#GLFWとglmを使ってOpenGL3.2のプログラムをコンパイルする
$ clang++ GLプログラムのファイル名.cpp -o 実行ファイルのファイル名 \
    -I/usr/local/include \
    -L/usr/local/lib \
    -lglfw3 -lGLEW \
    -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo \
    --std=c++11

とする.

OSXのGLUTは古いバージョンであり(新しいバージョンであるfreeglutが入っていないため,OpenGL ver.2.1までしか対応していない),さらに10.9以降サポート対象外となっているため,-mmacosx-version-min=10.8というオプションをつけて10.8までのコンパイルですよ,と指示している.

WebGLの準備

Chromeウェブブラウザをインストールしておくこと.