最終更新: mikk_ni3_92 2010年02月26日(金) 16:37:36履歴
現在地 >> メニュー >> 発展編01 >> 発展編01::テクスチャ行列 >> 発展編01::まとめコード10_2
#include <iostream> #include <string> #include <cv.h> #include <highgui.h> #include <GL/glut.h> //---------- 各種外部変数 ---------------// const std::string filename = "test2.jpg"; float anglef = 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) { cv::Ptr<IplImage> imgA = cvLoadImage(filename,CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if(imgA.empty()) { std::cerr << "Can't Load Image\n"; return false; } cvFlip(imgA); //反転(左上原点→左下原点) cvCvtColor(imgA,imgA,CV_BGR2RGB);//BGR->RGBに変換 //テクスチャ作成 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_RGB, imgA->width,imgA->height,0, GL_RGB,GL_UNSIGNED_BYTE,imgA->imageData); return true; //ここでcv::Ptrのメモリが破棄される }; //-------------OpenGLの初期設定------------------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("Texture Matrix Mode"); } 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.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() { 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); glPushMatrix(); glMatrixMode(GL_TEXTURE); //モード切替え glLoadIdentity(); glRotatef(anglef,0,0, 1.f); DRAW_SQU(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPopMatrix(); 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_RIGHT: ++anglef; if(anglef > 360.f) anglef = 1.f; break; case GLUT_KEY_LEFT: --anglef; if(anglef < 0.f) anglef = 359.f; break; } std::cout << "angle = " << anglef << "\n"; glutPostRedisplay(); } //----------- ここから各種関数 -----------// void DRAW_SQU() { glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glTexCoord2f(0.f, 1.f); glVertex2f(-1.f,1.f); glTexCoord2f(0.f, 0.f); glVertex2f(-1.f,-1.f); glTexCoord2f(1.f, 0.f); glVertex2f(1.f,-1.f); glTexCoord2f(1.f, 1.f); glVertex2f(1.f,1.f); glEnd(); glDisable(GL_TEXTURE_2D); }