OpenGL 编程/基础/矩形
回顾上一章,我们介绍了 OpenGL/GLUT 应用程序的基本结构。
#ifndef WIN32 //if using windows then do windows specific stuff. #define WIN32_LEAN_AND_MEAN //remove MFC overhead from windows.h which can cause slowness #define WIN32_EXTRA_LEAN #include <windows.h> #endif #include <GL/gl.h> #include <GL/glut.h> #include <GL/glu.h> #include <conio.h>//needed for getch void setup() { /* empty function nothing to setup yet */ } void display() { /* empty function required as of glut 3.0 */ } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); glutInitWindowSize(800,600); glutCreateWindow("Hello World"); setup(); glutDisplayFunc(display); glutMainLoop(); getch();//pause here to see results or lack there of return 0; }
现在,我们将在 setup() 和 display() 函数中添加一些内容,以便绘制一个矩形。
在 setup 函数中添加一行
void setup() { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); }
使用这些参数调用 glClearColor() 将更改背景颜色为白色。暂时,我们将保留此行,不进行解释。稍后我们将回到 1.0f 的含义。
为了让我们能够绘制,GLUT 需要在每次工作时清除屏幕。这通过两个函数完成,一个在 display 函数的开头,另一个在结尾。
void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* drawing commands would go here, if we had any yet... */ glutSwapBuffers(); }
通过使用 glClear(),我们获得了一个干净的画布来工作;之前缓冲区(存储渲染图像的内存位置)中的所有内容都消失了。现在我们使用了一个新的缓冲区,所以在函数结束时,我们需要将该缓冲区切换到我们的窗口中。在 GLUT 中,这是通过调用 glutSwapBuffers() 来完成的。
如果你还不完全理解这两个函数为什么存在,请不要担心。你会有时间学习的。
让我们添加一个函数到 display,它将为我们提供一个简单的矩形。
void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f); glRectf(-0.75f,0.75f, 0.75f, -0.75f); glutSwapBuffers(); }
再次忽略 glColor3f() 的参数。现在只需要相信我们,这将使我们的矩形变成黑色,以便我们可以在白色背景上看到它。然后,我们使用 glRectf() 函数实际绘制矩形。我们向 glRectf() 传递两个参数集:要绘制的矩形的一个顶点的 x 和 y 坐标,以及另一个相对顶点的 x 和 y 坐标。需要注意的是,这些 x 和 y 坐标不是用像素表示的,而是用视口坐标表示的。
你会注意到,如果你使用上面的 display 函数编译并运行程序,然后调整窗口大小,你的矩形会随着窗口的大小而增长和缩小。在这个例子中,矩形将占用窗口宽度和高度的 75%。这是因为我们没有设置视口。
视口定义了如何将使用浮点数的 OpenGL 空间中的坐标映射到使用像素的窗口空间。默认情况下,视口假设左上角为 (-1, 1),左下角为 (-1, -1),右上角为 (1, 1),右下角为 (1, -1),无论窗口位置如何。