最終更新: mikk_ni3_92 2010年01月24日(日) 19:08:28履歴
現在地: メニュー >> 発展編08 >> 発展編08::まとめコード2
#include <iostream> #include <GL/glew.h> #include <GL/glut.h> //---------- 頂点の配列データ ------------------// //6面、4頂点、1頂点はx,y,zの3要素 float PointAry[6][4][3] = { //1つめの面(v0,v1,v2,v3) { {0,0,0},{1,0,0},{1,1,0},{0,1,0}}, //2つめの面(v1,v5,v6,v2) { {1,0,0},{1,0,-1},{1,1,-1},{1,1,0} }, //3つめの面(v4,v7,v6,v5) { {0,0,-1},{0,1,-1},{1,1,-1},{1,0,-1} }, //4つめの面(v4,v0,v3,v7) { {0,0,-1},{0,0,0},{0,1,0},{0,1,-1} }, //5つめの面(v3,v2,v6,v7) { {0,1,0},{1,1,0},{1,1,-1},{0,1,-1} }, //6つめの面(v0,v4,v5,v1) { {0,0,0},{0,0,-1},{1,0,-1},{1,0,0} } }; //------------ 法線データ --------------// float NormalAry[6][4][3] = { //1つめの面(v0,v1,v2,v3) {{0,0,1},{0,0,1},{0,0,1},{0,0,1}}, //2つめの面(v1,v5,v6,v2) {{1,0,0},{1,0,0},{1,0,0},{1,0,0}}, //3つめの面(v4,v7,v6,v5) {{0,0,-1},{0,0,-1},{0,0,-1},{0,0,-1}}, //4つめの面(v4,v0,v3,v7) {{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0}}, //5つめの面(v3,v2,v6,v7) {{0,1,0},{0,1,0},{0,1,0},{0,1,0}}, //6つめの面(v0,v4,v5,v1) {{0,-1,0},{0,-1,0},{0,-1,0},{0,-1,0}} }; //---------- 色データ ------------// float ColorAry[6][4][3] = { //1つめの面(v0,v1,v2,v3) {{0,0,1},{0,0,1},{0,0,1},{0,0,1}}, //2つめの面(v1,v5,v6,v2) {{1,0,0},{1,0,0},{1,0,0},{1,0,0}}, //3つめの面(v4,v7,v6,v5) {{0,1,1},{0,1,1},{0,1,1},{0,1,1}}, //4つめの面(v4,v0,v3,v7) {{1,1,0},{1,1,0},{1,1,0},{1,1,0}}, //5つめの面(v3,v2,v6,v7) {{0,1,0},{0,1,0},{0,1,0},{0,1,0}}, //6つめの面(v0,v4,v5,v1) {{1,0,1},{1,0,1},{1,0,1},{1,0,1}} }; //---------- 頂点の配列データ2 ------------------// //4面、3頂点、3座標 float PointAry2[4][3][3] = { {{0,0,0},{0,0,1},{0,1,0}}, {{0,0,0},{1,0,0},{0,0,1}}, {{0,0,0},{0,1,0},{1,0,0}}, {{0,1,0},{0,0,1},{1,0,0}} }; float NormalAry2[4][3][3] = { {{-1,0,0},{-1,0,0},{-1,0,0}}, {{0,-1,0},{0,-1,0},{0,-1,0}}, {{0,0,-1},{0,0,-1},{0,0,-1}}, {{1,1,1},{1,1,1},{1,1,1}} }; float ColorAry2[4][3][3] = { {{1,0,0},{1,0,0},{1,0,0}}, {{0,1,0},{0,1,0},{0,1,0}}, {{0,0,1},{0,0,1},{0,0,1}}, {{0,1,1},{0,1,1},{0,1,1}} }; //VAO用ID GLuint VaoId[2]; //VBO用ID GLuint VboId[2]; //------------ プロトタイプ宣言 --------------// void display(); void reshape(int w, int h); void DRAW(); void timer(int value); void BuildVBO(); //------------- OpenGLの初期設定 ------------------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("VBOs"); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutTimerFunc(0,timer,17); } 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(); 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 timer(int t) { glutPostRedisplay(); glutTimerFunc(t,timer,17); //タイマー関数 } //------------ ここから各種関数 ------------------// void DRAW() { glBindVertexArray(VaoId[0]);//vao切り替え glDrawArrays(GL_QUADS,0,4*6); glBindVertexArray(VaoId[1]);//vao切り替え glDrawArrays(GL_TRIANGLES,0,3*4); glBindVertexArray(0);//vao切り替え } //--------------------------// void BuildVBO() { //Vao2つ作成 glGenVertexArrays(2,&VaoId[0]); glBindVertexArray(VaoId[0]);//vao切り替え glGenBuffers(2, &VboId[0]);//VBO2つ作成 //-------------- VBO1つ目 ----------------------// glBindBuffer(GL_ARRAY_BUFFER, VboId[0]); //バインド //データをVBOにコピー //xyzの3座標*4頂点*6面 * int bufferSizes = (3*4)*6*sizeof(float) + (3*4)*6*sizeof(float) + (3*4)*6*sizeof(float); glBufferData(GL_ARRAY_BUFFER, bufferSizes, 0, GL_STATIC_DRAW);//メモリ確保 //データコピー glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(PointAry), PointAry); glBufferSubData(GL_ARRAY_BUFFER, sizeof(PointAry), sizeof(NormalAry), NormalAry); glBufferSubData(GL_ARRAY_BUFFER, sizeof(PointAry)+sizeof(NormalAry), sizeof(ColorAry), ColorAry); //例外チェック(VBOと配列のサイズがあっているか?) int bufferforCheck = 0; glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufferforCheck); if(bufferSizes != bufferforCheck)//一致していない場合 { std::cerr << "Can't Create VBO\n"; glDeleteBuffers(2, &VboId[0]); exit(0); } glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3,GL_FLOAT, 0, (void*)(sizeof(PointAry)+sizeof(NormalAry)));//色を設定(3色、float型、オフセット0) glNormalPointer(GL_FLOAT, 0, (void*)sizeof(PointAry));//法線を設定 glVertexPointer(3, GL_FLOAT, 0, 0); //1頂点は3つで構成、float型、オフセット0、データ元 //VAO切り替え glBindVertexArray(VaoId[1]); //---------------- VBO 2つ目 ----------------------// glBindBuffer(GL_ARRAY_BUFFER, VboId[1]); //バインド int bufferSizes2 = (3*3)*4*sizeof(float) + (3*3)*4*sizeof(float) + (3*3)*4*sizeof(float); glBufferData(GL_ARRAY_BUFFER, bufferSizes2, 0, GL_STATIC_DRAW);//メモリ確保 //データコピー glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(PointAry2), PointAry2); glBufferSubData(GL_ARRAY_BUFFER, sizeof(PointAry2), sizeof(NormalAry2), NormalAry2); glBufferSubData(GL_ARRAY_BUFFER, sizeof(PointAry2)+sizeof(NormalAry2), sizeof(ColorAry2), ColorAry2); //例外チェック(VBOと配列のサイズがあっているか?) bufferforCheck = 0; glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufferforCheck); if(bufferSizes2 != bufferforCheck)//一致していない場合 { std::cerr << "Can't Create VBO\n"; glDeleteBuffers(2, &VboId[0]); exit(0); } glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3,GL_FLOAT, 0, (void*)(sizeof(PointAry2)+sizeof(NormalAry2)));//色を設定(3色、float型、オフセット0) glNormalPointer(GL_FLOAT, 0, (void*)sizeof(PointAry2));//法線を設定 glVertexPointer(3, GL_FLOAT, 0, 0); //1頂点は3つで構成、float型、オフセット0、データ元 glBindBuffer(GL_ARRAY_BUFFER, 0); //バインド glBindVertexArray(0); }