GLFW3 による OpenGL 入門 (2)

第2章 準備

2.1    準備するもの

2.1.1     実行環境

本書では実際にプログラムを作成しながら学習するので、パソコンが必要です。また、OpenGL のバージョン 3.2 以降の API を用いるので、NVIDIA GeForce 8 シリーズ以降、ATI RADEON HD シリーズ以降のビデオカード、あるいはグラフィックス機能を内蔵している Intel の第7世代の CPU (Ivy Bridge, Core i7-3770 など) や AMD の APU (A シリーズ) が必要です。

想定する OS は Windows 7 以降、Mac OS X 10.7 (Lion) 以降、X Window System (X11) を備えた Linux です。これらの上で、コンパイラ・リンカ、テキストエディタ等のソフトウェア開発環境のほか、OpenGL を使用したプログラムの作成を補助するツールキット GLFW (バージョン 3) および OpenGL の拡張機能を利用可能にするための補助ライブラリ GLEW を使用します。

2.1.2     OpenGL

OpenGL はどのプラットホームにも標準で組み込まれていますので、改めて用意する必要はありません。ただし、前述の通り OpenGL のバージョン 3.2 以降に対応したグラフィックスハードウェアと、そのドライバソフトウェアが必要です。また Linux (X Window System) では、別途 Mesa (http://www.mesa3d.org) 関連のパッケージや、使用しているグラフィックスハードウェアのベンダーが提供するドライバソフトウェアのインストールが必要になる場合があります。

2.1.3     GLFW

GLFW のプロジェクトのダウンロードページ (http://www.glfw.org/download.html) からソースプログラムのアーカイブファイルがダウンロードできます。最新版のバージョンは 3 ですが、これは以前のバージョン 2 とは互換性がないので注意してください。これをコンパイルして、使用するコンピュータにインストールします。Windows に対しては、既にコンパイルされたバイナリファイルも用意されています。

2.1.4     GLEW

本書のプログラムでは、OpenGL と GLFW のほかに、GLEW (The OpenGL Extension Wrangler Library, http://glew.sourceforge.net) というライブラリも使用します。これはグラフィックスハードウェアの拡張機能を使用可能にするためのものです。特に Windowsでは、Windows がもともとサポートしている OpenGL のバージョンが 1.1 のために、グラフィックスハードウェアがそれ以降のバージョンに対応したものであっても、そのままでは新しい機能を使用することができません。そこで GLEW を使って、グラフィックスハードウェアが持つ全ての機能をアプリケーションソフトウェアから使えるようにします。

2.2    GLFW のインストール

2.2.1     Windows

Windows ではソフトウェア開発環境として Visual Studio 2013 を使用し、32bit (x86) 版のプログラムを作成することを想定しています。GLFW のプロジェクトで配布しているバイナリファイル (コンパイル済みのファイル) を用いるなら、インストールはファイルを配置するだけです。

まず、GLFW のダウンロードページ (http://www.glfw.org/download.html) の “32-bit Windows binaries” のボタンをクリックしてください。すると 32bit 版のバイナリファイルをまとめた ZIP ファイル glfw-3.X.Y.bin.WIN32.zip (X, Y は数字) がダウンロードされますから、これを右クリックで選択して「すべて展開」を選び、適当なディレクトリ (マイドキュメント、デスクトップ、C:\ など) に展開してください。

この後、Visual Studio でプロジェクトを作成した後に、「プロジェクト」メニューの「プロパティ」を選び、「構成プロパティ」の中にある「VC++ ディレクトリ」に ZIP ファイルを展開したディレクトリ (フォルダ) を指定します。この方法については後述します。

なお、パソコンの管理者権限を持っているなら、このディレクトリの中のフォルダやファイルを以下のシステムのフォルダ (Visual Studio 2013 の場合) に移動あるいはコピーすることにより、プロジェクトを作成するたびに「VC++ ディレクトリ」を設定する手間を省くことができます。

32bit 版 Windows の場合

  • include フォルダにある GLFW フォルダ
C:\Program Files\Windows Kits\8.1\Include\um
  • lib-msvc120 フォルダにある glfw3.lib ファイル
C:\Program Files\Windows Kits\8.1\Lib\winv6.3\um\x86

64bit 版 Windows の場合

  • include フォルダにある GLFW フォルダ
C:\Program Files (x86)\Windows Kits\8.1\Include\um
  • lib-msvc120 フォルダにある glfw3.lib ファイル
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86

2.2.2     Mac OS X

Mac OS X では、Xcode と Command Line Tools がインストールされている必要があります。Xcode は AppStore から無料で入手できます。Command Line Tools は、Xcode の “Xcode” メニューから “Open Developer Tool” の “More Developer Tools” を選ぶとダウンロードページが表示されます (無料の開発者ユーザ登録が必要です)。

本書の執筆時点では、MacPorts (http://www.macports.org) に GLFW のバージョン 3 のパッケージが用意されていましたが、HomeBrew (http://brew.sh) や Fink (http://www.finkproject.org) にはありませんでした。ソースファイルからは以下の手順でインストールできます。

インストール

GLFW のプロジェクトのダウンロードページ (http://www.glfw.org/download.html) からソースファイルの ZIP ファイル glfw-3.X.Y.zip (X, Y は数字) をダウンロードしてデスクトップに置き、それをダブルクリックして展開してください。glfw-3.X.Y というディレクトリが作成されます。

次にターミナルを開き、以下のコマンドを順に実行してください (管理者権限が必要です)。‘%’ はシェルのプロンプトを表します。なお、ファイルは /usr/local 以下にインストールされます。

% cd ~/Desktop/glfw-3.X.Y
% mkdir build
% cd build
% cmake ..
% make
% sudo make install

アンインストール

インストールした GLFW のファイルを削除する必要が生じた場合は、前述の手順で GLFW をインストールしたときに build ディレクトリの中に作成される Makefile を使ってアンインストールできます (管理者権限が必要です)。

% cd ~/Desktop/glfw-3.X.Y/build
% sudo make uninstall

2.2.3     Linux

Linux (X11) は NVIDIA GeForce 8 シリーズ以降あるいは ATI RADEON HD シリーズ以降のビデオカードで、プロプライエタリドライバがインストールされていることを想定しています。Intel の CPU 内蔵グラフィックスの場合、ドライバは https://01.org から入手できます。

本書の執筆時点では、Fedora (http://fedoraproject.org) に GLFW のバージョン 3 のパッケージが用意されていましたが、Ubuntu (http://www.ubuntu.com) や OpenSUSE (http://www.opensuse.org) にはありませんでした。ソースファイルからは以下の手順でインストールできます。

インストール

GLFW のプロジェクトのダウンロードページ (http://www.glfw.org/download.html) からソースファイルの ZIP ファイル glfw-3.X.Y.zip (X, Y は数字) ダウンロードしてください。

次にターミナルを開き、以下のコマンドを順に実行してください (管理者権限が必要です)。‘%’ はシェルのプロンプトを表します。なお、ファイルは /usr/local 以下にインストールされます。

% unzip glfw-3.X.Y.zip
% cd glfw-3.X.Y
% mkdir build
% cd build
% cmake ..
% make
% sudo make install

アンインストール

インストールした GLFW のファイルを削除する必要が生じた場合は、前述の手順で GLFW をインストールしたときに build ディレクトリの中に作成される Makefile を使ってアンインストールできます (管理者権限が必要です)。

% cd glfw-3.X.Y/build
% sudo make uninstall

2.3    GLEW のインストール

2.3.1     Windows

GLEW のプロジェクトのページ (http://glew.sourceforge.net) の “Windows 32-bit and 64-bit” のところから、GLEW のバイナリファイルの ZIP ファイル glew-1.X.Y-win32.zip (X, Y は数字) をダウンロードしてください。次に、そのファイルを右クリックで選択して「すべて展開」を選び、適当なディレクトリ (マイドキュメント、デスクトップ、C:\ など) に展開してください。

この後、Visual Studio でプロジェクトを作成した後に、「プロジェクト」メニューの「プロパティ」を選び、「構成プロパティ」の中にある「VC++ ディレクトリ」に、ZIP ファイルを展開したディレクトリ (フォルダ) を指定します。この方法については後述します。

なお、パソコンの管理者権限を持っているなら、このディレクトリの中のフォルダやファイルを以下のシステムのフォルダ (Visual Studio 2013 の場合) に移動あるいはコピーすることにより、プロジェクトを作成するたびに「VC++ ディレクトリ」を設定する手間を省くことができます。

32bit 版 Windows の場合

  • include\GL フォルダにある glew.h glxew.h wglew.h ファイル
C:\Program Files\Windows Kits\8.1\Include\um\gl
  • lib\Release\Win32 フォルダにある glew32.lib glew32s.lib ファイル
C:\Program Files\Windows Kits\8.1\Lib\winv6.3\um\x86
  • bin\Release\Win32 フォルダにある glew32.dll ファイル
C:\Windows\System32

64bit 版 Windows の場合

  • include フォルダにある glew.h glxew.h wglew.h ファイル
C:\Program Files (x86)\Windows Kits\8.1\Include\um\gl
  • lib\Release\Win32 フォルダにある glew32.lib glew32s.lib ファイル
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86
  • bin\Release\Win32 フォルダにある glew32.dll ファイル
C:\Windows\SysWOW64

2.3.2     Mac OS X

本書の執筆時点では、GLEW のパッケージは MacPorts (http://www.macports.org)、HomeBrew (http://brew.sh)、Fink (http://www.finkproject.org) のいずれのプロジェクトにも用意されていました。ソースファイルからは以下の手順でインストールできます。

インストール

GLEW のプロジェクトのページ (http://glew.sourceforge.net) からソースファイルの ZIP ファイル glew-1.X.Y.zip (X, Y は数字) をダウンロードしてデスクトップに置き、それをダブルクリックして展開してください。glew-1.X.Y というディレクトリが作成されます。

次にターミナルを開き、以下のコマンドを順に実行してください (管理者権限が必要です)。‘%’ はシェルのプロンプトを表します。なお、ファイルはデフォルトでは /usr にインストールされます。インストール先を変更するには、make コマンドの引数で GLEW_DEST にインストール先を設定してください (GLFW と同じディレクトリにインストールすることを勧めます)。

% cd ~/Desktop/glew-1.X.Y
% make GLEW_DEST=/usr/local
% sudo make GLEW_DEST=/usr/local install

アンインストール

インストールした GLEW のファイルを削除する必要が生じた場合は、以下の手順でアンインストールできます (管理者権限が必要です)。GLEW_DEST にインストールの時に指定したインストール先を指定してください。

% cd ~/Desktop/glew-1.X.Y
% sudo make GLEW_DEST=/usr/local uninstall

2.3.3     Linux

本書の執筆時点では、Fedora (http://fedoraproject.org)、Ubuntu (http://www.ubuntu.com)、OpenSUSE (http://www.opensuse.org) のいずれのディストリビューションにも、GLEW のパッケージが用意されていました。ソースファイルからは、以下の手順でインストールできます。

インストール

GLEW のプロジェクトのページ (http://glew.sourceforge.net) からソースファイルの TGZ ファイル glew-1.X.Y.tgz (X, Y は数字) をダウンロードし、適当なディレクトリで展開してください。

次にターミナルを開き、以下のコマンドを順に実行してください (管理者権限が必要です)。‘%’ はシェルのプロンプトを表します。なお、ファイルはデフォルトでは /usr にインストールされます。インストール先を変更するなら、make コマンドの引数で GLEW_DEST にインストール先を設定してください (GLFW と同じディレクトリにインストールすることを勧めます)。

% tar xzf glew-1.X.Y.tgz 
% cd glew-1.X.Y
% make GLEW_DEST=/usr/local
% sudo make GLEW_DEST=/usr/local install

アンインストール

インストールした GLEW のファイルを削除する必要が生じた場合は、以下の手順でアンインストールできます (管理者権限が必要です)。GLEW_DEST にインストールの時に指定したインストール先を指定してください。

% cd glew-1.X.Y
% sudo make GLEW_DEST=/usr/local uninstall

GLFW3 による OpenGL 入門 (1)

第1章 はじめに

1.1    本書の目的

本書は OpenGL (http://www.opengl.org) と呼ばれるグラフィックス表示のためのアプリケーションプログラムインタフェース (Application Program Interface, API) を使用して、グラフィックスアプリケーションを作成する方法について解説します。

ただし、OpenGL 自体はグラフィックスハードウェアを制御する機能しか持っていないので、実際にグラフィックスアプリケーションを作成するには、コンピュータグラフィックス (CG) の理論の知識も必要になります。そのため現実のアプリケーション開発では、CG の各種の理論や手法を実装したミドルウェアがよく用いられます。

しかし本書では、直接 OpenGL の API を使ってアプリケーションプログラムを作成する方法について解説します。そのために本書では、CG の基礎的な理論の解説も行います。これは、仮にミドルウェアを用いてグラフィックスアプリケーションを開発するとしても、CG の理論の理解が不可欠だからです。

本書が想定する読者は、学校の授業などで C あるいは C++ を勉強したものの、自分では実際にプログラムを組んだ経験があまりないという、そう、そこの君!○○君 (実在の人物) のことだよ。したがって、本書ではプログラミング言語として C++ を用いますが、iostream や vector など C++ の基本的なライブラリを使用する以外は、ほとんど “better C” としてしか C++ の機能を使用しません。

1.2    OpenGL

三次元コンピュータグラフィックス (3D Computer Graphics, 3D CG) を使った画面表示は、現在ではパソコンやゲーム機のみならず、携帯電話やスマートフォン、カーナビなど、幅広い領域で利用されています。しかし 3D CG の処理は、現在のパソコンの CPU の高い計算能力をもってしても、負荷の高いものになります。特にリアルタイム 3D CG によって快適な応答性能を得るには、やはり専用ハードウェアによる支援が不可欠になります。

この専用ハードウェア、いわゆるグラフィックスハードウェアは、パソコンの CPU に匹敵するか、あるいは、それ以上の複雑さを持っています。したがって、これを有効に活用するには、グラフィックス表示に要求される機能を整理し、グラフィックスハードウェアの機能を抽象化する、高機能なグラフィックスライブラリが必要になります。

グラフィックスライブラリは、通常コンピュータのハードウェア全体を制御するオペレーティングシステム (OS) の機能の一部として提供されます。アプリケーションプログラムはこれを介してグラフィックスハードウェアを制御するので、このようなグラフィックスライブラリはアプリケーションプログラムインタフェース (API) と呼ばれます。パソコンの OS として最も普及している Microsoft 社の Windows には、一般的な二次元のグラフィックス表示を行う Graphics Device Interface (GDI) や、二次元グラフィックスおよびリアルタイム3D CG の表示機能などを包含した DirectX (3D CG 部分は Direct3D) という API が用意されています。

ところが Windows には、これらとは別に、OpenGL と呼ばれるグラフィックス表示用の API が用意されています。OpenGL は Microsoft 社が DirectX を用意する以前から Windows に組み込まれていた、リアルタイム 3D CG に対応したグラフィックス API です。

この OpenGL は、最初シリコングラフィックス社 (Silicon Graphics, Inc.、後に Silicon Graphics International Corp., SGI) により開発されました。同社はもともと IRIX と呼ばれる UNIX 系 OS を搭載した、エンジニアリングワークステーション (Engineering Work Station, EWS) と呼ばれるコンピュータのメーカーでした。OpenGL は同社の EWS のグラフィックス表示に用いられていたグラフィックスライブラリ (GL、OpenGL と区別するために IRIS GL と呼ばれることがあります) を、プラットホーム (ハードウェアや OS などのコンピュータの基盤) に依存する部分を分離して再実装したものです。OpenGL はその後オープンソースソフトウェアとして公開され、現在は Khronos Group (http://www.khronos.org) という団体によって規格が策定されています。

EWS は主にコンピュータ支援設計 (Computer Aided Design, CAD) などの技術的用途に用いられるコンピュータです。しかし、パソコンの性能の向上により、この目的にもパソコンが使用されるようになりました。その結果、EWS で動作していたアプリケーションをパソコンに移行する必要性が生じ、そのために Windows 上にも OpenGL が移植されました。

当時はこれら以外のグラフィックスライブラリもいくつか存在しましたが、パソコン用 OS の Windows による寡占化が進んだ結果、グラフィックスライブラリも DirectX と OpenGL の二つ以外は実質的に淘汰されてしまいました。このうち DirectX は Microsoft 社の専有物のため、OS として Windows を採用しているパソコン以外で共通に使用できるグラフィックスライブラリは、現在では事実上 OpenGL しかありません。しかし、これは言い換えれば、Windows パソコンを含むコンピュータ関連機器のほとんどが、3D CG 表示用の API として OpenGL (または、組み込み機器向けの OpenGL ES) を採用しているとも言えます。

OpenGL がこのように広く使われるようになった背景には、もちろん OpenGL しか選択肢がなかったということもありますが、その仕様がプラットホームから独立していることも大きな要因でしょう。これにより、OpenGL はさまざまな機器に導入されました。Apple 社のパソコンの OS である Mac OS X や、UNIX やオープンソースで開発されている Linux の画面表示に用いられているX Window System も、OpenGL を使用してグラフィックス表示を行うことが可能です。また、パソコンに限らず、スマートフォンの OS である Apple 社の iOS や Google 社の Android も、OpenGL ES を採用しています。

1.3    GLFW

1.3.1     ツールキット

OpenGL はプラットホームに依存しないグラフィックス API ですが、アプリケーションプログラムからこの機能を使用するためには、やはりプラットホームごとに異なる手順で「お膳立て」をする必要があります。しかし、その部分の実装はそれなりに面倒なものになるため、それをうまく包み隠して簡単に使えるようにしたツールキットがいくつも提案されています。

中でも GLUT (OpenGL Utility Toolkit) は、OpenGL を開発した Silicon Graphics のエンジニア (当時) が作った、使いやすいツールキットです。また GLUT はマルチプラットホームに対応しているため、これを使ったソースプログラムは Unix / Linux、Windows、Mac OS X の間で共通にすることができます。GLUT は OpenGL の初期の頃に作られたものですが、OpenGL の学習や OpenGL を使った簡単なプログラムの作成を手軽に始めることができるため、今でも有用なツールキットとして利用されています。

しかし、オリジナルの GLUT は既に長い間メンテナンスされていません。代わりに GLUT 互換の freeglut (http://freeglut.sourceforge.net) や OpenGLUT (http://openglut.sourceforge.net) というツールキットが開発されていますが、これらは本書の執筆時点では Mac OS X には対応していません。また、Mac OS X には以前から標準で GLUT が搭載されていましたが、これは OpenGL 2.1 にしか対応しておらず、Mac OS X のバージョン 10.7 (Lion) 以降で使用可能になった OpenGL 3.2 Core Profile や、10.9 (Mavericks) 以降で使用可能になった OpenGL 4.1 を (公式には) 使用することができません[1]。加えて 10.9 では、ついに GLUT の使用自体が非推奨となりました。

1.3.2     GLFW の概要

GLUT が使えないとなると、代わりのものを探す必要があります。OpenGL に対応していて、GLUT のようにマルチプラットホームで使用できるツールキットには、FLTKQtSDL などさまざまなものがあります。中でも Qt は非常に高機能なツールキットであり、CG 関連のいくつかの主要なアプリケーションがこれを使って開発されています。

しかし、OpenGL の学習のためにあれこれ試したり、ちょっとしたプログラムを書いたりするには、Qt などはちょっと大きすぎる気がします。そこで、GLUT の代わりになる簡単で小さなツールキットとして、GLFW (http://www.glfw.org/) があります。

上記の GLFWのホームページでは、GLFW はウィンドウを作成し、OpenGL のコンテキストを作って、入力 (デバイス) を管理する、無料の、オープンソースの、マルチプラットホームのライブラリであると説明されています。ライセンスには zlib/libpng license を採用しています。

1.3.3     GLFW の特徴

GLFW は次のような特徴を持っています。

l 非常にコンパクトである

OpenGL と組み合わせて使うツールキットの中では非常にコンパクトであり、OpenGL のウィンドウを管理するための最小限の機能を提供しています。

l マルチプラットホームである

GLUT と同様に Windows / Mac OS X / Linux でソースプログラムを共通化できます。

l OpenGL のバージョンやプロファイルが指定できる

Mac OS X バージョン 10.7 (Lion) 以降では OpenGL のバージョン 3.2 の Core Profile、10.9 (Mavericks) 以降では OpenGL のバージョン 4.1 を指定することができます。

l 最初からダブルバッファリングになっている

ダブルバッファリングはアニメーション表示を行うための必須の機能ですが、GLFW ではこれが標準で有効になっています。GLUT にあるシングルバッファのモードは用意されていません。

l イベントループを自分で書く

OpenGL などによるグラフィックス表示では、OS からの描画要求 (イベント) にもとづいて、くり返し描画処理を行う必要があります。このくり返しをイベントループと呼びます。このループにおいて、描画処理を行った後に次のイベントが発生するまで待つようにすれば、マウスやキーボードの操作によって画面表示を更新する対話的なアプリケーションを作成することができます。一方、イベントを待たずに描画処理を行うことにより、画面表示が時間とともに更新されるアニメーション表示を行うこともできます。

l ポーリング方式とコールバック方式のどちらにも対応している

GLFW のプログラミングは、どのようなイベントが発生したのか (マウスをドラッグしたのか、キーボードをタイプしたのか、など) をイベントループの中で調べて (ポーリング) 対応する処理を記述する方式が基本です。しかし、必要に応じてイベントごとに実行する関数 (コールバック関数) を登録する方式で記述することもできます。

l マルチウィンドウやマルチモニタに対応している

OpenGL のレンダリングコンテキストを管理する機能を持っており、マルチウィンドウやマルチモニタに対応したアプリケーションプログラムを作成することができます。

l 入力デバイスの取り扱い方法が異なる

キーボードからの入力は GLUT のように文字として得ることができるほか、Shift キーなどの文字のキー以外のものを含む特定のキーの状態を調べることもできます。また、マウスホイールやジョイスティックのデータを取得することもできます。

l GLFW にない機能

一方 GLUT にあって GLFW にない機能もいくつかあります。例えば Cube や Sphere、Teapot のような図形を表示する機能は省かれています。またビットマップフォントをレンダリングする機能もありません。ポップアップメニューを表示する機能も用意されていません。

最初からダブルバッファリングになっていることや、キーボードやマウス、ジョイスティックの扱い方を見ると、GLFW は GLUT に比べてかなりゲーム向きに作られているように思われます。また GLUT にあって GLFW に無い機能の多くは、現在の OpenGLでは非推奨となった機能を使っています。



[1] gl3w というツールを使えば GLUT で OpenGL バージョン 3.2 以降の機能を使用できます。

Git(ギット)によるソースファイル管理

1        はじめに

1.1      バージョン管理の必要性

1.1.1  更新履歴の記録

ソフトウェアを開発していると,以前は動いていたのに,変更したら動かなくなったということが起こる.また,トラブルやミスにより成果物を失ってしまうこともある.ソースコードの更新履歴を保存しておくことにより,過去のバージョンのソースコードを閲覧したり,開発中のソフトウェアをそのバージョンに戻したりできる.

続きを読む