配置基本实验环境、安装软件包、建立工程和绘制基本图元,要求学会点、线、三角形、四边形的绘制方法,学会消息传递和响应机制,用一个实例完成上述要求。
1、配置OpenGL绘图环境;
2、绘制点、线、三角形、四边形等基本图元。
以Visual Studio 2019为开发环境,合理配置第三方glut相关文件(部署glut头文件、glut动态链接库、glut.lib类型库),并且使用OpenGL的基本绘制模式(包括GL_LINES、GL_POINTS、GL_TRIANGLES、GL_QUADS等)进行基本图形的绘制。
1、配置OpenGL绘图环境
① 选择Visual Studio 2019为开发环境,获取glut相关文件(这里用的是老师给的,也可以在官网下载glut压缩包),包括glut.h、glut.dll、glut32.dll、glut32.lib四个文件;
② 将glut.h拷贝进VS安装目录下的include\GL文件夹内,这里笔者的路径是
D:\Tools\Visual Studio 2019\VS IDE\VC\Tools\MSVC\14.28.29333\include\GL;
③ 将glut.lib拷贝进VS安装目录下lib\x86文件夹内,这里笔者的路径是
D:\Tools\Visual Studio 2019\VS IDE\VC\Tools\MSVC\14.28.29333\lib\x86;
④ 将两个.dll文件(glut.dll、glut32.dll)拷贝进系统目录,基于自己的系统是64位的windows10,将这两个动态链接库文件同时拷贝进C:\Windows\System32目录和 C:\Windows\SysWOW64目录,到此所有配置基本完成;
⑤ 进行配置试验,在VS 2019内新建一个空项目,向项目内添加一个测试用的源文件并运行,这里注意到windows环境下有时包含Windows.h头文件是有必要的,不然可能运行失败。
2、绘制点、线、三角形、四边形等基本图元。
① 将上述新建的工程中添加的文件设置从生成中排除以免多个main函数导致出错;
② 工程内新建一个空白源文件,包含必要的头文件如Windows.h、GL\glut.h等并写出main函数;
③ 搭好main函数和展示函数的框架,即在main函数中添加绘制必备的几个基本步骤,包括初始化函数glutInit()
、绘制模式选择函数glutInitDisplayMode()
、窗体大小设置函数glutInitWindowSize()
、创建窗口函数glutCreateWindow()
、注册函数glutDisplayFunc()
、消息循环函数glutMainLoop()
等,并且写出display函数(即等待被注册的函数);
④ 在display
函数中进行绘制,display
函数中可以进行多次绘制(主要是更改缓冲区内容),最后使用glFlush函数将缓冲区的内容刷新到屏幕上进行显示即可。其中每次绘制的基本步骤是先通过glBegin()
函数的参数确定绘制的基本图元类型,在glBegin()
、glEnd()
函数包含的代码段内,使用glVertex2d确定图形的基本要素(由于这里主要是点、线、三角形和四边形,所以只需确定其顶点或者起始终止位置点即可);
⑤ 最后将完成的display
函数通过注册函数glutDisplayFunc(display)
进行注册,将几何形状画进画布(重绘消息),运行程序检验结果。
实验输出图(文字部分是解释):
在没有显式地进行设置的情况下,glVertex2d(x, y)
函数的参考坐标位于窗口正中央;OpenGL glut默认的窗口显示范围只有[-1,1];图形绘制的颜色(前景色)、直线的绘制类型等具有延迟性,即更改之后除非下次再更改或者清除效果,否则值会一直保持下去。
源码:
#include
#include
#include
#include
void display(void) {
glClearColor(0, 0, 0, 0);//设定清除窗口的颜色
glClear(GL_COLOR_BUFFER_BIT);//执行清除窗口的指令
glColor3f(1.0, 1.0, 1.0);//指定绘制图形的颜色(前景色)
glLineWidth(3.0);
glBegin(GL_LINES);
glVertex2f(-0.5, 0.75);
glVertex2f(0.5, 0.75);//绘制线,指定起点与终点
glEnd();
glEnable(GL_LINE_STIPPLE);
glLineStipple(1, 0x00FF);//dashed
glLineWidth(3.0);
glBegin(GL_LINES);
glVertex2f(-0.5, 0.65);
glVertex2f(0.5, 0.65);//绘制线,指定起点与终点
glEnd();
glLineStipple(1, 0x0101);//dotted
glLineWidth(3.0);
glBegin(GL_LINES);
glVertex2f(-0.5, 0.7);
glVertex2f(0.5, 0.7);//绘制线,指定起点与终点
glEnd();
glBegin(GL_POINTS);
glVertex2d(-0.5, -0.5);
glVertex2d(-0.5, 0.5);
glVertex2d(0.5, 0.5);
glVertex2d(0.5, -0.5);//绘制四个点
glEnd();
glBegin(GL_TRIANGLES);//绘制三角形,指定三个点为顶点
glVertex2d(-0.5, 0.0);
glVertex2d(0.0, 0.5);
glVertex2d(0.0, 0.0);
glEnd();
glBegin(GL_QUADS);//绘制四边形,指定四个点为顶点
glVertex2d(0.0, 0.0);
glVertex2d(0.3, 0.0);
glVertex2d(0.3, -0.3);
glVertex2d(0.0, -0.3);
glEnd();
glFlush();//将缓冲区的内容刷新到屏幕上进行显示
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);// 设定初始时窗口的大小
glutInitWindowPosition(100, 100);// 设定初始时窗口的位置
glutCreateWindow("exp1");// 创建窗口,命名为exp1
glutDisplayFunc(display);//画图函数,将几何形状画进画布(重绘消息),同时这也是注册函数
glutMainLoop();//进入消息循环
return 0;
}
第一方面的困难来自环境的选择与配置。因为自己之前从未用过Visual Studio的系列版本,写C++程序一般用Code::Blocks或者Dev C++,因此在实验的时候并未使用Visual Studio而是选择的Code::Blocks进行配置,并且上网查找了配置的相关资料,虽然步骤正确但是一直没有配置成功。折腾了一上午,最后自己发现网上的教程大多都是2019年以前的,找到一篇2020年的博客,博主提供的原因是2020.03版本的Code::Blocks在查找动态链接库的时候会选择性忽略GLUT.LIB文件和两个.DLL文件,所以一直无法成功运行,但是17年的版本没有这个问题。然而17年的版本不太好安装,最后干脆选择使用Visual Studio 2019并成功完成了配置。
第二方面是因为自己对OpenGL绘图的基本流程还不是很清楚。这就像我们刚开始学C++程序设计时需要学习如何写一个简单的Hello World程序一样,控制台程序有一个基本的流程(虽然后期可能不太一定按照这个流程来),OpenGL编程也是这样。在查阅了一些相关的简单绘制程序的博客之后也解决了这个问题。