最終更新: mikk_ni3_92 2009年02月04日(水) 16:48:16履歴
現在地: メニュー >> 発展編01 >> 発展編01::テクスチャ圧縮 >> 発展編01::まとめコード5
#include <iostream> #include <string> #include <cv.h> #include <highgui.h> #include <GL/glut.h> //---------- 各種外部変数 ---------------// const std::string filename = "test2.jpg"; //------------- プロトタイプ宣言 --------------------// void display(); void reshape(int w, int h); void timer(int value); 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;} cvFlip(image1,NULL,0); //反転(左上原点→左下原点) glHint(GL_TEXTURE_COMPRESSION_HINT, GL_NICEST);//品質重視の圧縮 //テクスチャ作成 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); //縮小フィルタ glTexImage2D(GL_TEXTURE_2D,0,GL_COMPRESSED_RGB, image1->width,image1->height,0, GL_BGR,GL_UNSIGNED_BYTE,image1->imageData); //圧縮されたかどうか?のチェック int Flag; glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED, &Flag); if( Flag == 1 ){ std::cout << "compressed!\n"; } else{ std::cout << "uncompressed!\n"; } std::cout << "------------------------\n"; //圧縮後のサイズを取得 int imageSize; glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &imageSize); std::cout <<imageSize << " : Compressed Image Size \n"; std::cout << image1->imageSize << " : Original Image Size \n"; cvReleaseImage( &image1 ); return true; }; //-------------OpenGLの初期設定------------------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("Texture with OpenCV"); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutTimerFunc(0,timer,17); } void MY_INIT() { glClearColor(1.0, 1.0, 1.0, 1.0); if( LoadGLTextures(filename.c_str()) == false){ //テクスチャの読み込みと作成 std::cerr << "Can't Load Image\n"; } glEnable(GL_DEPTH_TEST); } //----------- メイン関数 ---------------// int main(int argc, char **argv) { glutInit(&argc,argv); GLUT_INIT(); GLUT_CALL_FUNC(); MY_INIT(); glutMainLoop(); return 0; } //----------- ここから各種コールバック ------------------// void display() { static int r = 0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotated((double)r, 0.0, 1.0, 0.0); DRAW_SQU(); glPopMatrix(); glutSwapBuffers(); if(++r > 360){ r= 0; } } 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); glLoadIdentity(); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); } void timer(int value) { glutPostRedisplay(); glutTimerFunc(value,timer,17); //タイマー関数 } //----------- ここから各種関数 -----------// void DRAW_SQU() { glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glTexCoord2d(0.0, 1.0); glVertex2d(-1,1); glTexCoord2d(0.0, 0.0); glVertex2d(-1,-1); glTexCoord2d(1.0, 0.0); glVertex2d(1,-1); glTexCoord2d(1.0, 1.0); glVertex2d(1,1); glEnd(); glDisable(GL_TEXTURE_2D); }