目的:绘制新场景时一般需要将背景清除为某一种颜色。
函数:glClearColor(R,G,B,alpha);//设置当前清除颜色
glClear(Buffer Name);//颜色缓冲区:GL_COLOR_BUFFER_BIT; 深度缓冲区:GL_DEPTH_BUFFER_BIT;
累积缓冲区:GL_ACCUM_BUFFER_BIT; 模板缓冲区:GL_STENCIL_BUFFER_BIT。
对每一个想要清除的缓冲区都需要设置相应的清除值,颜色就是glClearColor();深度是glClearDepth();按照此命名方式以此类推。
可以同时清除多个缓冲区,在glClear( )中将Buffer的名字用“|“连接,表示逻辑or。同时清除缓冲区往往会比线性清除缓冲区高效。
例子:同时清除 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
线性清除 glClear(GL_DEPTH_BUFFER_BIT);
glClear(GL_COLOR_BUFFER_BIT);
因为OpenGL是状态机,所以每一次绘制一个物体或场景时就需要设置一次需要的颜色。这里只学习简单的设置颜色,不考虑光照条件等。现在只考虑设置当前颜色。
函数:glColor4f(R,G,B,alpha);//函数名的命名很有意思,glColor(表示对颜色的设置)+3|4(表示参数个数,4个参数时多了alpha)+f(表示参数类型是浮点数)
常用的OpenGL颜色值://现在暂时不考虑alpha的值。
黑色0.0 0.0 0.0
红色1.0 0.0 0.0
绿色0.0 1.0 0.0
蓝色0.0 0.0 1.0
黄色1.0 1.0 0.0
青色0.0 1.0 1.0
白色1.0 1.0 1.0
目的:强制刷新,保证绘图命令将被执行而不是在缓冲区中等待。
函数:
glFlush(void);//有时图画不出来,用flush强制冲出来。强制以前所发出的OpenGL命令开始执行。
glFinish(void);//强制以前所发出的OpenGL命令完成执行。
在刚打开窗口、移动和改变窗口大小时,计算机都需要重新绘制一次刚刚绘制的图形,这就需要重新调用一次刚刚绘制这个图形的代码。也就是说应该把重绘场景所需要的所有的代码放到回调函数里。
上面说的过程,GLUT会自动执行,只需在glutReshapeFunc()中注册回调函数。
Reshape回调函数
void reshape(int w, int h) {具体见课本}
上课的时候老师演示程序,在回调函数reshape()那里设置了断点,在一开始绘制图形时,程序运行到这一行时就会停下,在调整窗口大小或者移动窗口时也会在设置的断点处停下。问过师姐之后才回忆起来。好像对这个回调函数理解了。之后应该自己调试一下,设置一下断点,看一下是不是这么一回事。
程序练习1:
// GL_ex1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<glut.h> void display()//在这里添加断点 { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,1.0,0.0); glBegin(GL_POLYGON); glVertex3f(0.25,0.25,0.0); glVertex3f(0.75,0.25,0.0); glVertex3f(0.75,0.75,0.0); glVertex3f(0.25,0.75,0.0); glEnd(); glFlush(); } void init() { glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0); } int _tmain(int argc, char** argv)//修改了这里面的参数 { glutInit(&argc,argv);//这里是什么意思? glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(250,250); glutInitWindowPosition(100,100); glutCreateWindow("ex1"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }