前言:
参考《opengl编程指南》第四版
环境搭建:
参考:https://leon1741.blog.csdn.net/article/details/81411382
程序
这是一个使用了双缓存显示一个旋转的正方形的例子,可以通过鼠标停止和开始旋转。
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <X11/Xlib.h>
static GLfloat spin = 0.0;
void init(void){
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
void display(void){
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(spin, 0, 0, 1.0);
glColor3f(1.0, 1.0, 1.0);
glRectf(-25,-25,25,25);
glPopMatrix();
glutSwapBuffers();
}
void spinDisplay(void){
spin += 2.0;
if(spin > 360){
spin -= 360;
}
glutPostRedisplay();
}
void reshape(int w, int h){
glViewport(0,0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50, 50, -50, 50, -1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void mouse(int button, int state, int x, int y){
switch(button){
case GLUT_LEFT_BUTTON:
if(state == GLUT_DOWN){
glutIdleFunc(spinDisplay);
}
break;
case GLUT_MIDDLE_BUTTON:
if(state == GLUT_DOWN){
glutIdleFunc(NULL);
}
break;
default:
break;
}
}
int main(int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(250, 250);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
编译:
gcc double.c -o double -lGL -lGLU -lglut
编译过后,运行double可执行程序,发现什么都没有,淦。
ok,别着急,治它。
在spinDisplay中加入一条代码,打印spin的值
printf("spin: %f\n", spin);
在弹出的窗口中按下鼠标左键后,可以看到控制台有log输出。
ok,发现原因了,是矩形的坐标没有设置正确,在display,修改
glRectf(-25,-25,25,25);
为
glRectf(0,0,25,25);
再次编译,可以看到旋转的正方形。
齐活。