8. テクスチャマッピング y t s x z 8.1. テクスチャマッピングの原理 8. テクスチャマッピング 8.1. テクスチャマッピングの原理 狭義には,図のように,与えられた画像を物体に貼り付ける方法. マッピングには投影法,極座標変換,パラメータマッピングなどがある(CG入門). 広義にはバンプマッピングなども含まれる. y t s x z
glPixelStorei(GL_UNPACK_ALIGNMENT,1); 8.2. テクスチャマッピングの設定方法 全体の流れ 1)原図ビットマップデータを内部形式に変換 2)ラッピング方法の設定 3)テクスチャの設定 4)対応空間の指定 8.2.1. アラインメント設定 コンピュータ上のメモリアクセス実装方法によって,画像が格納されているメモリ領域の番地が1,2,4,8の倍数のいずれかに限られるときがある.大きい単位でアクセス(取り出す)できるほうが効率的であるが,その単位を指定する(defaultは4).→最近のコンピュータではあまり意識する必要はない. glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexParameteri(GL_TEXTURE_2D,座標方向,繰り返し設定); 8.2.2. テクスチャパラメータの設定 テクスチャによるラップ方法,フィルタの指定,境界の色指定などを行なうことができる. ラップの設定 貼り付けるテクスチャイメージに比べ貼り付けられる面のサイズが大きいとき,イメージを繰り返す必要がある.この際,最小限のイメージを記憶させて繰り返して使用すればメモリを節減できる. テクスチャイメージの(s,t)座標それぞれに画像の繰り返し指定ができる. glTexParameteri(GL_TEXTURE_2D,座標方向,繰り返し設定); 座標方向:GL_TEXTURE_WRAP_Sまたは_T 繰り返し設定:GL_REPEAT→繰り返しdefault GL_CLAMP→画像の最終部をそのまま維持する テクスチャーマッピングサンプルプログラムc8-1.c y t x s z
repeat clamp-s clamp-t clamp-st
8.2.3. テクスチャ環境設定 テクスチャを,貼り付けられる物体(ベース)の持つ表面属性とどのように混ぜ合わせるかを設定する. 8.2.3. テクスチャ環境設定 テクスチャを,貼り付けられる物体(ベース)の持つ表面属性とどのように混ぜ合わせるかを設定する. glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,モード); モード GL_MODULATE:テクスチャとベースの面の色(RGBA)を掛け合わせた色に なる GL_DECAL:ステッカを貼るイメージ.透明でなければテクスチャの色.透 明なら透明度に応じた混合色になる GL_REPLACE:ベースの面の色を無視してテクスチャの色になる. GL_BLEND:あらかじめglBlendFunc()で指定した色と面のベースの混合.テクスチャの色をもとにして,テクスチャの色がこいほどあらかじめ定義した色を強く混合し,そうでないときはベース面の色を強く混合する.default
例: glBlendFunc(ソース混合割合関数指定 ,デスティネーション混合割合関数指定); 第1パラメータ: GL_ZERO GL_ONE GL_DST_COLOR GL_ONE_MINUS_DST_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_ALPHA GL_ONE_MINUS_DST_ALPHA GL_SRC_ALPHA_SATURATE 第2パラメータ: GL_ZERO GL_ONE GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_ALPHA GL_ONE_MINUS_DST_ALPHA 例: glClearColor(1.0,1.0,1.0,1.0); glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(0.0,1.0,1.0,1.0); [デスティネーション多角形描画] glColor4f(1.0,0.0,0.0,0.5); [ソース多角形描画] glFlush(); glDisable(GL_BLEND);
decal mod. repl. blend
8.2.4. ポリゴンへのテクスチャのマッピング方法 t s 8.2.4. ポリゴンへのテクスチャのマッピング方法 下図のように,面全体にマッピングする場合や一部へのマッピングして繰り返すなどの方法がある. テクスチャ画像は縦サイズと横サイズが0~1.0に正規化された座標系なので,(b)のように繰り返す場合はテクスチャサイズを逆に大きく指定する(次ページプログラム) (a)正方形の面全体にマッピング (1,1) (b)正方形の面全体にマッピング (0,0) (5,5) (1,1) t (0,0) s (0,0)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, texColor); glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS);/* (a)正方形の面全体にマッピング glTexCoord2f(0.0,0.0);glVertex3f(1.0,0.0,1.0); glTexCoord2f(0.0,1.0);glVertex3f(1.0,0.0,-1.0); glTexCoord2f(1.0,1.0);glVertex3f(-1.0,0.0,-1.0); glTexCoord2f(1.0,0.0);glVertex3f(-1.0,0.0,1.0); glEnd(); glBegin(GL_QUADS);/* (b)正方形の面の一部にマッピング glTexCoord2f(0.0,0.0);glVertex3f(1.0,0.0,1.0); glTexCoord2f(0.0,5.0);glVertex3f(1.0,0.0,-1.0); glTexCoord2f(5.0,5.0);glVertex3f(-1.0,0.0,-1.0); glTexCoord2f(5.0,0.0);glVertex3f(-1.0,0.0,1.0); glEnd(); GL_BLEND を指定したときは画像のアルファ値は用いられず,かわりに画像の RGB 値が別に設定した色と下地の色との混合比として用いられる. テクスチャーマッピングサンプルプログラム c8-1integ.c
練習問題8-1: 1)p113の練習問題-1: 2)c8-1.cをコピーして環境パラメータを変更 c8-1modulate c8-1decal c8-1blend c8-1replace 3)bitmap2を表示 c8-1blend2
glTexParameter(GL_TEXTURE_2D,拡大縮小,設定値); 8.3 フィルタ 8.3.1 拡大フィルタと縮小フィルタ テクスチャのビットマップデータを面に貼り付けるときに1対1に対応させると面の大きさにより不都合が生じるため,貼り付ける面の大小に応じて拡大・縮小写像する. glTexParameter(GL_TEXTURE_2D,拡大縮小,設定値); 拡大縮小:GL_TEXTURE_MAG_FILTERまたはGL_TEXTURE_MIN_FILTER 設定値:GL_NEAREST 画素にもっとも近いテクスチャを拡大・縮小して使用 GL_LINEAR→周辺テクスチャを平均化して拡大・縮小
nearest linear
glTexParameteri(GL_TEXTURE_2D,拡大縮小,設定値); 8.3.2 ミップマップ テクスチャマッピングされた面が遠方に移動するとテクスチャの縮小処理が必要だが,処理が重く,CGアニメーションではちらつきの原因になる. →あらかじめ縮小したテクスチャを複数持っておき面の大きさに応じて適宜選択する. glTexParameteri(GL_TEXTURE_2D,拡大縮小,設定値); 拡大縮小:GL_TEXTURE_MAG_FILTERまたはGL_TEXTURE_MIN_FILTER 設定値:GL_NEAREST_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); gluBuild2DMipmaps(GL_TEXTURE_2D, 4, imagewidth, imageheight, GL_RGBA, GL_UNSIGNED_BYTE, image);
練習問題8-2: p116の練習問題-2 (1)GL_NEAREST→GL_LINEAR (2)Mipmap設定c8-2mipmap サンプルプログラムc8-2.c
例 8.4テクスチャ座標の自動生成 glTexGenf(座標軸の選択,モード選択 ,設定値) テクスチャ座標を設定せずに自動的にマッピングの対応づけを行なう 8.4.1 設定方法 glTexGenf(座標軸の選択,モード選択 ,設定値) 座標軸:GL_SまたはGL_T モード選択:GL_TEXTURE_GEN_MODE 設定値: GL_OBJECT_LINEAR :オブジェクトに固定した輪郭表示→ オブジェクトが移動や回転すると一緒に移動する GL_EYE_LINEAR:テクスチャが視点の座標系に固定されて物体がテク スチャの中を動くように見える GL_SPHERE_MAP:反射マッピング 例 glTexGenf(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glTexGenf(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glEnable(TEXTURE_GEN_S); glEnable(TEXTURE_GEN_T);
GL_OBJECT_LINEAR GL_EYE_LINEAR GL_SPHERE_LINEAR 練習問題8-3: 1)p117の練習問題-3 c8-3.cを修正して違いを確認する
glBindTexture(GL_TEXTURE_2D,Texture番号); テクスチャのバインド:指定した名前のテクスチャを有効にする命令. ・初めて使われたテクスチャ名が指定された場合は,自動的にオブジェクトが生成される. ・すでに宣言された番号であれば,以降,それが有効となる. このコマンドの後で, glTexImage2D 等でテクスチャを設定する. サンプルプログラムc8-4.c
readBitmapData( )の利用例 c8-4.cのinitTexure2をコピーして,以下のように,テクスチャ番号3を設定した initTexture3を作成して,initializeの中でcallする. 2)display関数のglBindTextureの適当な面のところのテクスチャ番号を変更する. void initTexture3(void) { unsigned char *image3[1]; int imageHeightb,imageWidthb; if(!ReadBitMapData("YCCampus-rr.bmp",&imageWidthb,&imageHeightb,image3)){ printf("error\n") ; exit(0) ; } glBindTexture(GL_TEXTURE_2D,3); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, 4,imageWidthb ,imageHeightb,0,GL_RGBA, GL_UNSIGNED_BYTE, *image3); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); #include <stdio.h> #include "read_bitmap.h“ int ReadBitMapData(); 注意:事前に右記の宣言をしておくこと