#include <gl/glut.h> //頂点座標 float vertices[][2] = { {-0.5f, 0.5f}, {-0.5f, -0.5f}, {0.5f, -0.5f}, {0.5f, 0.5f}, }; //uv(st)座標 float uvs[][2] = { {0.f, 1.f}, {0.f, 0.f}, {1.f, 0.f}, {1.f, 1.f}, }; //テクスチャハンドル GLuint hTextures[1]; const unsigned TEXSIZE = 64; //画素バッファ GLubyte texImage[TEXSIZE][TEXSIZE][4]; //アイドル時にも画面は更新する void Idle() { glutPostRedisplay(); } //描画関数 void Display() { glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, hTextures[0]); //反時計回りに板ポリを描画 glBegin(GL_QUADS); { glVertex2fv(vertices[0]); glTexCoord2fv(uvs[0]); glVertex2fv(vertices[1]); glTexCoord2fv(uvs[1]); glVertex2fv(vertices[2]); glTexCoord2fv(uvs[2]); glVertex2fv(vertices[3]); glTexCoord2fv(uvs[3]); } glEnd(); glBindTexture(GL_TEXTURE_2D, 0); glDisable(GL_TEXTURE_2D); glutSwapBuffers(); } //テクスチャ初期化 void InitTexture() { //テクスチャを1枚生成する glGenTextures(1, hTextures); //今回は計算でテクスチャを作る for(unsigned y=0; y<TEXSIZE; ++y) { int yy = y / 8; for(unsigned x=0; x<TEXSIZE; ++x) { int xx = x / 8; int col = ((yy+xx)&1)*255; texImage[y][x][0] = col; //r texImage[y][x][1] = 0; //g texImage[y][x][2] = ~col;//b texImage[y][x][3] = 0xff;//a } } glPixelStorei(GL_UNPACK_ALIGNMENT, 4); //hTexures[0]の設定をここから行うという宣言 glBindTexture(GL_TEXTURE_2D, hTextures[0]); //VRAMにイメージを転送 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEXSIZE, TEXSIZE, 0, GL_RGBA, GL_UNSIGNED_BYTE, texImage); //テクスチャマッピング方式。今回は繰り返しなし glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); //補完フィルタ設定。市松模様なのでnearestでおk glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //ポリゴンカラーとの混色設定 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //hTexures[0]の設定終了 glBindTexture(GL_TEXTURE_2D, 0); } //エントリポイント int main(int argc, char **argv) { //お決まりの処理 glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGBA); glutCreateWindow("DrawTexture"); glutDisplayFunc(Display); glutIdleFunc(Idle); glClearColor(0,0,0,1); InitTexture(); //メインループに入る glutMainLoop(); //終了処理 glDeleteTextures(1, hTextures); return 0; }テクスチャを表示するだけでこの面倒さ。実際にはBMPなどの画像を読み込む処理も要りますから、これからが大変ですな・・・。あと、3次元配列を最初から用意しておくのもどうかと思うので、こいつをクラス化したりもしました。この辺はまたあとで。
2010年4月20日火曜日
OpenGLでテクスチャ表示
楽勝だと思っていたが意外と苦労した。アラインメントや配列について学びなおすいい機会だったと思う。とりあえず、テクスチャを表示するだけコードを載せてみよう。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿