最終更新: mikk_ni3_92 2008年09月09日(火) 17:03:32履歴
現在地 >> メニュー >> 基本編10 >> VertexBufferObject >> VBO::まとめコード
#include <iostream> #include <cmath> #include <GL/glew.h> #include <GL/glut.h> //-------- 各種外部変数 ----------// float points[]= { 0,1,0, -0.5, 0,0, 0.5, 0,0 }; //VBO用ID GLuint VboId[1]; //----------- 関数プロトタイプ ----------------// void display(); void reshape(int w, int h); void timer(int value); void BuildVBO(); //----------- OpenGLの初期設定 ---------------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("VBO "); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutTimerFunc(0,timer,17); } bool GLEW_INIT() { GLenum err; err = glewInit(); if (err != GLEW_OK){ std::cerr << glewGetErrorString(err) << "\n"; return false; } return true; } void MY_INIT() { glClearColor(1.0, 1.0, 1.0, 1.0); } //---------- メイン関数 ---------------// int main(int argc, char **argv) { glutInit(&argc,argv); GLUT_INIT(); GLUT_CALL_FUNC(); MY_INIT(); if ( GLEW_INIT() == false){ return -1; } BuildVBO(); glutMainLoop(); return 0; } //------------- ここから各種コールバック ------------------// void display() { static float angle=0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1,0,1); //VBOで描画 glBindBufferARB(GL_ARRAY_BUFFER_ARB, VboId[0]); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, 0); //最後の引数は「0」を指定 glDrawArrays(GL_TRIANGLES , 0 , 3); glDisableClientState(GL_VERTEX_ARRAY); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glColor3f(1,1,1); glutSwapBuffers(); //アップデート glBindBufferARB(GL_ARRAY_BUFFER_ARB, VboId[0]); float *ptr = (float*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB); if(ptr) { ptr[2] = sin(angle); //1つ目の頂点、z座標を動かす angle += 0.1; if(angle > 360) angle = 0; glUnmapBufferARB(GL_ARRAY_BUFFER_ARB); } } 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 t) { glutPostRedisplay(); glutTimerFunc(t,timer,17); //タイマー関数 } //--------------------------// void BuildVBO() { glGenBuffersARB(1, &VboId[0]); //発生 glBindBufferARB(GL_ARRAY_BUFFER_ARB, VboId[0]); //バインド //データをVBOにコピー glBufferDataARB(GL_ARRAY_BUFFER_ARB, 3*3*sizeof(float), points, GL_DYNAMIC_DRAW); //例外チェック(VBOと配列のサイズがあっているか?) int bufferSize = 0; glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &bufferSize); if(3*3*sizeof(float) != bufferSize){//一致していない場合 glDeleteBuffersARB(1, &VboId[0]); VboId[0] = 0; std::cout << "Can't Create VBO\n"; } }