【OpenGL】テクスチャマッピングについて

公開日: : 最終更新日:2014/08/14 OpenGL

スポンサーリンク

OpenGL(GLUT)におけるテクスチャマッピングについての簡単な調査。まずテクスチャマッピングを行うには画像を読み込んで張り付ける必要があります。

ここでは

①画像の読み込み
②画像の貼り付け

について簡単にまとめます。

画像の読み込み

まずは画像の読み込みですが、OpenGLでは画像の読み込み関数などは存在しないようなので、自分でbmpなどの読み込み関数を作成するか、OpenCVなどの他のライブラリと併用することが必要となります。ここでは読みこみそのものには触れませんが、いずれについてもGoogleで検索をかければ解決法がいくつかでてきます。

それで画像を読み込んで具体的何がほしいのかというと

・画像の縦・横のサイズ(いずれもint)
・画像データの配列(通常unsigned char*)

の2つとなります。一般的には画像の各画素には256階調(8ビット(unsigned char))のデータRGBの3つが入っているため、画像データの配列サイズは

sizeof(unsigned char)×(画像の横サイズ)×(画像の縦サイズ)×3

ということになります。場合によってはRGBだけでなく不透明度を表すアルファ値を足して4つ必要になる時もあります。

そして画像データをOpenGL側のバッファに渡してやれば画像ハンドル(番号)が返ってきますので実際に描画するときはその値を記録しておきます。この際に使用するGLの関数は

glGenTextures
glBindTexture
gluBuild2DMipmaps(もしくはglTexImage2D)

の3つとなります。

ここまでを関数としてまとめると↓のようになります。
tex-1.png

「ここで画像を読み込む」の位置で画像サイズ、データ配列の中身を埋めます。その後、glGenTexturesで1枚の画像を指定して、glBindTextureで画像を指定、gluBuild2DMipmapsで画像を渡します。そして最後不要になったが王データを解放します。この例ではfreeで解放していますが、それぞれの解放方法で解放してください。

画像の貼り付け

テクスチャマッピングの手法はいくつかあります。

・UVマッピング

UVmap
指定の3D座標に、指定のテクスチャ座標の画像を張り付ける。

・投影マッピング

投影2-1
指定の位置から物体に対して画像を投影するように張り付ける。

・スフィアマッピング

sp2-1.png
球状に画像を張り付ける。

…などいくつか種類があるようです。

基本的には

glEnable(GL_TEXTURE_2D)

で画像の貼り付けを有効にして、使用する画像を

glBindTexture(GL_TEXTURE_2D,tex)

で指定します。(第2引数に先ほど取得した画像ハンドルを渡す。)

そして、UVマッピングではglVertex3*で頂点を指定する前にglCoord2*でそこに対応させるテクスチャ座標を選択します。そうすることで画像が面に張り付けられます。

ちなみにテクスチャ座標は画像の縦サイズと横サイズが0~1.0に正規化された座標系です。

uvcoord.png

次に、投影マッピングでは描画の際のパラメータを

glTexGeni
glTexGenfv

の2つで指定する必要があります。(詳細は省きます)
そして、物体を描画する前に画像の投影位置を指定します。(しなくてもできなくはない)

glMatrixMode(GL_TEXTURE);
glLoadIdentity();
gluPerspective(30.0, 1.0, 1.0, 100.0);
gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

これは(1.0 ,1.0 ,1.0)の点から原点に向かって画像を物体に対して投影しています。
そして物体の描画を

glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glEnable(GL_TEXTURE_GEN_Q);

~ここで物体を描画~

glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
glDisable(GL_TEXTURE_GEN_Q);

ではさむと投影マッピングできます。
スフィアマッピングについては完全に以下のサイトのままなので省きます。非常に参考になるサイトです。

スポンサーリンク
Amazon
  • このエントリーをはてなブックマークに追加

関連記事

記事はありませんでした

UWSCを使ったソフト自動立ち上げ【SoftEther VPN Server】

やりたいこと 最近SoftEtherという筑波大学発のベンチャー企業

【PHP】headerでContent-Typeを指定したのに効かない場合の対処法

PHPでサイトマップを作ろうと思い、XML形式のファイルを出力しようと

スマホ向け幅固定サイトの回転時の幅対応方法

幅固定サイトでのスマホ回転時Webサイトの横幅を合わせる方法のメモ。

【PHP】特定のURLからそのAtomやRSSのフィードを抽出する方法

特定のURLからRSSやATOMのフィードを抽出する方法をメモ。 流

フィード抽出ツール(RSS1.0、RSS2.0、atom)

任意URL サイト名 サイトURL RSS1.0

格安プラン限定レンタルサーバー機能比較表(2016年)

はじめに  最近新しい共用サーバーをレンタルしようと思い調査およびそ

kindle unlimitedが便利だったのでお勧めの使い方など感想メモ

 kindle unlimitedというサービスが8/3からAmazo

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。
PAGE TOP ↑