d10070dd

sample25-triangle-4

Oct 26th, 2013
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.39 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>//glut.hより先にインクルード
  4. #include <gl/glew.h>//glut.hより先にインクルード
  5. #include <gl/glut.h>
  6.  
  7. //------- 頂点データ-----------//
  8. //「6」面、「4」頂点、1頂点はx,y,zの「3」要素
  9. GLfloat vertexAry[4][3] =
  10. {
  11.  
  12.     {-0.8f,0.8f,0.0f},{0.8f,0.8f,0.0f},
  13.     {-0.8f,-0.8f,0.f},{0.8f,-0.8f,0.0f}
  14.  
  15. };
  16.  
  17. //法線データ
  18. GLfloat normalAry[4][3] =
  19. {
  20.  
  21.     {0.f,0.f,1.f},{0.f,0.f,1.f},
  22.     {0.f,0.f,1.f},{0.f,0.f,1.f}
  23.  
  24. };
  25.  
  26. //色データ
  27. GLfloat colorAry[4][3] =
  28. {
  29.     {0.f,0.f,1.f},{0.f,0.f,1.f},
  30.     {0.f,0.f,1.f},{0.f,0.f,1.f}
  31. };
  32. //インデックス
  33. GLint indexAry[]=
  34. {
  35.     0,1,2,3
  36. };
  37.  
  38. // π/180の値
  39. const float PI_OVER_180 = 0.0174532925f;
  40.  
  41. //VBO用ID
  42. GLuint VboId[3];//3つ分
  43. GLuint VboIndex;//インデックス
  44.  
  45. //描画関数
  46. void drawAry(void)
  47. {
  48.     GLfloat *clientPtr;//クライアント側用
  49.     GLfloat tmp[3];
  50.     int idloop;
  51.     int loop;
  52.     static float angle = 2*PI_OVER_180;
  53.  
  54.     //データの場所を知らせる
  55.     //座標
  56.     glBindBuffer(GL_ARRAY_BUFFER,VboId[0]);
  57.     glVertexPointer(3, GL_FLOAT, 0, 0);
  58.     //法線
  59.     glBindBuffer(GL_ARRAY_BUFFER,VboId[1]);
  60.     glNormalPointer(GL_FLOAT, 0, 0);
  61.     //色
  62.     glBindBuffer(GL_ARRAY_BUFFER,VboId[2]);
  63.     glColorPointer(3,GL_FLOAT, 0, 0);
  64.     //インデックスもバインド
  65.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VboIndex);
  66.  
  67.     glEnableClientState(GL_VERTEX_ARRAY);
  68.     glEnableClientState(GL_NORMAL_ARRAY);
  69.     glEnableClientState(GL_COLOR_ARRAY);
  70.     //描画
  71.     glDrawElements(GL_TRIANGLE_STRIP,4,GL_UNSIGNED_INT,0);
  72.    
  73.     glDisableClientState(GL_COLOR_ARRAY);
  74.     glDisableClientState(GL_NORMAL_ARRAY);
  75.     glDisableClientState(GL_VERTEX_ARRAY);
  76.  
  77.     //座標と法線を回転させる
  78.     for(idloop = 0; idloop < 2;++idloop)
  79.     {
  80.         //idloop番目のバッファオブジェクトに注目
  81.         glBindBuffer(GL_ARRAY_BUFFER,VboId[idloop]);
  82.        
  83.         //対応付け
  84.         clientPtr = (GLfloat *)glMapBuffer(GL_ARRAY_BUFFER,GL_READ_WRITE);
  85.  
  86.         if(clientPtr != NULL)
  87.         {
  88.             //24頂点*3座標
  89.              for(loop = 0; loop < 4*3;loop += 3)    {
  90.                 //読み出し(READ)
  91.                 tmp[0] = clientPtr[loop];
  92.                 tmp[1] = clientPtr[loop+1];
  93.                 tmp[2] = clientPtr[loop+2];
  94.                 //書き込み(WRITE)
  95.                 clientPtr[loop] = cos(angle)*tmp[0]
  96.                                     + sin(angle)*tmp[2];
  97.                 clientPtr[loop+1] = tmp[1];
  98.                 clientPtr[loop+2] = -sin(angle)*tmp[0]
  99.                                         + cos(angle)*tmp[2];
  100.              }
  101.             glUnmapBuffer(GL_ARRAY_BUFFER);//対応付けの解放
  102.         }
  103.     }
  104.     //クライアント側に戻す
  105.     glBindBuffer(GL_ARRAY_BUFFER,0);
  106.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  107. }
  108. //------- 各種コールバック----------//
  109. void display(void)
  110. {
  111.     static int angle = 0;
  112.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  113.     glLoadIdentity();
  114.     gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  115.    
  116.     glPushMatrix();
  117.     glRotatef(float(angle),1.f,0.f,0.f);//x軸回転
  118.     drawAry();
  119.     glPopMatrix();
  120.  
  121.     glutSwapBuffers();
  122.     if(++angle >= 360) angle = 0;
  123. }
  124.  
  125. void reshape(int w, int h)
  126. {
  127.     glViewport(0,0,w,h);
  128.     glMatrixMode(GL_PROJECTION);
  129.     glLoadIdentity();
  130.     gluPerspective(30.0, double(w)/h, 0.1, 200.0);
  131.     glMatrixMode(GL_MODELVIEW);
  132.     glLoadIdentity();
  133. }
  134.  
  135. void idle(void)
  136. {
  137.     glutPostRedisplay();
  138. }
  139.  
  140. void keyboard(unsigned char key, int x, int y)
  141. {
  142.     switch(key)
  143.     {
  144.     case 'q':
  145.     case 'Q':
  146.     case '\033':
  147.         //終了処理
  148.         glDeleteBuffers(3,&VboId[0]);
  149.         glDeleteBuffers(1,&VboIndex);
  150.         exit(0);
  151.         break;
  152.     }
  153. }
  154. //------ その他初期設定-------//
  155. void otherInit(void)
  156. {
  157.     glClearColor(1.f, 1.f, 1.f, 1.f);
  158.     glEnable(GL_DEPTH_TEST);
  159.     glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
  160.     glEnable(GL_COLOR_MATERIAL);
  161.     glEnable(GL_LIGHT0);
  162.     glEnable(GL_LIGHTING);
  163.     glEnable(GL_NORMALIZE);//法線の正規化
  164. }
  165.  
  166. //---- VBOの作成----//
  167. void buildVBO(void)
  168. {
  169.     glGenBuffers(3,&VboId[0]);//座標、法線、色の3つ
  170.    
  171.     //頂点
  172.     glBindBuffer(GL_ARRAY_BUFFER,VboId[0]);
  173.     glBufferData(GL_ARRAY_BUFFER,sizeof(vertexAry),
  174.                 vertexAry,GL_DYNAMIC_DRAW);//データ変更する
  175.  
  176.     //法線
  177.     glBindBuffer(GL_ARRAY_BUFFER,VboId[1]);
  178.     glBufferData(GL_ARRAY_BUFFER,sizeof(normalAry),
  179.                 normalAry,GL_DYNAMIC_DRAW);//データ変更あり
  180.  
  181.     //色
  182.     glBindBuffer(GL_ARRAY_BUFFER,VboId[2]);
  183.     glBufferData(GL_ARRAY_BUFFER,sizeof(colorAry),
  184.                     colorAry,GL_STREAM_DRAW);//データ変更なし
  185.  
  186.     //インデックス
  187.     glGenBuffers(1,&VboIndex);
  188.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,VboIndex);
  189.     glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indexAry),
  190.                     indexAry,GL_STATIC_DRAW);//データ変更なし
  191. }
  192. //----------- メイン関数------------//
  193. int main(int argc, char *argv[])
  194. {
  195.     //GLUTの初期設定
  196.     glutInit(&argc, argv);
  197.     glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
  198.     glutInitWindowSize(640,480);
  199.     glutCreateWindow("VBO Sample");
  200.     //GLEWの初期設定
  201.     GLenum err = glewInit();
  202.     if(err != GLEW_OK)
  203.     {
  204.         fprintf(stderr,"Err:%s\n",
  205.             glewGetErrorString(err));
  206.         return -1;
  207.     }
  208.  
  209.     //拡張チェック
  210.     if(!glewIsExtensionSupported(
  211.                     "GL_ARB_vertex_buffer_object")){
  212.         puts("you Can't use VBO");
  213.         return -1;
  214.     }
  215.  
  216.     //コールバック
  217.     glutDisplayFunc(display);
  218.     printf("check1\n");
  219.  
  220.     glutReshapeFunc(reshape);
  221.     printf("check2\n");
  222.     glutIdleFunc(idle);
  223.     printf("check3\n");
  224.     glutKeyboardFunc(keyboard);
  225.  
  226.     printf("check4\n");
  227.     otherInit();
  228.     printf("check5\n");
  229.     buildVBO();//VBOの作成
  230.     printf("check6\n");
  231.     glutMainLoop();
  232.     printf("check7\n");
  233.  
  234.     return 0;
  235. }
Advertisement
Add Comment
Please, Sign In to add comment