Document

8- 1
8.
テクスチャマッピング
8.1. テクスチャマッピングの原理
狭義には,図のように,与えられた画像を物体に貼り付ける方法.
マッピングには投影法,極座標変換,パラメータマッピングなどがある(CG入門).
広義にはバンプマッピングなども含まれる.
y
t
s
z
x
8- 2
8.2. テクスチャマッピングの設定方法
全体の流れ
1)原図ビットマップデータを内部形式に変換
2)ラッピング方法の設定
3)テクスチャの設定
4)対応空間の指定
8.2.1. アラインメント設定
コンピュータ上のメモリアクセス実装方法によって,画像が格納されているメモリ
領域の番地が1,2,4,8の倍数のいずれかに限られるときがある.大きい単位
でアクセス(取り出す)できるほうが効率的であるが,その単位を指定する
(defaultは4).→最近のコンピュータではあまり意識する必要はない.
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
8- 3
8.2.2. テクスチャパラメータの設定
テクスチャによるラップ方法,フィルタの指定,境界の色指定などを行なうことが
できる.
ラップの設定
貼り付けるテクスチャイメージに比べ貼り付けられる面のサイズが大きいとき,イ
メージを繰り返す必要がある.この際,最小限のイメージを記憶させて繰り返して
使用すればメモリを節減できる.
テクスチャイメージの(s,t)座標それぞれに画像の繰り返し指定ができる.
glTexParameteri(GL_TEXTURE_2D,座標方向,繰り返し設定);
座標方向:GL_TEXTURE_WRAP_Sまたは_T
繰り返し設定:GL_REPEAT→繰り返しdefault
GL_CLAMP→画像の最終部をそのまま維持する
テクスチャーマッピン
y
グサンプルプログラム
t
c8-1.c
s
z
x
8- 4
repeat
clamp-s
clamp-t
clamp-st
8- 5
8.2.3. テクスチャ環境設定
テクスチャを,貼り付けられる物体(ベース)の持つ表面属性とどのように混ぜ合
わせるかを設定する.
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,モード);
モード
GL_MODULATE:テクスチャとベースの面の色(RGBA)を掛け合わせた色に
なる
GL_DECAL:ステッカを貼るイメージ.透明でなければテクスチャの色.透
明なら透明度に応じた混合色になる
GL_REPLACE:ベースの面の色を無視してテクスチャの色になる.
GL_BLEND:あらかじめglBlendFunc()で指定した色と面のベースの混合.テクス
チャの色をもとにして,テクスチャの色がこいほどあらかじめ定義した色を強く混合
し,そうでないときはベース面の色を強く混合する.default
8- 6
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);
8- 7
mod.
repl.
decal
blend
8- 8
8.2.4. ポリゴンへのテクスチャのマッピング方法
下図のように,面全体にマッピングする場合や一部へのマッピングして
繰り返すなどの方法がある.
テクスチャ画像は縦サイズと横サイズが0~1.0に正規化された座標系な
ので,(b)のように繰り返す場合はテクスチャサイズを逆に大きく指定する
(次ページプログラム)
(a)正方形の面全体にマッピング
(1,1)
(b)正方形の面全体に
マッピング
(0,0)
(5,5)
(1,1)
t
(0,0)
s
(0,0)
8- 9
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-10
練習問題8-1:
1)p113の練習問題-1:
2)c8-1.cをコピーして環境パラメータを変更
c8-1modulate
c8-1decal
c8-1blend
c8-1replace
3)bitmap2を表示
c8-1blend2
8-11
8.3 フィルタ
8.3.1 拡大フィルタと縮小フィルタ
テクスチャのビットマップデータを面に貼り付けるときに1対1に対応させると面の
大きさにより不都合が生じるため,貼り付ける面の大小に応じて拡大・縮小写像
する.
glTexParameter(GL_TEXTURE_2D,拡大縮小,設定値);
拡大縮小:GL_TEXTURE_MAG_FILTERまたはGL_TEXTURE_MIN_FILTER
設定値:GL_NEAREST 画素にもっとも近いテクスチャを拡大・縮小して使用
GL_LINEAR→周辺テクスチャを平均化して拡大・縮小
8-12
nearest
linear
8-13
8.3.2 ミップマップ
テクスチャマッピングされた面が遠方に移動するとテクスチャの縮小処理が必要
だが,処理が重く,CGアニメーションではちらつきの原因になる.
→あらかじめ縮小したテクスチャを複数持っておき面の大きさに応じて適宜選択
する.
glTexParameteri(GL_TEXTURE_2D,拡大縮小,設定値);
拡大縮小:GL_TEXTURE_MAG_FILTERまたはGL_TEXTURE_MIN_FILTER
設定値:GL_NEAREST_MIPMAP_NEAREST
GL_LINEAR_MIPMAP_LINEAR
8-14
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-15
練習問題8-2:
p116の練習問題-2
(1)GL_NEAREST→GL_LINEAR
(2)Mipmap設定c8-2mipmap
サンプルプログラムc8-2.c
8-16
8.4テクスチャ座標の自動生成
テクスチャ座標を設定せずに自動的にマッピングの対応づけを行なう
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);
8-17
GL_OBJECT_LINEAR
GL_EYE_LINEAR
GL_SPHERE_LINEAR
練習問題8-3:
1)p117の練習問題-3
c8-3.cを修正して違いを確認する
8-18
glBindTexture(GL_TEXTURE_2D,Texture番号);
テクスチャのバインド:指定した名前のテクスチャを有効にする命令.
・初めて使われたテクスチャ名が指定された場合は,自動的にオブジェクトが生
成される.
・すでに宣言された番号であれば,以降,それが有効となる.
このコマンドの後で,
glTexImage2D
等でテクスチャを設定する.
サンプルプログラムc8-4.c
8-19
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();