Skip to content

tokoik/texture16

Repository files navigation

texture16 - テクスチャ:第20回 グロスマッピング サンプルプログラム

1. 概要

このプログラムは、OpenGL における「テクスチャマッピング (Texture Mapping)」の基礎を学ぶための、学生向けのサンプルプログラムです。本プログラムは、以下のブログ記事の解説に沿って学習を進めるための雛形として提供されています。

このプログラムはマルチテクスチャで環境をマッピングしたサンプルプログラムに対して、レジスタコンバイナという機能によるテクスチャの合成を追加したものです。

2. ビルド方法

このプログラムは CMake を用いてビルドを構成しています。各プラットフォームごとの手順は以下の通りです。なお、プログラムをビルドするためのバイナリディレクトリは、バージョン管理ファイル(.gitignore)の設定に合わせて build という名前にします。

2.1 Windows (Visual Studio 2022 の場合)

  1. コマンドプロンプトまたは PowerShell を開き、このプロジェクトのディレクトリに移動します。

  2. 以下のコマンドを実行してビルドディレクトリを作成し、CMake で構成を行います。

mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"
  1. 生成された build フォルダ内の texture16.sln を Visual Studio で開きます。

  2. ソリューションエクスプローラーで texture16 プロジェクトを右クリックし、「スタートアップ プロジェクトに設定」を選択します。

  3. 「ローカル Windows デバッガー」をクリックするか、F5 キーを押してビルドおよび実行します。

2.2 macOS (Xcode の場合)

  1. ターミナルを開き、このプロジェクトのディレクトリに移動します。

  2. 以下のコマンドを実行してビルドディレクトリを作成し、Xcode 用のプロジェクトを生成します。

mkdir build
cd build
cmake .. -G Xcode
  1. 生成された build/texture16.xcodeproj を Xcode で開きます。

  2. 左上のスキーム選択(再生ボタンの横)が texture16 になっていることを確認します。

  3. 「Run」ボタン(再生ボタン)をクリックするか、Command + R を押してビルドおよび実行します。

2.3 Ubuntu Linux

  1. ターミナルを開き、このプロジェクトのディレクトリに移動します。

  2. 必要なパッケージ(freeglut3-dev や pkg-config など)がインストールされていることを確認し、以下のコマンドでビルドします。

mkdir build
cd build
cmake ..
make

3. 使い方

3.1 プログラムの起動方法

各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

3.2 操作方法

  • マウスの左ボタンでドラッグ: 物体(ドット柄のテクスチャと環境マッピングが重なった立方体)を回転させることができます。

  • キーボードの q, Q または ESC キー: プログラムを終了します。

4. 解説

プログラムのソースコード(主に main.cpp)をもとに、このプログラム内で行われている処理手順を解説します。このプログラムでは、マルチテクスチャレジスタコンバイナ (GL_COMBINE) を用いて、立方体に「ベースのドット柄」と「環境の映り込み(キューブマップ)」をアルファ値に応じて合成するグロスマッピングを実装しています。

4.1 テクスチャユニットの切り替えと設定 (init() 関数)

このプログラムでは2つのテクスチャユニット(0番と1番)を使用します。

  1. ベースのテクスチャ (テクスチャユニット0): glActiveTexture( GL_TEXTURE0 ) を呼び出してユニット0を指定し、dot.raw (256×256) の画像を 2D テクスチャとして割り当てます。テクスチャ環境は GL_MODULATE に設定します。このテクスチャのアルファチャンネル(透明度)が、後の合成で「どのくらい環境を反射するか」のマスクとして利用されます。

  2. キューブマップ (テクスチャユニット1): glActiveTexture( GL_TEXTURE1 ) を呼び出してテクスチャユニット1に切り替えます。環境マッピング用の6枚の画像 (room2ny.raw など) を読み込み、GL_TEXTURE_CUBE_MAP として割り当てます。 このユニットに対して、テクスチャ環境を GL_COMBINE に設定し、GL_COMBINE_RGBGL_INTERPOLATE (線形補間) に設定します。 補間の係数となる第3の入力として、以下のように指定します。

    • GL_SOURCE2_RGBGL_PREVIOUS (直前のテクスチャユニット=ユニット0の出力)
    • GL_OPERAND2_RGBGL_SRC_ALPHA (そのアルファ値) これにより、テクスチャユニット0のアルファ値を使って、ベースの画像色と環境マップの映り込み色がピクセルごとにブレンドされます(グロスマッピング)。

補足 (Windows の場合): マルチテクスチャは OpenGL 1.3 で標準機能に取り入れられたため、Windows が標準で提供する gl.h には glActiveTexture() 等の宣言が含まれていません。そのため、glext.h をインクルードし、wglGetProcAddress() で関数ポインタを取得して使用しています。

4.2 描画時のマルチテクスチャの有効化 (scene() 関数)

図形を描画する際には、それぞれのテクスチャユニットに対して個別に機能を有効化(glEnable())する必要があります。

  1. 各テクスチャユニットの有効化: まず 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) を有効にします。

  2. オブジェクトの描画と合成: box( 1.0, 1.0, 1.0 ) によって立方体を描画します。頂点には元のドット柄用のテクスチャ座標が設定されており、同時にキューブマッピング用のテクスチャ座標が自動生成されます。これら2つのテクスチャは、先に設定した GL_COMBINEGL_INTERPOLATE のルールに従い、ベーステクスチャのアルファ値に基づいたグロスマッピングとして合成・描画されます。

  3. 状態の復元: 描画が完了したら、他の描画に影響を与えないよう glDisable() を使って、キューブマッピング、テクスチャ座標の自動生成、および 2D テクスチャマッピングを無効化します。

マルチテクスチャのレイヤーの配分比を変化させながらアニメーション

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors