• 検索結果がありません。

次の例(sample-checker.c)は,テクスチャマッピングのサンプルプログラムである.glTexImage2D()の 使用している.

図13 頂点に画像の座標を対応づける

#include <GL/glut.h>

#include <stdlib.h>

/* Create checkerboard texture */

#define checkImageWidth 64

#define checkImageHeight 64

GLubyte checkImage[checkImageWidth][checkImageHeight][3];

void makeCheckImage(void) {

int i, j, c;

for (i = 0; i < checkImageWidth; i++) { for (j = 0; j < checkImageHeight; j++) {

c = ((((i&0x8)==0)^((j&0x8)==0)))*255;

checkImage[i][j][0] = (GLubyte) c;

checkImage[i][j][1] = (GLubyte) c;

checkImage[i][j][2] = (GLubyte) c;

} } }

void myinit(void) {

glClearColor (0.0, 0.0, 0.0, 0.0);

glEnable(GL_DEPTH_TEST);

glDepthFunc(GL_LESS);

makeCheckImage();

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

8.2 簡単な例 39

glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,

checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,

&checkImage[0][0][0]);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

glEnable(GL_TEXTURE_2D);

glShadeModel(GL_FLAT);

}

void display(void) {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBegin(GL_QUADS);

glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);

glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);

glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);

glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);

glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);

glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);

glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);

glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);

glEnd();

glutSwapBuffers();

}

void myReshape(int w, int h) {

glViewport(0, 0, w, h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(60.0, 1.0*(GLfloat)w/(GLfloat)h, 1.0, 30.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glTranslatef(0.0, 0.0, -3.6);

}

int

main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

glutCreateWindow("checker");

myinit();

glutReshapeFunc (myReshape);

glutDisplayFunc(display);

glutMainLoop();

return 0; /* ANSI C requires main to return int. */

}

テクスチャ画像の準備

サンプルコードでは,テクスチャ画像の準備はmakeCheckImage関数の中でおこなわれている.テクス チャバッファの2次元配列には,GLubyte型(unsigned char)でWIDTHxHEIGHTx3個となっている.

1画素にRGBの3バイトを割り当てている.テクスチャのサイズは縦横とも,通常2の累乗になっていなけ ればならず,ここでは64x64になっている.

makeCheckImage関数の内部では,配列にチェック模様を格納していく. 白いチェック模様を描くために,

配列番号の下位1ビットで白黒を判定している.つまり2で割り切れる場合は1,そうでなければ0をcに代 入する.最終的に配列には0か255の値が代入される.

テクスチャの設定・格納

配列をテクスチャバッファに読みこむ.ここでは,テクスチャの格納もプログラム初期化時にmyinit関数 で行われる.

glPixelStorei()は,テクスチャバッファに格納される際の配列の並びを指定する.image[ ]という名前のつ いた配列は並びが連続している,という指定をして,テクスチャバッファに格納する.

glTexParameteri, glTexParameterfはテクスチャバッファを利用する際の設定をおこない,テクスチャの 反復やクランプ,拡大縮小時の描画に関する制御が可能である.

GL TEXTURE MAG FILTER(またはGL TEXTURE MIN FILTER)でテクスチャの拡大(MAG)、 縮小(MIN)処理をする場合の処理の方法を設定をする.GL LINEARは,線形補間した画像を作成したマッ ピングになり,GL NEARESTは最も近い点の値を利用する.

GL TEXTURE WRAP S(T)は,s,(t)方向に対して繰り返すか(GL REPAET),打ち切る(GL CLAMP) かを指定する.3回繰り返してマッピングする場合,画像の位置を0.0..3.0と対応させる.

glTexEnvfは,テクスチャ画像の表示方法を指定する.GL DECALでは,画像をそのまま面に貼り付けて 表示し,元の面の色(明るさ)は無視される.マップする面に色が定義されている場合や元の面の陰影を生か したい場合は,GL MODULATEで画像の色と面の色を乗算した色にすることができる.

8.2 簡単な例 41

テクスチャの指定

glTexImage2Dは,配列の内容をテクスチャバッファに格納する実質的なコマンドである.このコマンドで

は以下の引数を持つ.

void glTexImage2D(GLenum target, GLint level, GLint format, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);

2次元テクスチャを定義する.targetには,GL TEXTURE 2Dを入れる.ミップマップを作るときなど は,GL PROXY TEXTURE 2Dを入れることもある.

levelは通常は0を指定.自分でミップマップを作る場合,1以上の値を入れる.

formatは読み込まれるデータ要素の種類(RGBA等).画像と同様であり,GL RGBかGL RGBAを指定 する場合が多い.

widthとheightは,テクスチャマップの幅と高さ.OpenGLでは,テクスチャの大きさは,2の累乗であ る必要がある.すなわち,1,2,4,8,16,32,64,128,256・・・.規格上は最低でも64x64の大きさの テクスチャがサポートされ,実際には,1024x1024ぐらいはサポートされる.

borderは,テクスチャに枠をつけるなら1を指定する.普通は0.

formatは,pixelsに渡すデータの形式.通常は,RGB形式で記録されている場合,GL RGBを指定.も し,PNGなどのフォーマットで透明度設定もあれば,GL RGBAを指定する.

typeには,pixelsに渡すデータの型を指定.通常は各色8ビットなので,GL UNSIGNED BYTEを指定 する.

頻繁に使うパラメータはwidth,height,pixel.width,heightはテクスチャバッファのサイズであり,それぞ れ2の累乗であることが必要である.pixelsにはテクスチャが格納されている配列へのポインタ(ここでは image)を指定する.

テクスチャの貼りつけ

テクスチャの切り取り,貼り付け指定は,物体の描画時におこなわれる.ここではdisplay()関数で行わ れる.

重要なのは,テクスチャマッピングを有効にするために,glEnable(GL TEXTURE 2D)をコールすること である.glDisable(GL TEXTURE 2D)を呼ぶとテクスチャマッピングを無効になる.この切り替えを上手 に行わないと,表示されるポリゴンすべてにテクスチャマッピングが適用される恐れがある.

関連したドキュメント