OpenGLおよびシェーダ言語試用記
Visual C++ 2010 Expressの場合
Visual C++ 2010 ExpressでOpenGLおよびシェーダ言語(GLSL)を使ってみた。まず、OpenGLが使えるようにするための準備を行う。具体的なプログラム例は別のウェブサイト<簡単なOpenGLプログラム例>に用意した。
シェーダ言語を使う場合の準備は、このウェブサイトの後半で説明する。
OpenGLの使用準備:
ブラウザーにおいて「NVIDIA」で検索してNVIDIA社のホームページに入る。NVIDIA社のホームページにおいて「Cg」で検索を行い、Cg Toolkitを入手する。インストールを完了するとフォルダが作成されるので、「C:\Program Files\NVIDIA Corporation\Cg\bin」フォルダからglut32.dllを「C:\Windows\System32」フォルダにコピーする。なお、本ウェブサイトでは、フォルダをディレクトリということもある。
以上の準備後、Visual C++ 2010でOpenGLのプログラムを新規作成(新規作成法についての説明)あるいは既存のプログラムを開き、必要なヘッダーファイルとライブラリをプロジェクトに追加する。ヘッダーファイルglut.hは
#include <glut.h>
として#includeしておき、glut.hの存在するディレクトリをメニュ「プロジェクト|(プロジェクト名)のプロパティ」を選んで表示されるプロパティ ページ ダイアログボックスから「構成プロパティ|VC++ディレクトリ|インクルード ディレクトリ」欄を選んで、glut.hの存在するフォルダ「C:\Program Files\NVIDIA Corporation\Cg\include\GL」を設定する。この設定は、以下のように行う。
表示されたプロパティ ページ ダイアログボックスにおいて「構成プロパティ」項目の下に何も表示されていない(図1)ときは、その左の横向き白三角形をクリックする。
図1
「構成プロパティ」の下に項目が表示される(図2)。
図2
「VC++ディレクトリ」をクリックして、右側の領域の「インクルード ディレクトリ」をクリックする。「インクルード ディレクトリ」欄の右端に下向き黒三角印のボタンが表示される(図3)。
図3
この下向き黒三角印のボタンをクリックすると、下側に編集ボックスが表示される(図4)。
図4
編集ボックスをクリックすると、インクルード ディレクトリ ダイアログボックスが表示される(図5)。
図5
「新しい行」ボタン(図5において赤丸で囲まれたボタン)をクリックすると、編集ボックス内の上部に新しい行とその右端にボタンが表示される(図6)。
図6
このボタンをクリックすると、「ディレクトリの選択」ダイアログボックスが表示される(図7)。
図7
目的とするディレクトリ(フォルダ)を選んで設定し、「フォルダの選択」ボタンをクリックする(図7)。選択したフォルダが入力・表示される(図8)。
図8
「OK」ボタンをクリックすると、選択したフォルダが「インクルード ディレクトリ」欄に表示される(図9)。なお、「インクルード ディレクトリ」欄に登録したディレクトリは、プログラミング時にIntellisenseの機能が働くように「ソース ディレクトリ」欄にも同様の手続きで登録しておく。
図9
「適用」ボタンをクリックすると処理が始まり、しばらくして処理が完了すると図10の状態となる。「適用」ボタンはディスイネーブルになっている。
図10
OKボタンをクリックして設定作業は終了する。
ヘッダーファイル名は、ファイル名を < と > で囲むとシステムに登録されたフォルダに存在するものとして探されるので、上のような操作でヘッダーファイルの存在するフォルダを登録しておく。ファイル名を“と”で囲んだ場合は、メインソースファイルと同じフォルダにあるものとみなされる。ファイル名は、 < と > で囲まれているときはシステムに登録されているフォルダからの相対パスで、“と”で囲まれているときはメインソースファイルがおかれているフォルダからの相対パスで指定することもできる。書籍の付録などでディレクトリ付きの相対パスでヘッダーファイルが指定されているときは注意が必要である。ヘッダーファイルの置かれているディレクトリの上の手順で直接登録したときは、そのヘッダーファイルは名前だけを指定するだけでよい。例えば、酒井幸市(2009)「OpenGL+GLSLによる3D-CGアニメーション」の付録CDに収められているプログラム例GL_TriangleソリューションのメインソースファイルglTriangle.cppに
#include <GL/glut.h>
とあるが、ヘッダーファイルglut.hの置かれているフォルダを上の手続きでインクルードディレクトリへ登録したときは、ファイル名だけを
#include <glut.h>
と指定する。「<GL/glut.h>」は、登録されているディレクトリの下にあるGLディレクトに置かれているヘッダーファイルglut.hということであるが、上の手続きの説明ではディレクトリ「GL」の深さまで登録したので、#includeするときは、「GL」ディレクトリは付けない。
なお、ディレクトリを示すときの記号「/」は「\」でもよい。上の例の場合、「GL/glut.h」は「GL\glut.h」と書くこともできる。
リンク時に開かれるライブラリglut32.libは、メニュ「プロジェクト|既存項目の追加」を選んで(図11)、glut32.libの存在する「C:\Program Files\NVIDIA Corporation\Cg\lib」から探して追加する。
図11
メニュ「プロジェクト|既存項目の追加」を選ぶと、「既存項目の追加」ダイアログボックスが表示される(図12)。
図12
目的とするライブラリ(いまの場合、glut32.lib)を選んで「追加」ボタンをクリックする。
以上の必要なヘッダーファイルとライブラリに関する設定を行った後、プロジェクトをビルド・実行する。必要な設定がすべて行われているとき、ビルドが完了してプログラムは実行されるが、必要なヘッダーファイルがすべて#includeされていない、あるいは必要なライブラリがすべてプロジェクトに追加(Adding)されていないときはエラーとなる。ヘッダーファイルあるいはライブラリを開くことができないというエラーが出たときは、該当するファイルのフォルダをインクルード ディレクトリに登録、あるいはライブラリのプロジェクトへの追加手続きを行う。ライブラリを追加しただけでは「開くことができない」というエラーが出るときは、「プロパティ ページ」ダイアログフォーム(例えば図10)において「ライブラリ ディレクトリ」欄に当該のライブラリが置かれているディレクトリを追加登録する。
プロジェクトに対して行ったこれらの設定は、一度行えば以後有効である。プロジェクトを一旦保存して閉じた後、再度開いときは、前回開いたときに行った設定が有効である。
シェーダ言語使用の準備:
シェーダ言語を使用するときは、上記のOpenGLに必要な操作に加えてシェーダ言語使用のための準備を行う。必要なファイルを入手するため、ブラウザーにおいて「glew」で検索し、ウェブサイト「The OpenGL Extension Wrangler Library」に入る。Binariesファイルから適切な方を選んでダウンロードする。このダウンロードされたファイルはZIP形式の圧縮ファイルなので、ファイル名を右ボンタンでクリックして表示されるメニュから「展開」あるいは「解凍」などを選んで解凍する。この解凍方法はVista以上で有効である。XPのときは解凍ソフトをインストールする必要がある。解凍して作成されたフォルダから「\bin」フォルダを探して、そこにあるglew32.dllを「C:\Windows\System32」にコピーする。
以上の準備の後、Visual C++ 2010でOpenGL + GLSLのプログラムを新規作成あるいは既存のプログラムを開き、必要なヘッダーファイルとライブラリをプロジェクトに追加する。ヘッダーファイルglut.hとライブラリglut32.libに関しては上のOpenGLのところで説明した。シェーダ言語を使用するときは、さらにヘッダーファイルglew.hとライブラリglew32.libを追加する。追加に関する方法はglut.hおよびglew32.libと同様であるが、glew.hは上で解凍して作成されたフォルダの中の「\include\GL」フォルダにあり、glew32.libは同じく解凍後作成されたフォルダの中の「\lib」フォルダにある。
以上の必要な設定後、プロジェクトをビルド・実行する。ビルドにおいてエラーが出た場合、ヘッダーファイルあるいはライブラリの設定が不十分であればエラーに対応した設定を行うことは上のOpenGLと同様である。エラーが既にプロジェクトに追加したもの、例えば上のglew32.libに対するもので「glew32.hを開くことができない」などのエラーであれば、その置かれているディレクトリを「ライブラリ ディレクトリ」に追加登録する。メニュ「プロジェクト|(プロジェクト名)のプロパティ」を選んで表示される「プロパティページ」ダイアログフォームにおいて「ライブラリ ディレクトリ」欄をクリックして選ぶ(図13)。
図13
「インクルード ディレクトリ」欄におけるディレクトリの登録と同様の操作で、例えばglew32.libであればその置かれているディレクトリを登録する。glew32.libは、上で解凍して作成されたフォルダ内の「\lib」フォルダにある。\libフォルダを開けばglew32.libが格納されていることがわかる。ライブラリの置かれているディレクトリを「ディレクトリの選択」ダイアログフォームにおいて選び「フォルダの選択」ボタンをクリックする。
図14
なお、書籍のサンプルプログラム、例えば酒井幸市(2009)「OpenGL+GLSLによる3D-CGアニメーション」の付録CDに収められているプログラム例SL_ColorSpace2ソリューションのメインソースファイルslColorSpace2.cppにおいて
#include <GL/glew.h>
#include <GL/glut.h>
#include "../../myGlsl.h"
となっているところは、上のようにインクルードディレクトリの登録を行ったときは、ディレクトリGLまでの深さで登録されているのでGLの指定をとって、「#include <GL/glew.h>」と「#include <GL/glut.h>」はファイル名のみの指定
#include <glew.h>
#include <glut.h>
とする。
また、「../」は現在のディレクトリから1つ上のディレクトリを表わすので、「"../../myGlsl.h”」はメインソースファイルslColorSpace2.cppの置かれているディレクトリから2つ上のディレクトリにあるヘッダーファイルmyGslsl.hを指し示すことになる。ヘッダーファイルmyGlsl.hをメインソースファイルslColorSpace2.cppの置かれているディレクトリにコピーして
#include “myGlsl.h”
と指定するとよい。「#include “ファイル名”」は、メインソースファイルと同じディレクトリ(ファイル名の前に相対パスを示すディレクトリ名があれば、メインソースファイルの置かれているディレクトリから相対パスによって指定されたディレクトリ)に”ファイル名”のファイルがあるとみなされる。「#include <ファイル名>」のときは、インクルードディレクトリに登録されているディレクトリから<ファイル名>のファイルが探されるが、相対パスがファイル名の前に指定されているときは、インクルードディレクトリに登録されているディレクトリからの相対パスで指定されるディレクトリにファイルがあるとみなされる。
なお、ピリオドが2個の「../」あるいは「..\」は一つ上のディレクトリを表わすが、ピリオドが1個である「./」あるいは「.\」はカレントディレクトリを表わす。
付記: 標準C++準拠のプログラミングの説明を<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房の「第T部 標準C++準拠プログラミング」Pp. 17-156>で行っています。