小白学opengl之显示回调函数与reshape回调函数

来源:互联网 发布:安卓变声软件 编辑:程序博客网 时间:2024/05/22 12:28

过去一直不理解diplay和reshape回调函数的调用看完下面这个例子会明白,每次reshape其实都会调用display。reshape主要负责重置坐标系统和投影矩阵

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <GL/glut.h>#include <GL/glu.h>using namespace std;void init(){printf("use init\n");glClearColor(0, 0, 0, 0);glShadeModel(GL_FLAT);}void display(){printf("use display\n");glClear(GL_COLOR_BUFFER_BIT);glColor3f(1, 1, 1);glLoadIdentity();gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);//glScalef(1, 2, 1);glutWireCube(1);glFlush();}void reshape(int w, int h){//glViewport(0, 0, (GLsizei)w, (GLsizei)h);printf("width:%d,heigth:%d\n",w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-1, 1, -1, 1, 1.5, 20);glMatrixMode(GL_MODELVIEW);}int main(int argc, char* argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow("GLdemo");init();glutDisplayFunc(display);glutReshapeFunc(reshape);//glutMouseFunc(mouse);//glutKeyboardFunc(keyboard);//glutMotionFunc(move);//glCreateMenu();glutMainLoop();return 0;}
use init
width:500,heigth:500
use display
use display


width:502,heigth:500
use display
width:503,heigth:500
use display
width:505,heigth:500
use display


看终端结果可知,createwindow后 无论 main函数中reshape和display代码顺序如何,都是先调用reshape回调函数后再调用display

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <GL/glut.h>#include <GL/glu.h>using namespace std;void init(){printf("use init\n");glClearColor(0, 0, 0, 0);glShadeModel(GL_FLAT);}void display(){printf("use display\n");glClear(GL_COLOR_BUFFER_BIT);glColor3f(1, 1, 1);glLoadIdentity();gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);//glScalef(1, 2, 1);glutWireCube(1);glFlush();}void reshape(int w, int h){//glViewport(0, 0, (GLsizei)w, (GLsizei)h);printf("width:%d,heigth:%d\n",w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-1, 1, -1, 1, 1.5, 20);glMatrixMode(GL_MODELVIEW);}int main(int argc, char* argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow("GLdemo");init();glutReshapeFunc(reshape);glutDisplayFunc(display);//glutMouseFunc(mouse);//glutKeyboardFunc(keyboard);//glutMotionFunc(move);//glCreateMenu();glutMainLoop();return 0;}
use init
width:500,heigth:500
use display

display回调函数就不会调用两次

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <GL/glut.h>#include <GL/glu.h>using namespace std;void init(){printf("use init\n");glClearColor(0, 0, 0, 0);glShadeModel(GL_FLAT);}void display(){printf("use display\n");glClear(GL_COLOR_BUFFER_BIT);glColor3f(1, 1, 1);glLoadIdentity();gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);//glScalef(1, 2, 1);glutWireCube(1);glFlush();}void reshape(int w, int h){//glViewport(0, 0, (GLsizei)w, (GLsizei)h);printf("width:%d,heigth:%d\n",w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-1, 1, -1, 1, 1.5, 20);glMatrixMode(GL_MODELVIEW);}int main(int argc, char* argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow("GLdemo");glutReshapeFunc(reshape);glutDisplayFunc(display);init();//glutMouseFunc(mouse);//glutKeyboardFunc(keyboard);//glutMotionFunc(move);//glCreateMenu();glutMainLoop();return 0;}

可以看出init()最先调用,虽然init不是glut里的库函数

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <GL/glut.h>#include <GL/glu.h>using namespace std;void init(){printf("use init\n");glClearColor(0, 0, 0, 0);glShadeModel(GL_FLAT);}void display(){printf("use display\n");glClear(GL_COLOR_BUFFER_BIT);glColor3f(1, 1, 1);glLoadIdentity();gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);//glScalef(1, 2, 1);glutWireCube(1);glFlush();}void reshape(int w, int h){//glViewport(0, 0, (GLsizei)w, (GLsizei)h);printf("width:%d,heigth:%d\n",w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-1, 1, -1, 1, 1.5, 20);glMatrixMode(GL_MODELVIEW);}int main(int argc, char* argv[]){printf("glutInit\n");glutInit(&argc,argv);printf("glutInitDisplayMode\n");glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);printf("glutInitWindowSize\n");glutInitWindowSize(500, 500);printf("glutInitWindowPosition\n");glutInitWindowPosition(100, 100);printf("glutCreateWindow\n");glutCreateWindow("GLdemo");printf("glutReshapeFunc\n");glutReshapeFunc(reshape);printf("glutDisplayFunc\n");glutDisplayFunc(display);printf("init\n");init();//glutMouseFunc(mouse);//glutKeyboardFunc(keyboard);//glutMotionFunc(move);//glCreateMenu();printf("glutMainLoop\n");glutMainLoop();return 0;}
glutInit
glutInitDisplayMode
glutInitWindowSize
glutInitWindowPosition
glutCreateWindow
glutReshapeFunc
glutDisplayFunc
init
use init
glutMainLoop
width:500,heigth:500
use display



0 0