最終更新: mikk_ni3_92 2009年08月31日(月) 15:53:25履歴
現在地 >> メニュー >> 発展編01 >> 発展編01::ミップマップ >> 発展編01::まとめコード9
#include <iostream> #include <cv.h> #include <highgui.h> #include <GL/glut.h> //---------- 各種外部変数 ---------------// const char* filename = "test2.jpg"; float moveZ = 0; //------------- プロトタイプ宣言 --------------------// void display(); void reshape(int w, int h); void specialkeydown(int key, int x, int y); void DRAW_SQU(); //----- テクスチャID -----// GLuint texture[1]; //---------- 画像を読み込んでコンバート ----------------// bool LoadGLTextures(const char *filename) { IplImage *image1=cvLoadImage(filename,CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if(image1==NULL){return false;} cvCvtColor(image1, image1, CV_BGR2RGB); cvFlip(image1,NULL,0); //テクスチャ作成 glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); //フィルタ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image1->width,image1->height, GL_RGB,GL_UNSIGNED_BYTE,image1->imageData); cvReleaseImage( &image1 ); return true; }; //-------------OpenGLの初期設定------------------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("MipMap Sample"); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutSpecialFunc(specialkeydown); } void MY_INIT() { glClearColor(1.0, 1.0, 1.0, 1.0); if( LoadGLTextures(filename) == false){ //テクスチャの読み込みと作成 std::cerr << "Can't Load Image\n"; } glEnable(GL_DEPTH_TEST); int baselevel; int maxlevel; glGetTexParameteriv(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,&baselevel); glGetTexParameteriv(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL,&maxlevel); std::cout <<"(base, max)=("<< baselevel<< ", " << maxlevel << ")\n"; } //----------- メイン関数 ---------------// int main(int argc, char **argv) { glutInit(&argc,argv); GLUT_INIT(); GLUT_CALL_FUNC(); MY_INIT(); glutMainLoop(); return 0; } //----------- ここから各種コールバック ------------------// void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glTranslatef(0,0,moveZ); DRAW_SQU(); glutSwapBuffers(); } void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); } void specialkeydown(int key, int x, int y) { switch(key) { case GLUT_KEY_UP: moveZ += 0.1; break; case GLUT_KEY_DOWN: moveZ -= 0.1; break; case GLUT_KEY_RIGHT: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 3); //ベースレベル->3 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3); //最大レベル->3 break; case GLUT_KEY_LEFT: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); //ベースレベル->0 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); //最大レベル->0 break; } glutPostRedisplay(); } //----------- ここから各種関数 -----------// void DRAW_SQU() { glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glTexCoord2f(0.0, 1.0); glVertex2f(-1,1); glTexCoord2f(0.0, 0.0); glVertex2f(-1,-1); glTexCoord2f(1.0, 0.0); glVertex2f(1,-1); glTexCoord2f(1.0, 1.0); glVertex2f(1,1); glEnd(); glDisable(GL_TEXTURE_2D); }