跳转到内容

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),无论窗口位置如何

华夏公益教科书