glClearColor(): 指定窗口背景 被清除为什么颜色
glOrtho(): 指定OpenGL在绘制图像中所使用的坐标系统,决定了图像如何映射到屏幕上
glFlush(): 保证绘图命令将被执行 ,而非存储在缓冲区等待其他OpenGL命令
有些OpenGL函数名最后有一个字母v,他表示这个函数所接受的参数是个指向向量或数组的指针 ,而不是一系列的单独参数 ,如:glColor3fv (color_array);
int main(int argc, char *argv[]) //argc:argument count,*argv[]指向argument数组的第一个值
{
glutInit(&argc, argv); //glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //设置显示方式
glutInitWindowPosition(100, 100); //初始化窗口位置,距屏幕左边和距屏幕上边的像素位置
glutInitWindowSize(400, 400);
glutCreateWindow("第一个OpenGL程序");
... ...
}
//以上操作会得到一个空的控制台窗口,而没有OpenGL窗口。并且控制台窗口将很快消失。为了在OpenGL窗口中能够进行渲染,我们应该制定一个渲染函数,这里我们起名为void myDisplay:
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
//上面的函数的名字你可以自己取一个。现在你必须告诉GLUT使用我们上面的函数来进行渲染,这个叫寄存回调。让我们告诉GLUT这个函数 myDisplay应该被使用:
int main(int argc, char *argv[])
{
... ...
glutDisplayFunc(&myDisplay); //寄存回调函数
glutMainLoop(); //最后一件事是告诉GLUT我们准备进入应用程序事件处理循环。GLUT提供了一个函数让程序进入一
个永不结束的循环。一直等待处理下一个事件。函数是 glutMainLoop()。
return 0;
}
-------------------------
代码(创建一个黑色为背景的窗口,在其中画一白色矩形):
#include
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("第一个OpenGL程序");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
通过part1,我们创建了一个控制台并且在OpenGL窗口中绘制了一个白色的矩形,但是当我们拉伸/缩小,最大化/最小化这个窗口时,我们会发现矩形的形状、长宽比例发生了改变,这是为什么捏?
这会发生是因为你没有正确设置投影矩阵 。默认的是透视投影矩阵且高宽比为1.因此高宽比改变了,投 影就会变形。因此只要高宽比改变了,投影就应该重新计算。
GLUT定义了当窗口大小改变时哪一个函数应该被调用。此外,这个函数还会在窗口初次被创建时调用,保证初始化窗口不是正方形的时候渲染也不会变形出错。
#include
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("第一个OpenGL程序");
glutDisplayFunc(&myDisplay);
glutReshapeFunc( changeSize );
glutMainLoop();
return 0;
}
---------------------
下面我们需要做的就是定义函数changeSize()。从glutReshapeFunc()函数的声明可以看到,changSize()函数有两个形 参。这两个参数代表新的窗口高度和宽度。
void