- 清除窗口 Clear the window
目的:绘制新场景时一般需要将背景清除为某一种颜色。
函数: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);
- 指定颜色 Specifying a Color
因为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
- 强制完成绘图操作 Forcing Completion of Drawing
目的:强制刷新,保证绘图命令将被执行而不是在缓冲区中等待。
函数:
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;
}