如下是我做的一个示例代码,具体的就不说了,程序运行需要glew和glut库,找不到这两个库的朋友可以跟我联系。
#include <stdlib.h> #include <stdio.h> #include <GL/glew.h> #include <GL/glut.h> #define VERTEX 0 #define INDICES 1 #define COLOR 2 #define NUM_BUFFERS 3 #define TIMER1 100 #define FRAMETIME 100 GLint angle = 0; GLuint buffers[NUM_BUFFERS] = {0,0}; GLfloat vertexs[][3] = { {-1, -1, -1}, {1, -1, -1}, {1, 1, -1}, {-1, 1, -1}, {-1, -1, 1}, {1, -1, 1}, {1, 1, 1}, {-1, 1, 1}, }; GLubyte indices[][4] ={ {0,1,2,3}, {4,7,6,5}, {0,4,5,1}, {3,2,6,7}, {0,3,7,4}, {1,5,6,2} }; GLfloat color[][3] ={ {1, 0, 0}, {0, 1, 0}, {0, 0, 1}, {0.5, 0, 0}, {0, 0.5, 0}, {0, 0, 0.5}, {0.5, 0.5, 0.5} }; void init(void) { glClearColor (0, 0, 0, 0); glShadeModel (GL_SMOOTH); glewInit(); //顶点 glGenBuffers(NUM_BUFFERS, buffers); //glGenBuffers(1, &bufferId); glBindBuffer(GL_ARRAY_BUFFER, buffers[VERTEX]); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*3*8, vertexs, GL_STATIC_DRAW); glVertexPointer(3, GL_FLOAT, 0, (GLvoid*)0); glEnableClientState(GL_VERTEX_ARRAY); //顶点颜色 glBindBuffer(GL_ARRAY_BUFFER, buffers[COLOR]); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*3*8, color, GL_STATIC_DRAW); glColorPointer(3, GL_FLOAT, 0, (GLvoid*)0); glEnableClientState(GL_COLOR_ARRAY); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[INDICES]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte)*24, indices, GL_STATIC_DRAW); } void display(void) { glClear (GL_COLOR_BUFFER_BIT); glLoadIdentity(); glColor4f(0, 1.0, 0, 1.0); glRotatef(angle, 0, 1.0, 0); glDrawElements(GL_QUADS, sizeof(indices)/sizeof(GLubyte), GL_UNSIGNED_BYTE, 0); glFlush (); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); glOrtho (-2, 4, -2, 4, -10, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void mouse (int button, int state, int x, int y) { } void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } void timer1(int value) { if (value != TIMER1) return; printf("value=%d\n",value); angle += 15; angle %= 360; glutPostRedisplay(); glutTimerFunc(FRAMETIME, timer1,TIMER1); //1/24 24帧 } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (350, 350); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutKeyboardFunc (keyboard); glutTimerFunc(FRAMETIME, timer1,TIMER1); //1/24 24帧 glutMainLoop(); return 0; } //附glutTimeFunc的说明: //(1)如果用定时器的话,初始的时候注册一个定时器的回调函数,原型是 // glutTimerFunc(unsigned int millis, void (*func)(int value), int value); //参数对应关系为:glutTimerFunc(毫秒数, 回调函数指针, 区别值); //(2)写自己的回调函数 void OnTimer(int value); //用value区分是哪个定时器 // (3)在函数里改变和位置有关的变量,然后调用glutPostRedisplay();用来重绘 // (4)最后再次调用glutTimerFunc,因为glut的定时器是调用一次才产生一次定时,所以如果要持续产生定时的话, // 在定时函数末尾再次调用glutTimerFunc
另外在我们获取缓冲数据的时候,需要注意的是映射完数据之后需要关闭数据映射。否则会导致数据处于不能读取的状态,导致无法正常绘制。
colorBuffer = (GLfloat*)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
for (i=0; i<24; ++i)
{
assert(colorBuffer[i] == color[i/3][i%3]);
}
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, buffers[VERTEX]);
vertexBuffer = (GLfloat*)glMapBuffer(GL_ARRAY_BUFFER,GL_READ_ONLY);
for (i=0; i<24;++i)
{
assert(vertexBuffer[i] == vertexs[i/3][i%3]);
}
glUnmapBuffer(GL_ARRAY_BUFFER);
glMapBuffer需要和glUnmapBuffer结合起来使用。