#include <iostream> #include <GL/glew.h> #include <GL/glut.h> //---------- 頂点の配列データ ------------------// //6面、4頂点、1頂点はx,y,zの3要素 float PointAry[6][4][3] = { //1つめの面 { {0,0,0}, //v0 {1,0,0}, //v1 {1,1,0}, //v2 {0,1,0} //v3 }, //2つめの面 { {1,0,0}, //v1 {1,0,-1}, //v5 {1,1,-1}, //v6 {1,1,0} //v2 }, //3つめの面 { {0,0,-1}, //v4 {0,1,-1}, //v7 {1,1,-1}, //v6 {1,0,-1} //v5 }, //4つめの面 { {0,0,-1}, //v4 {0,0,0}, //v0 {0,1,0}, //v3 {0,1,-1} //v7 }, //5つめの面 { {0,1,0}, //v3 {1,1,0}, //v2 {1,1,-1}, //v6 {0,1,-1} //v7 }, //6つめの面 { {0,0,0}, //v0 {0,0,-1}, //v4 {1,0,-1}, //v5 {1,0,0} //v1 } }; //------------ 法線データ --------------// float NormalAry[6][4][3] = { //1つめの面 { {0,0,1}, //v0 {0,0,1}, //v1 {0,0,1}, //v2 {0,0,1} //v3 }, //2つめの面 { {1,0,0}, //v1 {1,0,0}, //v5 {1,0,0}, //v6 {1,0,0} //v2 }, //3つめの面 { {0,0,-1}, //v4 {0,0,-1}, //v7 {0,0,-1}, //v6 {0,0,-1} //v5 }, //4つめの面 { {-1,0,0}, //v4 {-1,0,0}, //v0 {-1,0,0}, //v3 {-1,0,0} //v7 }, //5つめの面 { {0,1,0}, //v3 {0,1,0}, //v2 {0,1,0}, //v6 {0,1,0} //v7 }, //6つめの面 { {0,-1,0}, //v0 {0,-1,0}, //v4 {0,-1,0}, //v5 {0,-1,0} //v1 } }; //---------- 色データ ------------// float ColorAry[6][4][3] = { //1つめの面 { {0,0,1}, //v0 {0,0,1}, //v1 {0,0,1}, //v2 {0,0,1} //v3 }, //2つめの面 { {1,0,0}, //v1 {1,0,0}, //v5 {1,0,0}, //v6 {1,0,0} //v2 }, //3つめの面 { {0,1,1}, //v4 {0,1,1}, //v7 {0,1,1}, //v6 {0,1,1} //v5 }, //4つめの面 { {1,1,0}, //v4 {1,1,0}, //v0 {1,1,0}, //v3 {1,1,0} //v7 }, //5つめの面 { {0,1,0}, //v3 {0,1,0}, //v2 {0,1,0}, //v6 {0,1,0} //v7 }, //6つめの面 { {1,0,1}, //v0 {1,0,1}, //v4 {1,0,1}, //v5 {1,0,1} //v1 } }; //VBO用ID GLuint VboId[3];//3つ分 //------------ プロトタイプ宣言 --------------// void display(); void reshape(int w, int h); void DRAW(); void idle(); void BuildVBO(); //------------- OpenGLの初期設定 ------------------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("VBO"); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutIdleFunc(idle); } void MY_INIT() { glClearColor(1.0, 1.0, 1.0, 1.0); glEnable(GL_DEPTH_TEST); //材質はglColorで設定する glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); } //-------------- メイン関数 ----------------// int main(int argc, char **argv) { glutInit(&argc,argv); GLUT_INIT(); GLUT_CALL_FUNC(); MY_INIT(); glewInit(); BuildVBO(); glutMainLoop(); glDeleteBuffers(3, &VboId[0]);//使い終わったら削除(終了処理部分で書く) return 0; } //--------------- ここからコールバック ------------------// void display() { static int r = 0; static float LightPos[]= {10,10,10,0}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //視点の設定 glLightfv(GL_LIGHT0, GL_POSITION, LightPos); glPushMatrix(); glRotatef(static_cast<float>(r),1,0,0); glRotatef(static_cast<float>(r+45),0,1,0); DRAW();//描画 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); } void idle() { glutPostRedisplay(); } //------------ ここから各種関数 ------------------// void DRAW() { //格納場所を伝える glBindBuffer(GL_ARRAY_BUFFER, VboId[0]); //バインド glVertexPointer(3, GL_FLOAT, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, VboId[1]); //バインド glNormalPointer(GL_FLOAT, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, VboId[2]); //バインド glColorPointer(3,GL_FLOAT, 0, 0); //有効化して描画 glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glDrawArrays(GL_QUADS,0,4*6); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); } //--------------------------// void BuildVBO() { int bufferforCheck = 0; //チェック用 glGenBuffers(3, &VboId[0]); //発生 //頂点 glBindBuffer(GL_ARRAY_BUFFER, VboId[0]); //バインド glBufferData(GL_ARRAY_BUFFER, sizeof(PointAry), PointAry, GL_STATIC_DRAW); glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufferforCheck); if(sizeof(PointAry) != bufferforCheck)//一致していない場合 { std::cerr << "Can't Create VBO\n"; glDeleteBuffers(3, &VboId[0]); exit(0); } //法線 glBindBuffer(GL_ARRAY_BUFFER, VboId[1]); //バインド glBufferData(GL_ARRAY_BUFFER, sizeof(NormalAry), NormalAry, GL_STATIC_DRAW); glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufferforCheck); if(sizeof(NormalAry) != bufferforCheck)//一致していない場合 { std::cerr << "Can't Create VBO\n"; glDeleteBuffers(3, &VboId[0]); exit(0); } //色 glBindBuffer(GL_ARRAY_BUFFER, VboId[2]); //バインド glBufferData(GL_ARRAY_BUFFER, sizeof(ColorAry), ColorAry, GL_STATIC_DRAW); glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufferforCheck); if(sizeof(ColorAry) != bufferforCheck)//一致していない場合 { std::cerr << "Can't Create VBO\n"; glDeleteBuffers(3, &VboId[0]); exit(0); } }