このプログラムは、OpenGL における「テクスチャマッピング (Texture Mapping)」の基礎を学ぶための、学生向けのサンプルプログラムです。本プログラムは、以下のブログ記事の解説に沿って学習を進めるための雛形として提供されています。
このプログラムはマルチテクスチャで環境をマッピングしたサンプルプログラムに対して、レジスタコンバイナという機能によるテクスチャの合成を追加したものです。
このプログラムは CMake を用いてビルドを構成しています。各プラットフォームごとの手順は以下の通りです。なお、プログラムをビルドするためのバイナリディレクトリは、バージョン管理ファイル(.gitignore)の設定に合わせて build という名前にします。
-
コマンドプロンプトまたは PowerShell を開き、このプロジェクトのディレクトリに移動します。
-
以下のコマンドを実行してビルドディレクトリを作成し、CMake で構成を行います。
mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"-
生成された build フォルダ内の texture16.sln を Visual Studio で開きます。
-
ソリューションエクスプローラーで texture16 プロジェクトを右クリックし、「スタートアップ プロジェクトに設定」を選択します。
-
「ローカル Windows デバッガー」をクリックするか、F5 キーを押してビルドおよび実行します。
-
ターミナルを開き、このプロジェクトのディレクトリに移動します。
-
以下のコマンドを実行してビルドディレクトリを作成し、Xcode 用のプロジェクトを生成します。
mkdir build
cd build
cmake .. -G Xcode-
生成された build/texture16.xcodeproj を Xcode で開きます。
-
左上のスキーム選択(再生ボタンの横)が texture16 になっていることを確認します。
-
「Run」ボタン(再生ボタン)をクリックするか、Command + R を押してビルドおよび実行します。
-
ターミナルを開き、このプロジェクトのディレクトリに移動します。
-
必要なパッケージ(freeglut3-dev や pkg-config など)がインストールされていることを確認し、以下のコマンドでビルドします。
mkdir build
cd build
cmake ..
make各OSとも、ビルド後に生成されるバイナリディレクトリ (build) やそのサブフォルダから起動します。(※ CMake の設定により、Windows や Xcode では Debug などのフォルダ下に実行ファイルが置かれることがあります)
- Windows
Visual Studio 上で「ローカル Windows デバッガー」をクリックして実行するか、またはコマンドプロンプトから以下のコマンドで起動します。
cd build\Debug
texture16.exe- macOS
Xcode 上で左上の「Run(再生ボタン)」をクリックするのが楽です。これにより texture16.app アプリケーションバンドルとして自動的に実行されます。アプリケーションバンドルを直接起動するなら、Finder から build/Debug/texture16.app をダブルクリックするか、ターミナルから open build/Debug/texture16.app を実行します (この場合はエラーメッセージ等が表示されません)。
- Ubuntu Linux
ターミナルから以下のコマンドで実行ファイル(バイナリ)を直接起動します。
cd build
./texture16-
マウスの左ボタンでドラッグ: 物体(ドット柄のテクスチャと環境マッピングが重なった立方体)を回転させることができます。
-
キーボードの q, Q または ESC キー: プログラムを終了します。
プログラムのソースコード(主に main.cpp)をもとに、このプログラム内で行われている処理手順を解説します。このプログラムでは、マルチテクスチャとレジスタコンバイナ (GL_COMBINE) を用いて、立方体に「ベースのドット柄」と「環境の映り込み(キューブマップ)」をアルファ値に応じて合成するグロスマッピングを実装しています。
このプログラムでは2つのテクスチャユニット(0番と1番)を使用します。
-
ベースのテクスチャ (テクスチャユニット0):
glActiveTexture(GL_TEXTURE0)を呼び出してユニット0を指定し、dot.raw (256×256) の画像を 2D テクスチャとして割り当てます。テクスチャ環境はGL_MODULATEに設定します。このテクスチャのアルファチャンネル(透明度)が、後の合成で「どのくらい環境を反射するか」のマスクとして利用されます。 -
キューブマップ (テクスチャユニット1):
glActiveTexture(GL_TEXTURE1)を呼び出してテクスチャユニット1に切り替えます。環境マッピング用の6枚の画像 (room2ny.rawなど) を読み込み、GL_TEXTURE_CUBE_MAPとして割り当てます。 このユニットに対して、テクスチャ環境をGL_COMBINEに設定し、GL_COMBINE_RGBをGL_INTERPOLATE(線形補間) に設定します。 補間の係数となる第3の入力として、以下のように指定します。GL_SOURCE2_RGBにGL_PREVIOUS(直前のテクスチャユニット=ユニット0の出力)GL_OPERAND2_RGBにGL_SRC_ALPHA(そのアルファ値) これにより、テクスチャユニット0のアルファ値を使って、ベースの画像色と環境マップの映り込み色がピクセルごとにブレンドされます(グロスマッピング)。
補足 (Windows の場合): マルチテクスチャは OpenGL 1.3 で標準機能に取り入れられたため、Windows が標準で提供する
gl.hにはglActiveTexture()等の宣言が含まれていません。そのため、glext.hをインクルードし、wglGetProcAddress()で関数ポインタを取得して使用しています。
図形を描画する際には、それぞれのテクスチャユニットに対して個別に機能を有効化(glEnable())する必要があります。
-
各テクスチャユニットの有効化: まず
glActiveTexture(GL_TEXTURE0)を呼び出してGL_TEXTURE_2Dを有効にします。 次にglActiveTexture(GL_TEXTURE1)を呼び出してGL_TEXTURE_CUBE_MAPとテクスチャ座標の自動生成 (GL_TEXTURE_GEN_S,GL_TEXTURE_GEN_T,GL_TEXTURE_GEN_R) を有効にします。 -
オブジェクトの描画と合成:
box(1.0, 1.0, 1.0)によって立方体を描画します。頂点には元のドット柄用のテクスチャ座標が設定されており、同時にキューブマッピング用のテクスチャ座標が自動生成されます。これら2つのテクスチャは、先に設定したGL_COMBINEとGL_INTERPOLATEのルールに従い、ベーステクスチャのアルファ値に基づいたグロスマッピングとして合成・描画されます。 -
状態の復元: 描画が完了したら、他の描画に影響を与えないよう
glDisable()を使って、キューブマッピング、テクスチャ座標の自動生成、および 2D テクスチャマッピングを無効化します。
